Buongiorno a tutti, spero di star scrivendo nel posto giusto (sono nuovo del forum, mi sono presentato ma non conosco bene il sito).
Sto costruendo un mini-frigo per la maturità, una cella di Peltier connessa a delle ventole, tutto controllato da arduino. collegando però l'LCD ad arduino e facendo partire il programma mi viene fuori la scritta che ho impostato io (offline) e in ogni altro spazio disponibile dell'LCD mi inizia un contatore infinito (simile a quello di Hello world. Chiedendo ad un mio amico mi ha risposto che non ho usato lcd.clear() ma anche usandolo non cambia niente, posto di seguito il programma.
#include <LiquidCrystal.h>
#define pin_temp A0
int bt1_pin = 13;
boolean bt1_st = true;
boolean bt1_flag;
int bt2_pin = 6;
boolean bt2_st = true;
boolean bt2_flag;
int bt3_pin = 10;
boolean bt3_st = true;
boolean bt3_flag;
int schermata = -1;
int fps = 10;
int periodo;
unsigned long timer;
boolean aggiorna;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
float temp = 0;
float TempMax = 20;
float TempMin = 10;
void setup() {
Serial.begin(9600);
periodo = 1000 / fps;
lcd.begin(16, 2);
analogReference(INTERNAL);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(bt1_pin, INPUT_PULLUP);
pinMode(bt2_pin, INPUT_PULLUP);
pinMode(bt3_pin, INPUT_PULLUP);
lcd.print(millis() / 500);
}
void loop() {
temp = 0;
for (int i = 0; i < 5; i++) {
temp = (4.4 * analogRead(pin_temp) * 100.0) / 1024.0;
}
temp = temp/ 5;
/*************************PULSANTI*******************************
questa sezione legge se sono stati premuti dei pulsanti
e nel caso da in uscita delle variabili vere per un solo ciclo
-bt1_flag -bt2_st -bt3_st
****************************************************************/
boolean bt1 = digitalRead(bt1_pin);
bt1_flag = false;
if ((bt1 != bt1_st) && (bt1 == 1)) {
schermata++;
schermata = (schermata) % 3;
Serial.print(schermata);
}
bt1_st = bt1;
boolean bt2 = digitalRead(bt2_pin);
bt2_flag = false;
if ((bt2 != bt2_st) && (bt2 == 1)) {
bt2_flag = true;
}
bt2_st = bt2;
boolean bt3 = digitalRead(bt3_pin);
bt3_flag = false;
if ((bt3 != bt3_st) && (bt3 == 1)) {
bt3_flag = true;
}
bt3_st = bt3;
/*****************************FINE PULSANTI********************/
/*************************SCHERMATA LCD**************************
questa sezione scrive sull'LCD le informazioni
sulle temperature in base alla variabile
-schermata
****************************************************************/
if (millis() - timer > periodo) {
timer = millis ();
aggiorna = true;
}
if (aggiorna) {
aggiorna = false;
lcd.clear(); //funzione per cancellare tutto lo schermo che non so perchè non hai usato LOL
switch (schermata) {
case -1:
lcd.setCursor(0, 1);
lcd.print("offline ");
/*TODO funzione per spegnere schermo*/
break;
case 0:
lcd.setCursor(0, 0);
lcd.print("temperatura:");
lcd.setCursor(0, 1);
lcd.print(temp);
lcd.print(" C ");
delay(500);
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("Hai scelto");
lcd.setCursor(0, 1);
lcd.print("TempMax ");
lcd.print(TempMax);
lcd.print(" C ");
if (bt2_flag) {
TempMax += 0.5;
} else {
if (bt3_flag) {
TempMax - 1;
}
}
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Hai scelto");
lcd.setCursor(0, 1);
lcd.print("TempMin ");
lcd.print(TempMin);
lcd.print(" C ");
if (bt2_flag) {
TempMax += 0.5;
} else {
if (bt3_flag) {
TempMax - 1;
lcd.setCursor(12, 1);
}
}
break;
}
}
}
In conformità al suddetto regolamento, punto 13, il cross-posting è proibito (anche tra lingue diverse) e tu hai posto la stessa domanda, per di più scrivendo in Italiano (cosa che NON è permessa) in una sezione Inglese del forum !
Tale tuo thread duplicato è stato quindi cancellato, per cui ... prosegui qui la discussione. Grazie.
Altro problema, il sensore di temperatura non mi mostra sull'lcd il cambio di temperatura, cosa può essere? cambio il codice sopra elencato con quello attuale
gpb01:
... detto questo ... guarda la prima riga che si trova subito all'inizio del loop() ... capirai il perché del problema che lamenti.
Ma veramente non ho capito quale sia esattamente il problema che lui lamenta, lui ha messo un controllo con millis() ed in base a questo scrive sull'LCD le informazioni ad intervalli regolari.
Il problema è che ha messo una variabile "fps" che indica il numero di aggiornamenti al secondo e che vale 10 ma il tempo di attesa lo imposta con:
periodo = 1000 / fps;
per cui aggiorna ben 10 volte al secondo il che è troppo per la latenza dei cristalli liquidi di questi display.
Quantomeno dovrebbe mettere 1 o 2 al massimo.
Seconda cosa, il clear() dovrebbe farlo solo al cambio di tipologia di schermata, mentre l'aggiornamento va fatto solo per i valori posizionando direttamente il cursore nei punti specifici.
Ma uno il progetto per la MATURITA' lo deve per forza realizzare il giorno (o qualche giorno prima) della maturità? Pensarci un pochino prima no, eh? (si, vabbè, anche noi eravamo così, ma credevo che l'essere umano nel frattempo si fosse evoluto...)
steve-cr:
... ma credevo che l'essere umano nel frattempo si fosse evoluto...)
Io, fra asocial-networks, zombies dello smartphone e lavaggio del cervello telecalcistico, ho invece l'impressione che si sia DE-evoluto, guardandomi in giro ...
docdoc:
Ma veramente non ho capito quale sia esattamente il problema che lui lamenta, lui ha messo un controllo con millis() ed in base a questo scrive sull'LCD le informazioni ad intervalli regolari.
Il problema è che ha messo una variabile "fps" che indica il numero di aggiornamenti al secondo e che vale 10 ma il tempo di attesa lo imposta con:
periodo = 1000 / fps;
per cui aggiorna ben 10 volte al secondo il che è troppo per la latenza dei cristalli liquidi di questi display.
Quantomeno dovrebbe mettere 1 o 2 al massimo.
Seconda cosa, il clear() dovrebbe farlo solo al cambio di tipologia di schermata, mentre l'aggiornamento va fatto solo per i valori posizionando direttamente il cursore nei punti specifici.
il problema è che il sensore di temperatura rileva solo la temperatura iniziale, appena attacco l'usb, non varia. ho cambiato come suggerisci tu e ho messo fps=2. riguardo al lcd.clear non ho capito molto bene cosa hai scritto
DoubleM:
il problema è che il sensore di temperatura rileva solo la temperatura iniziale, appena attacco l'usb, non varia.
Questo è un altro problema, allora, sembra più qualcosa legato all'hardware.
Posta esattamente lo schema dei tuoi collegamenti e vediamo.
riguardo al lcd.clear non ho capito molto bene cosa hai scritto
Se tu fai sempre lcd.clear() cancelli tutto lo schermo e poi devi ridisegnarlo. Questo induce uno "sfarfallio" che in casi normali può essere solo fastidioso, per aggiornamenti relativamente rapidi dello schermo diventa estremamente fastidioso, fino a rendere quasi impossibile leggere ciò che scrivi se lo fai molto velocemente.
Quindi usi il clear() solo quando devi cambiare tipologia di schermata, poi gli aggiornamenti li fai andando a scrivere solo i nuovi valori, direttamente alla posizione dove li devi mostrare.
docdoc:
Questo è un altro problema, allora, sembra più qualcosa legato all'hardware.
Posta esattamente lo schema dei tuoi collegamenti e vediamo.
Se tu fai sempre lcd.clear() cancelli tutto lo schermo e poi devi ridisegnarlo. Questo induce uno "sfarfallio" che in casi normali può essere solo fastidioso, per aggiornamenti relativamente rapidi dello schermo diventa estremamente fastidioso, fino a rendere quasi impossibile leggere ciò che scrivi se lo fai molto velocemente.
Quindi usi il clear() solo quando devi cambiare tipologia di schermata, poi gli aggiornamenti li fai andando a scrivere solo i nuovi valori, direttamente alla posizione dove li devi mostrare.
Vi rimando al link del mio tinkercad, ho copiato essattamente ciò che c'è simulato:
ma il controllo della temperatura sul pin a0 come lo fai? cioè che sensore usi?
hai usato il riferimento interno quindi lavori tra 0V e 1,1V
ma la formula che usi è questa
Patrick_M:
ma il controllo della temperatura sul pin a0 come lo fai? cioè che sensore usi?
hai usato il riferimento interno quindi lavori tra 0V e 1,1V
ma la formula che usi è questa
DoubleM:
Vi rimando al link del mio tinkercad, ho copiato essattamente ciò che c'è simulato:
Eh, ok, quello scrive i secondi sulla riga 1 del display, non usi clear() e va bene, scrivi solo il valore nella posizione prefissata, e anche questo è ok, quindi qual è la domanda?
Se non riguarda la gestione dell'LCD (ma hai quotato questo, quindi pensavo al clear) ma è relativa alla lettura della temperatura, dovresti simulare anche quella ed implementare il relativo codice.
PS su tinkercad ricorda che millis() è in centesimi non millesimi, quindi per avere i secondi devi fare millis()/100 e non millis()/1000.