Data Logger con Arduino
Questo tutorial servirà a illustrare la realizzazione di un semplice data logger, low cost, per il monitoraggio ambientale di temperature , nel nostro caso in grotta, e registrarle in una SD-Card. Il cuore del progetto è Arduino una piattaforma hardware low-cost programmabile, con cui è possibile creare circuiti "quasi" di ogni tipo per molte applicazioni, soprattutto in ambito di robotica ed automazione. Un particolare molto importante, ogni programma che si scrive su Arduino sarà naturalmente avviato a loop() finché non si toglie l'alimentazione dal dispositivo. Quando lo colleghiamo ad una fonte di alimentazione (ad esempio la USB del PC o anche una comunissima Batteria da 9V) si accende e avvia il programma caricato dall'IDE a loop infinito. Questo continua fino a quando non togliamo la batteria o stacchiamo il cavo.
Gli shields per Arduino sono schede aggiuntive che permettono alla piattaforma base di interagire con il mondo esterno. Sono disponibili modelli per un numero estremamente elevato di applicazioni. Per il nostro progetto è stato utilizzato per comodità un modulo (shield) aggiuntivo che mi permette di avere:
- Un RTC DS1307 (Real Time Clock) con batteria tampone, mantiene il tempo meglio del vostro orologio.
- Un card reader, i nostri output li andremo a scrivere su file.
- Led, non avendo monitor i led saranno le nostre spie.
- Fori per saldare i sensori o per usare una breadboard
Per il sensore è stato utilizzato LM335 simile ad un transistor in contenitore TO-92 a tre pin:
Arduino, non è solo hardware ma anche: software, documentazione e community. Sul sito ufficiale (arduino.cc) è possibile scaricare l’IDE che permette di programmare la propria Arduino via USB Il linguaggio di programmazione è (simil) C. All’interno dell’ide, vi sono molti codici di prova già funzionanti, essa include gran parte delle librerie di cui avremo bisogno. Altre sono presenti nei siti dei corrispettivi produttori hardware o dai siti personali di utenti che hanno condiviso le proprie. Installare librerie di terze parti è molto semplice (un paio di copy&paste): google ci aiuterà non poco. Nel nostro caso andremo ad utilizzare le librerie RTC ed SD suggerite sulla pagina di adafruit relative alla logger shield utilizzata: http://www.ladyada.net/make/logshield/download.html E’ importante documentarsi sempre e approfonditamente sull’hardware su cui andremo a lavorare. Datasheet, reference, librerie, documentazione varia e google vanno sempre consultati quando abbiamo hardware tra le mani. Cercare: “lm335 arduino” o “ldr arduino” sia su google testo che immagini ci darà tantissima documentazione… per non parlare poi del forum ufficiale. La lettura analogica dell’lm335 verrà fatta sul pin 0 (zero) della nostra Arduino.
Ed ora il codice:
#include <SD.h> #include <SPI.h> #include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; const int chipSelect = 10; short i=0; void setup() { //seriale aperta a 9600 baud Serial.begin(9600); Serial.println("Initializing SD card..."); //inizializziamo i pin 3 e 4 per i led rosso-verde //pin 10 riservato al card reader pinMode(10, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); //se il modulo sd non viene correttamente inizializzato if (!SD.begin(chipSelect)) { //messaggio di errore sul nostro monitor seriale Serial.println("Card failed, or not present"); for (i=0;i<10;i++) { //blinking del led rosso digitalWrite(3, HIGH); delay(100); digitalWrite(3, LOW); delay(100); } return; } //se correttamente inizializzata... Serial.println("card initialized."); //blinking led verde digitalWrite(4, HIGH); delay(500); digitalWrite(4, LOW); //inizializziamo l'RTC Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop() { //chiediamo il tempo all'RTC DateTime now = RTC.now(); int voltAD=0; float valore=0; int analogPin=0; float sensor =0; //aspettiamo 30 minuti delay(1740000); //leggiamo e convertiamo la temperatura dal pin 0 di arduino
// da kelvin a celsius voltAD = analogRead(analogPin); valore = voltAD*5.0/1024.0; // 0.5 volt sensor = (valore/(2.98/298.15))-273.15; //stampa sulla seriale Serial.print(now.day()); Serial.print("/"); Serial.print(now.month()); Serial.print("/"); Serial.print(now.year()); Serial.print("\t"); Serial.print(now.hour(), DEC); Serial.print(":"); Serial.print(now.minute(), DEC); Serial.print(":"); Serial.println(now.second(), DEC); Serial.print("\t"); Serial.print("Temperatura: "); Serial.println(sensor); //apriamo in scrittura il file sulla sd File dataFile = SD.open("datalog.txt", FILE_WRITE); //Scriviamo: giorno mese anno - ORA:MINUTI:SECONDI - temperatura if (dataFile) { dataFile.print(sensor); dataFile.print("\t"); dataFile.print(now.day()); dataFile.print("/"); dataFile.print(now.month()); dataFile.print("/"); dataFile.print(now.year()); dataFile.print("\t"); dataFile.print(now.hour(), DEC); dataFile.print(":"); dataFile.print(now.minute(), DEC); dataFile.print(":"); dataFile.println(now.second(), DEC); //chiudiamo il file dataFile.close(); //blinking led verde digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW); } else { //errore nell'apertura del file o card rimossa Serial.println("error opening datalog.txt"); for (i=0;i<10;i++) { //blinkig led rosso digitalWrite(3, HIGH); delay(100); digitalWrite(3, LOW); delay(100); } } }
Il progetto prevede anche due led alle uscite 3 e 4 per verificare il corretto funzionamento del logger.
Per l'utilizzo in grotta sono state utilizatte delle batterie da 6 volt 10Ah per ottenere un 12 volt e 20Ah, considerando un consumo di 50mAh, abbiamo un'autonomia presunta di 400 ore
Sulla scheda SD avremo un output in un file di testo più o meno del seguente tipo:
15.08 21/12/2013 18:32:35 14.59 21/12/2013 19:1:35 14.10 21/12/2013 19:30:35 14.10 21/12/2013 19:59:35 13.62 21/12/2013 20:28:35 13.62 21/12/2013 20:57:35 13.62 21/12/2013 21:26:35 13.13 21/12/2013 21:55:35 13.13 21/12/2013 22:24:35 13.13 21/12/2013 22:53:35 13.13 21/12/2013 23:22:35 13.13 21/12/2013 23:51:35 13.13 22/12/2013 0:20:34 13.13 22/12/2013 0:49:34 13.13 22/12/2013 1:18:34 12.64 22/12/2013 1:47:34 12.64 22/12/2013 2:16:34 13.13 22/12/2013 2:45:34 12.64 22/12/2013 3:14:34 12.64 22/12/2013 3:43:34 12.64 22/12/2013 4:12:34 12.64 22/12/2013 4:41:34 12.64 22/12/2013 5:10:33 12.64 22/12/2013 5:39:33 12.64 22/12/2013 6:8:33 12.64 22/12/2013 6:37:33 12.64 22/12/2013 7:6:33 18.99 22/12/2013 7:35:33 13.13 22/12/2013 8:4:33 14.10 22/12/2013 8:33:33 13.62 22/12/2013 9:2:32
Questo file potrà essere elaborato in qualunque modo ad esempio con un foglio di calcolo, in questo caso di LIbreOffice.