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.
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.
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
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.
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
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; }
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 :-)
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.