Ecco il mio Arduberry:
Un Arduino Leonardo con sensore di temperatura e di luce, connesso direttamente via porta USB a un Raspberry Pi su cui gira un server LAMP. I dati del sensore vengono scritti ogni dieci minuti su un database MySql sul Raspberry.
Il vantaggi di questa soluzione rispetto a quella precedente sono che a) non si appoggia a nessun servizio esterno e quindi ne ho il pieno controllo, e b) che mi sono divertito un casino a smanettare tra java, python, sudo nano e crontab. Ho tratto grande giovamento dai vari tutorial in circolazione, in particolare Connect Raspberry Pi and Arduino with Serial USB Cable e Tutorial: store Arduino data with RaspBerry PI to MySql che ringrazio di cuore: ragazzi, non ce l’avrei mai fatta senza di voi.
Prossimo passo: trovare un alimentatore separato per l’Arduino, che la porta USB del Raspberry alimenta ma appena appena. Potrei provare a utilizzare il server Apache del Raspberry per la visualizzazione dei dati. Magari un’altra volta.
Ecco la non semplicissima ricetta, al netto degli innumerevoli prova ed errore:
1)
/* Termometro con smoothing dei valori del sensore (media di 10 letture) vedi http://www.arduino.cc/en/Tutorial/Smoothing */ const int numReadings = 10; // numero di letture per la media int readings[numReadings]; // le letture dal sensore analogico int index = 0; // 'indice della lettura corrente int total = 0; // il totale corrente int average = 0; // la media float temp; // la temperatura in C° int light; int inputPin = A0; //la connessione al sensore di temperatura int lightPin = A1; int x; int y; unsigned long temptot; void setup() { Serial.begin(9600); // metto a 0 le letture: for (int thisReading = 0; thisReading < numReadings; thisReading++) readings[thisReading] = 0; } void loop() { // tolgo l'ultima lettura: total= total - readings[index]; // leggo più volte dal sensore // e faccio la media per stabilità: temptot = 0; for(x = 0; x < 64; x++) { temptot += analogRead(inputPin); } y = temptot >> 6; readings[index] = y; //readings[index] = analogRead(inputPin); // aggiungo la lettura al totale: total= total + readings[index]; // avanzo alla posizione seguente nell'array: index = index + 1; // se siamo alla fine dell'array... if (index >= numReadings) { // ...ricomincio da capo: index = 0; } // calcolo la media: average = total / numReadings; // converto voltaggio sensore in °C temp = ( 5.0 * average * 100.0) / 1024.0; // leggo l'output per debug: // Serial.println(temp); light = analogRead(lightPin); // scrivo sulla porta seriale: Serial.print(temp); //Serial.print(average); Serial.print(" "); Serial.print(light); Serial.println(); delay(2000); // ritardo tra le letture per stabilità }
2)
Codice in python (il file è questo) che legge la USB del Raspberry , preleva i valori dei sensori e li scrive nel database MySQL:
3)
La riga aggiunta in Raspberry con il comando crontab -e che esegue la lettura della porta seriale ogni dieci minuti (l’ultima parte serve a evitare le mail di alert):
*/10 * * * * /usr/bin/arduinotomysql.py >/dev/null 2>&1
4)
Enjoy!
Una risposta a “Arduino: connessione a MySQL su Raspberry Pi”
I commenti sono chiusi.