Arduino: connessione a MySQL su Raspberry Pi

Ecco il mio Arduberry:

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 CableTutorial: 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:

arduinotomysql1

 

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