Se sei riuscito a mandarlo in sleep e risvegliarlo con il watchdog non ti resta che gestire la logica che a te interssa via software. Ovvero quando ti scatta il watchdog periodico (suppongo via segnale da RTC) fai quello che devi fare (decisioni, aggiornamento dati, ecc.) e poi rimandi in sleep la MCU se le condizioni lo consentono, lavorare in modo asincrono dipende solo da te, la MCU di Arduino non è un PC e non ha capacità multithread quindi devi essere tu a sviluppare il programma nin modo che nessuna delle sue componenti sia bloccante (Es. non puoi udare istruzioni delay, cicli di attesa) ma tramite costrutti e funzioni specifiche (Es. millis() ) fare n modo che i compiti svenagano svolti senza nloccare l'esecuzione del programma per più del tempo strettamente necessario affinché ogni parte sia eseguita.
Non dichiari il tipo di Arduino in uso , se fosse una Uno hai comunque due interrupt hardware sfruttabili quindi per poter gestire la parte del pulsante puoi replicare quanto fatto con il primo interrupt, sempre per supposizione lo avrai interfacciato con l'RTC, per gestire il pulsante, premendolo risvegli Arduino e accendi il display, per fare questo ti posso consigliare di utilizzare un pin di Arduino per pilotare un transistor (o un mosfet in base all'assorbimento del display) per accendere e spegnere il display in questo modo quando vai in sleep e spegni tutto (display compreso) quando Arduino si risveglia con l'RTC non accendi il display, quando l'utente preme il pulsante invece piloti il pin relativo ed accendi il display consentendo all'utente di fare tutto ciò che serve, quando torni in sleep spegni il display tramite il solito pin che comando il transistor.
Dopo un certo tempo di inattività per spegnere devi usare millis() e trascorso il tempo da te deciso spegni il display, eventuali altre cose e mandi in sleep la MCU
Salve,
In realtà sono riuscito a mandarlo in "sleep" ma non a risvegliarlo con un timer, in quanto si risveglia con la pressione di un tasto, al qualche ho "agganciato" un'interrupt (attraverso la libreria
AVR/sleep.h).
Sono inoltre riuscito ad utilizzare un timer interno (WhachDog Timer) per generare delle interrupt al suo scadere ed eseguire del codice, anche facendo risvegliare il sistema da un sonno (non so se esattamente identico a quello precedente).
Quello che non riesco a fare è unire le due cose, in quanto non riesco a far "sopravvivere" il timer alla modalità sleep. Ovvero, vorrei riuscire a mandare in SLEEP profonda il sistema e permetterne il risveglio attraverso il tasto O la scadenza del timer. Dopo di che, una volta sveglio, se trattasi di interrupt generata da timer il sistema andrà semplicemente ad aggiornare i dati, altrimenti resta sveglio un po' (esegue un numero fissato di volte il loop) per interagire con l'utente e successivamente torna a dormire. Quello che mi manca, secondo me, è un meccanismo unico per entrambi i casi di far addormentare e risvegliare il sistema.
Per quanto riguarda l'uso del RTC: sto cercando di evitarne l'uso e sono riuscito a simulare un'attesa di 5 minuti attraverso la successione di diverse scadenze del WDT (che dovrebbe arrivare a circa 8 secondi). Se essa però risulta l'unica strada percorribile per questo genere di problema provvederò.
Spero di essere stato chiaro, grazie.