Ora ci provo, anche solo per imparare ad usare l'LCD.
Prima cosa: quali sono le procedure giuste per scrivere sul LCD senza che le lettere sfarfallino? Immagino che questo sia dovuto al fatto che a ogni ciclo va a scrivere il valore, infatti se metto un delay si vede molto meglio. In pratica, se devo scrivere un valore che cambia spesso come devo fare?
Ho cercato in rete ma ho trovato solo le solite cose e nulla che spieghi esattamente i "trucchi" da usare per avere un programma ben funzionale.
Urgono consigli :-)
C
Claudio_F
Il 24/10/19 18:43, Drizzt do'Urden ha scritto:
Bisogna scrivere solo quando c'e` qualcosa di nuovo/diverso dal giro precedente.
D
Drizzt do'Urden
Il 24/10/2019 19:08, Claudio_F ha scritto:
Per fare questo si usa un if per fare il confronto con i valori?
C
Claudio_F
Il 24/10/19 19:20, Drizzt do'Urden ha scritto:
Essi`.
La lettura attuale la confronti con la precedente (ok, solo al primissimo giro non ci sara` una precedente), se diversa fai quello che serve e attualizzi lettura precedente a lettura attuale, cosi` la lettura attuale diventa la precedente per giro successivo.
D
Drizzt do'Urden
Il 24/10/2019 19:37, Claudio_F ha scritto:
Sto provando ma comunque ogni ciclo scrive sul LCD e la scritta
quando non cambia.
D
Drizzt do'Urden
Il 24/10/2019 19:37, Claudio_F ha scritto:
Ok, ho risolto in modo diverso altrimenti si aggiornava sempre, magari
int finecorsaCH_lcd = 0; // variabile per scrivere lo stato del finecorsa chiuso sul LCD
int finecorsaAP_lcd = 0; // variabile per spegnere la scritta dello stato del fine corsa sul LCD
finecorsaCH_lcd++; //inizia il conteggio della varibile
if ((digitalRead(finecorsa) == LOW)&& (finecorsaCH_lcd > 200)) //se il
{ lcd.setCursor(8,0); // allora scrive sul lcd lcd.print(" "); // prima pulisce lo spazio dove scrivere lcd.setCursor(8,0); lcd.print("Tenda Chiusa"); // poi scrive finecorsaCH_lcd = 0; //poi rimette la variabile a 0 } // tutto questo per aggiornare la scrittura ogni 200 cicli ed evitare lo sfarfallio
if (digitalRead(finecorsa) == HIGH) finecorsaAP_lcd++;
questo lo faccio sempre, non si sa mai, avere file dei deiversi step di avanzamento aiuta in caso di dover tornare sui propri passi senza impazzire. :-)
questo l'ho fatto
E qui viene il complicato (per me), tutti gli esperimenti che ho fatto, alla fine non riesco a mantenere il
Non so se mi sono spiegato :-)
esempio:
if (stato_AP == HIGH) precedente_millis = millis();
if ((millis() - precedente_millis) > 500))
"scrivi sul LCD"
precedente_millis = millis()
precedente_millis viene sempre aggiornato quindi la sottrazione non
Sbaglio ragionamento?
D
Drizzt do'Urden
Il 25/10/2019 16:17, LAB ha scritto:
per ora mi trovo meglio con voi :-)
Comunkque, alla fine funziona tutto, ho aggiunto il display e lavora bene, ho anche mappato l'ingresso della fotoresistenza per rendere i
Per ora sono soddisfatto, unico difetto, utilizzando l'alimentazione della USB del pc, se accendo la luce neon del laboratorio, qualche volta
nel circuito, spero che con un'alimentazione filtrata bene, nel circuito finale, non succeda. Magari tutti quei fili sulla bread board attirano disturbi.
C
Claudio_F
Il 25/10/19 16:34, Drizzt do'Urden ha scritto:
Beh, no, non sarebbe normale :D
Ma impazzisce solo l' LCD o anche Arduino? (sarebbe grave)
Sicuramente la filatura volante su bread non e` il massimo.
Ma parliamo di LCD parallelo? Seriale i2c?
Potrebbe bastare una R pull-up da 1k sul pin E dell'LCD con un condensatore 100nF verso massa per rendere quella linea meno disturbabile.
D
Drizzt do'Urden
Il 26/10/2019 12:43, Claudio_F ha scritto:
buona notizia :-)
solo l'LCD
parallelo
Ok, provo :-)
Saluti da Drizzt.
www.agidone.altervista.org
http://www.tappezzeriagraziella.com/
MAI PIU' OPEL IN VITA MIA!!!!
D
Drizzt do'Urden
Il 26/10/2019 16:55, LAB ha scritto:
Si, il problema lo da sia con l'alimentazione della USB che quella dell'alimentatore stabilizzato. Saranno sicuramente tutti quei fili
Ogni volta che credo di aver finito mi viene in mente qualcos'altro da
mi infamate :-P
formatting link
C
Claudio_F
Il 26/10/19 23:28, Drizzt do'Urden ha scritto:
Perche' i rele' comandati sull'emettitore?
D
Drizzt do'Urden
Il 27/10/2019 08:42, Claudio_F ha scritto:
Non vi sfugge niente :-)
anni che non creo un progettino, direi almeno 10, e sul momento
collettore ma non avendo ancora iniziato a fare lo schema sul pc non l'ho modificato.
il sistema che ho usato per temporizzare sia le scritte che l'accensione
sempre visto che in un caso incrementa sempre il valore anche quando non sta facendo nulla, volevo usare millis ma non sono riuscito a trovare la maniera.
In pratica vorrei contare il tempo di accensione del LCD solo dopo che
base al caso specifico in cui va a ON, quindi inizio il conteggio quando lo stato va a OFF.
ho usato il classico "conta++" e quando arriva al valore impostato esegue il codice.
precedente viene sempre aggiornato, essendo la condizione di OFF permanente.
// PARTE PER ACCENSIONE E SPEGNIMENTO ILLUMINAZIONE LCD
if ((digitalRead (rele_AP) == HIGH) != (digitalRead (rele_CH) == HIGH))
{ analogWrite(illumina_lcd, 100); //accende l'LCD col PWM a 100% azzera il contatore di accensione tempo_illumina=0; } if ((digitalRead(rele_AP)==LOW)&(digitalRead(rele_CH)==LOW))//in seguito
tempo_illumina++; //inizia il conteggio del tempo
if (tempo_illumina >= 1000) //quando raggiunge il valore settato {
azzera nuovamente il contatore tempo_illumina=0; //in questa maniera, il tempo di accensione parte
} //per avere sempre lo stesso tempo di accensione dopo la fine di un comando
zero.
Saluti da Drizzt.
www.agidone.altervista.org
http://www.tappezzeriagraziella.com/
MAI PIU' OPEL IN VITA MIA!!!!
D
Drizzt do'Urden
Il 27/10/2019 10:28, LAB ha scritto:
Saluti da Drizzt.
www.agidone.altervista.org
http://www.tappezzeriagraziella.com/
MAI PIU' OPEL IN VITA MIA!!!!
D
Drizzt do'Urden
Il 27/10/2019 10:22, LAB ha scritto:
ahhhhhhh, ora forse ho capito, non riuscivo a comprendere come non far aggiornare continuamente t1.
Ma comunque aggiornare sempre 't1' non e` necessariamente un problema, il tutto si puo` semplificare con il codice seguente (e` importanissimo l' 'else'):
if (stato_AP == HIGH) { t1 = millis(); // aggiorna sempre tempo digitalWrite(accendi_lcd, HIGH); // acceso } else if ((millis() - t1) > TEMPO) { digitalWrite(accendi_lcd, LOW); // spento }
Se poi ragioni a situazioni 'S' descrivere logiche e sequenze anche complesse diventa semplice:
if ((1 == s) && releAcceso()) { accendiLCD(); s = 2; } else if ((2 == s) && !releAcceso()) { t = millis(); s = 3; } else if ((3 == s) && releAcceso()) { s = 2; } else if ((3 == s) && (millis()-t > TEMPO)) { spegniLCD(); s = 1; }
D
Drizzt do'Urden
Il 27/10/2019 13:03, Claudio_F ha scritto:
a essere sincero non ho ancora compreso esattamente come funzionano, fin'ora, a forza di tentativi, le ho messe bene ma non ho trovato nulla in rete che le spieghi bene.
ci devo studiare sopra, ora vado a pranzo che a panza piena si ragiona meglio :-)
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.