Il progetto che sto sviluppando è chiamato TF40 e nasce per l'esigenza di automatizzare un paludario che ho allestito in casa. Lo dichiaro da subito: TF40 non vuol dire nulla.
La gestione del paludario prevede la possibilità di impostare manualmente i parametri, i vari timer e valori di riferimento. Oppure di appoggiarsi a delle librerie di dati per simulare giorno per giorno l'habitat di una palude tropicale d'acqua dolce. Le librerie contengono i valori di riferimento per i vari parametri su almeno 5 set point (variabili float) ciascuno nelle 24 ore. Sto sviluppando un codice che generi i dati per le librerie in VBA, ma questa è un altra storia.
Il sistema è pilotato da una scheda Arduino Mega, alimentato con un trasformatore PC dal quale pesco tutte le tensioni che mi servono.
Al sistema sono collegati vari sensori di temperatura e umidità, un PWM driver a più canali, uno schermo led e altre amenità tipo 3 eeprom che conterranno i dati climatici da rispettare per 365 giorni. Non ho incontrato grandi difficoltà nel far funzionare le periferiche, anche grazie alle ottime e abbondanti librerie disponibili.
Ho però dei problemi da risolvere:
//edit:
- Utilizzo un segnale interrupt dall'RTC a 1hz che incrementa il valore di una variabile (secondi) per evitare di leggere continuamente l'RTC, l'ora si aggiorna tutti i giorni a mezzanotte. Scopro leggendo nel forum che la scrittura delle eeprom e la contemporanea gestione degli interrupt può dare problemi ai due task. Il mio codice non prevede l'esecuzione di scritture eeprom per tempi prolungati (2 o 4 byte alla volta) e non dovrei avere problemi, ho anche letto che il sistema ha un flag che memorizza l'evento interrupt e lo elabora appena possibile, ma ne memorizza uno solo. Poiché prevedo che il livello di complessità del progetto è destinato ad aumentare molto vorrei da subito risolvere questo problema. La mia soluzione, per la quale ho bisogno di un parere più esperto, è questa: disabilitare l'interrupt sul pin ed eseguire altro, intercettare il cambio di flag per incrementare una variabile e riportare il flag a falso. riabilitare l'interrupt e richiamare in una funzione gemella all'isr con un numero di cicli pari alla variabile.
// edit: bastava leggere un po. si può fare, non ho ancora capito bene come....
soluzione alternativa: usando millis() calcolo il tempo trascorso durante la sospensione dell'interrupt e lo sommo alla sua ripresa.
- Sempre leggendo ho capito come arduino gestisce le variabili in memoria e mi sono reso conto che presto avrò un problema con le stringhe. Le variabili stringa che uso sono poche, 4 per la gestione del LCD e due o tre per aggiungere degli zeri agli orari o giorni a una sola cifra. Come costringo il sistema a non riallocare le stringhe che uso per l'LCD?
edit//
- per risparmiare spazio sulle eeprom trasformo tutte le variabili float (xx,yy) in long (xxyy) moltiplicando per 100 prima della scrittura e processo invero all'assegnazione del valore a una variabile. È corretto? lo chiedo perché è troppo bello e facile per essere vero.
//edit ecco qui non bastava, dovevo leggere un po. se non ho capito male long e float occupano 4 Byte. era troppo bello per essere vero.
Grazie mille!