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!