Progetto TF40 - gestione di un paludario

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!

... NON usando la classe String, ma utilzzando le strighe classiche del 'C'.

In alternativa ... puoi guardare QUI

Guglielmo

... si, l'occupazione in memoria di un float è la stessa di un long, ma ... l'occupazione di flash (routines per il trattamento del float) e la velocità del codice nel trattare le due cose (... la lentezza in un caso rispetto alla velocità dell'altro), non sono neanche paragonabili.

Guglielmo

Citazione l'occupazione di flash (routines per il trattamento del float) e la velocità del codice nel trattare le due cose (... la lentezza in un caso rispetto alla velocità dell'altro), non sono neanche paragonabili.

Ok!! Grazie per le informazioni. Sto rivedendo tutte le variabili trasformandole in un tipo che non sia troppo ridondante. Per fortuna non ho le necessità di velocità che potrebbe avere una stampante o un drone.

Proprio leggendo quel link mi sono fatto venire gli scrupoli. Vista la semplicità userò le stringhe C, che se non erro sono array di caratteri a una dimensione, con un carattere di end of string nell'ultima posizione.

.... esatto, dei banali array di char, dimenionati per la lunghezza massima, tanto il fine della stringa, nell'array, è indicato dal carattere 0x00 :slight_smile:

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.