Salve a tutti, sto cercando di realizzare un piccolo progetto con un display LCD 16x2 e un pulsante per controllare la visualizzazione dei dati di tre sensori di temperatura (TMP36). Penso di aver commesso degli errori concettuali nel codice.
L'idea è la seguente:
Se il pulsante non viene premuto, ogni 3 secondi il display cambia automaticamente i dati mostrati, passando al sensore successivo (sensore 1 → sensore 2 → sensore 3 → sensore 1, e così via).
Se il pulsante viene premuto, il display deve immediatamente passare ai dati del sensore successivo, senza aspettare il cambio automatico, e poi continuare il ciclo normalmente.
Problema: il pulsante non ha alcun effetto.
Se non lo premo, il display cambia i dati ogni 3 secondi come previsto. Se lo premo, invece, non succede nulla.
Ecco il codice che ho scritto:
Ho provato a cercare altri post inerenti al mio progetto, ma non ne ho trovato di così simili da potermi aiutare concretamente.
Sono abbastanza sicuro che qualcosa non torni nella logica generale del codice, ma non saprei nemmeno da dove iniziare per risolvere il problema. Il mio dubbio principale risiede nell'uso di statoS, che ritengo anche essere una delle cause principali del mancato funzionamento del pulsante (ma spero che questo siate voi a dirmelo ). Qualcuno potrebbe darmi una mano?
Grazie mille in anticipo!
Allego immagine del circuito simulato su Tinkercad.
Assolutamente si! Cosa mi consiglieresti di studiare per migliorare ulteriormente il codice?
Ho dato un'occhiata molto veloce alla gestione del pulsante con il debounce seguendo il thread di 'blink without delay', potrebbe essere un punto di partenza?
Se usi una matrice di 3 elementi per valTemp[], puoi eliminare 2 dei 3 blocchi di visualizzazione.
Le scritte fisse, poi, mettile nel setup.
Prima di ogni analogRead() fanne uno senza leggere il valore e attendi 2ms per evitare interferenze fra i 3 canali.
Al posto di int ho usato uint8_t, dato che le variabili sono sempre positive e occupano pochi valori (tranne valTMP), ho usato un vettore per TMPPins e poi per valTemp, la scritta fissa "Temperatura:" l'ho messa nel setup, la lettura dei sensori con un ciclo for, e ho aggiunto una lettura di scarto di TMPPins con un delay di 2ms. Ho anche spostato la visualizzazione dei dati alla fine.
Penso di aver realizzato correttamente il debounce hardware (il pulsante funziona ancora... penso sia un buon segno ) ma non ne sono così sicuro, quindi allego un'immagine del circuito.
Per quanto riguarda la differenza di occupazione di memoria tra il nuovo codice e il primo, sarei curioso anch'io... basta sommare l'occupazione di memoria di int, uint8_t, float e unsigned long? Se sì, il codice iniziale occupava 30 byte, mentre quello sopra 20 (sempre se ho contato bene ).
Per quanto riguarda il condensatore, allego sempre foto