Deumidificatore Arduino Uno

Buongiorno,
a casa ho un deumidificatore della Mitsubishi con l’elettronica di controllo (CMOS) fulminata ma con l’elettronica di potenza in perfette condizioni, quindi ho deciso di sfruttare una scheda Arduino Uno per la riparazione.
Per la parte elettrica nessun problema, per il software, visto che sono alle prime armi e visto che ho anche scopiazzato certe parti di programma, penso di aver commesso più di qualche errore ma non so dove. Ho pensato anche ad un malfunzionamento della scheda ma non da problemi con altri sketch.

Al momento all’Uno ci son collegati solamente LCD 2x16 con interfaccia I2C e sensore DHT11 al pin 2 (digitale).
Una volta acceso visualizza temperatura, umidità relativa e temperatura di rugiada. Ho inserito la memorizzazione di temperatura e umidità minime e massime con visualizzazione tramite pulsante su pin 4, pulsante reset valori su pin 7. Con un altro pulsante sul pin 8 simulo il sensore di tanica piena e tutto funziona. Il problema è che durante il funzionamento:

  • le letture variano anche di 2/3 gradi e/o punti percentuali, ovvero, rimangono costanti esempio per 6 cicli del loop, ne fa una sballata, e poi torna tutto ok. Succede ciclicamente ed ho notato che questo fenomeno è accentuato o attenuato variando il tempo del delay alla fine del loop principale;
  • i valori min e MAX, dopo un’oretta di funzionamento, NON corrispondono alla realtà e nemmeno alla portata dell’impreciso DHT11. Ho valori che vanno anche a 255°C e penso possano essere le variabili byte a dare problemi, ma perchè?

Spero possiate darmi una mano nel capire cosa sbaglio. Grazie! :slight_smile:

— hai già allegato il codice a questo post, inutile rimetterlo di nuovo e, anche volendolo fare, in conformità al regolamento (… che ti consiglio di leggere con attenzione), punto 7, il codice DEVE essre rachiuso tra i tag CODE. Il tuo post successivo è quindi stato rimosso - gpb01

deumidificatore.ino (7.05 KB)

Prova a cambiare nome alla variabile A0 (che è assegnata al pin 19).
E come fai a fare i conti di log() se non hai incluso la math.h?

Attento che poi tale deumidificatore non è più a norma, se lo modifichi con arduino.

La gestione dei massimi e minimi non mi convince.
La prima volta che lo sketch gira legge dei valori dalla eeprom che non sono mai stati settati.
Inoltre quando fai il reset dei massimi e minimi non lo fai anche sulla eeprom

Poi sospetto anche dei disturbi elettrici e magari degli occasionali riavvii. Il DHT11 è scarso, peggio del sensore interno, ma a me fornisce misure sempre coerenti.

Controlla che ci siano riavvii, ad esempio registrando l'output della seriale, e controlla che i collegamenti siano tutti stabili e non eccessivamente volanti.

Grazie mille ad entrambi
ho cambiato A0 (pin19) con A nella funzione del dew point e incluso la libreria math.h, ma quel che mi sorprende è che funzionava lo stesso pure prima.
Nella stessa funzione c’era un “T” maiuscolo uguale a quello usato nella memorizzazione di MIN/MAX ma totalmente differente. è diventato “t” visto che mi era sfuggito l’errore.

Arduino fortunatamente non si è mai riavviato da solo, proverò a starci attento.
Per la memorizzazione delle minime e massime come mi consigli di provare?
comunque il “reset min/max” ho provato a sistemarlo, ora nel reset ho incluso le eeprom.

I collegamenti sono abbastanza ok, è ancora tutto un prototipo quindi per esempio gli output sono solo dei led, provo a migliorare la situazione.

Vi faccio sapere se si risolvono i problemi

deumidificatore.ino (7.03 KB)

Ho apportato qualche modifica al programma.
ho aggiunto un reset iniziale MIN/MAX ma devo eseguirlo 2 volte altrimenti non funziona… qualcuno sa perchè?
Comunque ora le letture sono stabili e in 2 ore di funzionamento non ci sono più valori fuori norma nelle eeprom.

Io cerco di impegnarmi e fare del mio meglio ma di programmazione so poco. Per caso c’è un modo di migliorare il mio sketch? faccio uno schema a blocchi, vi spiego meglio cosa devo fare, perchè dovrò controllare tutto con 4 pulsanti, di cui uno ON/OFF dell’apparecchio. Mi servirebbero delle dritte ma cercherò di spiegarmi meglio. Voglio precisare che intendo mantenere le funzioni originali del deumidificatore, ma per comodità e perchè si può fare, ho voluto aggiungere la funzione di termo-igrometro al deumidificatore.
ora sto studiando il debounce e come utilizzare i pulsanti con un menu su LCD, ma la prima domanda che mi sorge è: come avere una risposta immediata alla pressione dei pulsanti senza dover aspettare il delay del loop principale? ovvero il delay che decide il tempo tra una lettura e l’altra del DHT11. Se non ci fosse quel delay sarebbe tutto più semplice ma serve… :frowning: c’è un modo di far eseguire 2 istruzioni contemporaneamente? una che continua ad interrogare il sensore e visualizza/memorizza temperatura ed umidità, un’altra che appena avverte la pressione di un pulsante mi fa entrare in un menu, ma senza interferire con il funzionamento del termoigrometro e quindi anche con compressore, ventilatore, ecc…

deumidificatore.ino (7.25 KB)

Devo recuperare gli appunti che ho scritto sullo sketch.

Per la seconda domanda la risposta è millis.
Con il delay il micro aspetta e non può fare altro.
Il millis funziona come se tu aspettassi ma contemporaneamente guardi un orologio. Millis è il tuo orologio, conta in millisecondi da quando lo accendi. Dopo circa 50 giorni va a zero e reinizia daccapo.
Per cui la logica, se devo aspettare 1000 millisecondi, è:
Leggo millis e lo metto in una variabile, tipo partenza.
Faccio altro, ad esempio leggo il pulsante,
Rileggo millis e faccio la differenza con quello precedente memeorizzato in partenza, se la differenza è maggiore di 1000 allora il tempo è passato.
Fra gli esempi c'è blink without delay che usa millis.

Io opterei per la funzione pulseIn al posto di (digitalRead(pin) == LOW). Forse leggermente più semplice che Bounce.
Infatti la condizione aspetta che il tasto ritorni allo stato voluto e se non cambia non è valido oppure gli dai un timeout.

Se non sbaglio la pulsein è bloccante come se si usasse un delay.
Ci sono anche soluzioni hardware oppure librerie già fatte come la bounce2, presente nel library manager.

zoomx:
Se non sbaglio la pulsein è bloccante

All' atto di premere un tasto, non vedo il problema se si ferma ad aspettare che venga rilasciato il tasto premuto. Direi piuttosto che sia a favore che si rileva se veramente il rilascio del tasto non sia prima del periodo stabilito.