Scrivendo uno sketch di Arduino mi sono trovato a dover eseguire una o più funzioni solo quando erano strettamente necessarie.
Un esempio di utilizzo è un monitor dei sensori/attuatori collegati ad Arduino che interagisce inviando GET o POST via HTTP a un server web/php/mysql o su un Form di Google Drive, solo quando è veramente necessario, senza rischiare che la web hosting o nel caso si utilizzino i Trigger Script di Google Drive scambino i nostri GET/POST come una sorta di BOT invasivi e possibilmente dannosi, con la conseguenza di avere il servizio web interrotto.
Descrizione dello Sketch
In questo esempio, Arduino prima di eseguire il primo loop, attende 2 minuti e 30. Questa tempo di attesa potrebbe servire ad alcuni sensori analogici (sensore GAS, termometro, misuratore ad induzione di corrente, ecc.) per calibrarsi ed entrare in regime stabile, evitando dei falsi positivi che potrebbero verificarsi se il sensore è troppo freddo, caldo o non ha ancora raggiunto la tensione o corrente ottimale di funzionamento.
Una volta passati il tempo di calibrazione, Arduino registra lo status e i valori delle porte ed esegue il primo loop. Nel loop viene controllato che il valore dei sensori analogici non abbia superato una certa soglia che abbiamo impostato nell’inizializzazione dello sketch o che i sensori digitali non siano cambiati di stato. Nel caso sia avvenuta una variazione significativa di una o più porte Arduino esegue la nostra funzione e registra il valore delle porte. Mentre se questa variazione significativa non è accaduta Arduino registra il valore delle porte per essere controllato al loop successivo e continua a controllare i valori delle porte senza eseguire alcuna azione.
Lo Sketch
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
/* *** Attesa della calibrazione dei sensori analogici ed esecuzione funzione solo quando si verificano variazioni significative dei sensori analogici o variazioni di stato degli I/O digitali. Si ringrazia Leo72 ( moderatore della sezione Software Italiana del Forum Ufficiale di Arduino http://forum.arduino.cc ) per l'aiuto e senza il quale sarebbe passato troppo tempo prima di terminare uno sketch funzionante ;) Il codice è di dominio pubblico e può essere consultato sul blog personale del sottoscritto. https://www.giannifavilli.it/blog/?p=1186 Creato il 08/04/2013 by Gianni Favilli *** */ //init sensori analogici int a0; // imposto il valore di a0 come intero int prevA0; // imposto valore precedente di a0 come intero const int range = 15; //imposto il range massimo permesso di variazione da usare per i sensori analogici //init sensori digitali int d7; // imposto il valore di d7 come intero int ind7 = 7; // imposto il pin digitale 7 per la lettura int prevD7; // imposto valore precedente di d7 come intero boolean run = false; // imposto run come falsa // la mia funzione da eseguire solo se ci sono variazioni significative dei pin void funzione () { Serial.println("*** *** *** *** *** ***"); Serial.println(".::ESEGUO FUNZIONE::."); Serial.println("*** *** *** *** *** ***"); } void setup(){ pinMode(ind7, INPUT); // inizializzo pin digitale 3 come ingresso // calibrazione per i primi 150000 millisecondi = 2' e 30'' while (millis() < 150000) { // attendi 2,5 min //attendi } //lettura iniziale di prevA0 con conversione da 1024 a 256 bit del pin analogico 0 prevA0 = map(analogRead(A0), 0, 1023, 0, 255); //lettura iniziale di prevD7 prevD7 = digitalRead(ind7); Serial.begin(9600); Serial.println("partito"); } void loop(){ Serial.println("inzio loop"); //leggo il pin analogico 0 e lo converto a 256 bit a0 = map(analogRead(A0), 0, 1023, 0, 255); //leggo lo stato del pin digitale 7 d7 = digitalRead(ind7); //scrivo un report ad ogni loop Serial.print("valore A0 precedente:"); Serial.print(prevA0); Serial.print(" - valore A0 attuale:"); Serial.println(a0); Serial.print("valore D7 precedente:"); Serial.print(prevD7); Serial.print(" - valore D7 attuale:"); Serial.println(d7); //controllo che il valore a0 non abbia superato il range stabilito o il d7 non sia cambiato di stato // e come dice Leo72 per il primo controllo if si usa abs() affinché non debba fare 2 confronti if ((abs(prevA0 - a0) > range) || (d7 != prevD7)) { run = true; // imposto il booleano come vero per eseguire la funzione Serial.println(".:: OVERFLOW ::."); // scrivo che c'è un cambio stato } else { run = false; // imposto il booleano come falso e non eseguo niente Serial.println("valori nel range"); // scrivo che tutto è ok } prevA0 = a0; // salvo la lettura di prevA0 per il loop successivo prevD7 = d7; // salvo la lettura di prevD7 per il loop successivo if (run){ // se run è vera eseguo la funzione delay(1000); //attendo un secondo prima di eseguire la funzione funzione(); } delay(2500); Serial.println("fine loop"); } //loop |
Come potete notare ho cercato di commentare il più possibile lo sketch per una più facile comprensione di quello che Arduino dovrà eseguire.
Conclusioni
Lo sketch controlla solo lo status di una porta analogica e una digitale ma nulla vieta di aggiungere il controllo per una o più porte.
Come accennavo nell’introduzione questo sketch è molto utili per i progetti che richiedono l’esecuzione di una o più funzioni solo quando è strettamente necessario, evitando sprechi di energia elettrica, anche se infinitesimali e sopratutto, per le applicazioni che richiedono l’interazione con server esterni.
Supponiamo di dover inviare i valori delle porte di Arduino ad una pagina PHP che registra questi valori su un database MySQL. Nel caso non avessimo adottato il controllo dei valori sulle porte, Arduino avrebbe inviato i dati al database ogni 2500 millisecondi (due secondi e mezzo) con la conseguenza di avere la “bellezza” di 24 record in un solo minuto fate il calcolo per un ora e poi per un giorno e così via, vi garantisco che sono un po’ troppi record!!! 🙂
Reference
Ringrazio Leo72, moderatore della sezione Software Italiana del Forum Ufficiale di Arduino
Link alla discussione su forum.arduino.cc
I commenti sono chiusi.