lunedì 9 luglio 2012

Sensori via Arduino Ethernet

 Questo programma mostra un esempio di come utilizzare una Arduino Ethernet per leggere i valori di alcuni sensori (su protocollo I2C o direttamente con input analogico) e mostrare il risultato su una pagina Web che si aggiorna una volta al secondo

--------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>

#define ADDRESS 0x60        // indirizzo I2C della bussola

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };

Server server(80);

int acc_x0,acc_y0,acc_z0;                     // Valori di accelerazione

unsigned long tempo;

void setup()
{
  //inizializza il bus I2C
  Wire.begin();
  //inizializza il web server
  Ethernet.begin(mac, ip);
  server.begin();
  // per debug
  Serial.begin(9600);
}

void loop()
{
   byte highByte, lowByte, fine;              // Bearing (transi)
   char pitch, roll;                          // Pitch and roll
   int bearing;                               // Bearing
   byte high_x,low_x,high_y,low_y,high_z,low_z;
   int acc_x,acc_y,acc_z;                     // Valori di accelerazione


   Wire.beginTransmission(ADDRESS);           // inizia la comunicazione con la bussola
   Wire.send(2);                              // inizia a leggere dal secondo registro
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 4);              // richiede 4 byte
   while(Wire.available() < 4);               // Wait for bytes to become available
   highByte = Wire.receive();          
   lowByte = Wire.receive();           
   pitch = Wire.receive();             
   roll = Wire.receive();              
  
   bearing = ((highByte<<8)+lowByte)/10;      // Calcola la parte intera del Bearing
   fine = ((highByte<<8)+lowByte)%10;         // Calcola la parte decimale del Bearing

   int fine2 = (int)fine;
   int pitch2 = (int)pitch;
   int roll2 = (int)roll;
  
   Wire.beginTransmission(ADDRESS);           //inizia lettura accelerometro
   Wire.send(16);                             
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 6);              // Richiede i 6 byte dell'accelerazione
   while(Wire.available() < 6);              
   high_x = Wire.receive();          
   low_x = Wire.receive();           
   high_y = Wire.receive();          
   low_y = Wire.receive();           
   high_z = Wire.receive();          
   low_z = Wire.receive();           
  
   acc_x = ((high_x<<8)+low_x);      // Calcola accel_x
   acc_y = ((high_y<<8)+low_y);      // Calcola accel_y
   acc_z = ((high_z<<8)+low_z);      // Calcola accel_z

   delay(1000);
 
  Client client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          //gestisce il refresh automatico della pagina per aggiornare
          //al valore dei sensori
          client.println("<meta http-equiv=\"refresh\" content=\"1\">");
         
          tempo = round(millis()/1000);
          client.print("Tempo trascorso (sec): ");
          client.print(tempo);
          client.print("</br></br><table border=1>");
         
          // Stampa il valore del bearing
            client.print("<tr><td>Bearing</td><td>");
            client.print(bearing);
            client.print(".");
            client.print(fine2);
            client.print("</td></tr>");

          // Stampa il valore di Pitch
            client.print("<tr><td>Pitch</td><td>");
            client.print(pitch2);
            client.print("</td></tr>");

          // Stampa il valore di Roll
            client.print("<tr><td>Roll</td><td>");
            client.print(roll2);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su X
            client.print("<tr><td>Acc. Delta X (g)</td><td>");
            float acx = (acc_x-acc_x0)*0.000636364;
            client.print(acx);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Y
            client.print("<tr><td>Acc. Delta Y (g)</td><td>");
            float acy = (acc_y-acc_y0)*0.000636364;
            client.print(acy);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Z
          // il valore di acc su Z senza movimento e' 15400
          // quindi il fattore di correzione e' 9.8/15400 = 0.000636364
            client.print("<tr><td>Acc. Delta Z (g)</td><td>");
            float acz = (acc_z-acc_z0)*0.000636364;
            client.print(acz);
            client.print("</td></tr>");
           
            // salva i valori di accelerazione per il calcolo
            // del delta di accelerazione
            acc_x0 = acc_x;
            acc_y0 = acc_y;
            acc_z0 = acc_z;

          // Stampa il valore Temperatura
          // T = 68.033 exp(-0.2088*R(Kohm))
          // R_sensore = (10.000*5)/(
          int sensor_t = A0;
          int temp = analogRead(sensor_t);
          double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
          double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
          double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
            client.print("<tr><td>Temp. (C)</td><td>");
            client.print(temperatura);
            client.print("</td></tr>");

          // Stampa il valore Umidita
          int sensor_u = A1;
          int umi = analogRead(sensor_u);
          double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
            client.print("<tr><td>RH (%)</td><td>");
            client.print(umidita);
            client.print("</td></tr>");


            client.print("</table>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>

#define ADDRESS 0x60        // indirizzo I2C della bussola

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1 };
byte ip[] = { 192,168,1, 2 };

Server server(80);

int acc_x0,acc_y0,acc_z0;                     // Valori di accelerazione

unsigned long tempo;

void setup()
{
  //inizializza il bus I2C
  Wire.begin();
  //inizializza il web server
  Ethernet.begin(mac, ip);
  server.begin();
  // per debug
  Serial.begin(9600);
}

void loop()
{
   byte highByte, lowByte, fine;              // Bearing (transi)
   char pitch, roll;                          // Pitch and roll
   int bearing;                               // Bearing
   byte high_x,low_x,high_y,low_y,high_z,low_z;
   int acc_x,acc_y,acc_z;                     // Valori di accelerazione


   Wire.beginTransmission(ADDRESS);           // inizia la comunicazione con la bussola
   Wire.send(2);                              // inizia a leggere dal secondo registro
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 4);              // richiede 4 byte
   while(Wire.available() < 4);               // Wait for bytes to become available
   highByte = Wire.receive();          
   lowByte = Wire.receive();           
   pitch = Wire.receive();             
   roll = Wire.receive();              
  
   bearing = ((highByte<<8)+lowByte)/10;      // Calcola la parte intera del Bearing
   fine = ((highByte<<8)+lowByte)%10;         // Calcola la parte decimale del Bearing

   int fine2 = (int)fine;
   int pitch2 = (int)pitch;
   int roll2 = (int)roll;
  
   Wire.beginTransmission(ADDRESS);           //inizia lettura accelerometro
   Wire.send(16);                             
   Wire.endTransmission();

   Wire.requestFrom(ADDRESS, 6);              // Richiede i 6 byte dell'accelerazione
   while(Wire.available() < 6);              
   high_x = Wire.receive();          
   low_x = Wire.receive();           
   high_y = Wire.receive();          
   low_y = Wire.receive();           
   high_z = Wire.receive();          
   low_z = Wire.receive();           
  
   acc_x = ((high_x<<8)+low_x);      // Calcola accel_x
   acc_y = ((high_y<<8)+low_y);      // Calcola accel_y
   acc_z = ((high_z<<8)+low_z);      // Calcola accel_z

   delay(1000);
 
  Client client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          //gestisce il refresh automatico della pagina per aggiornare
          //al valore dei sensori
          client.println("<meta http-equiv=\"refresh\" content=\"1\">");
         
          tempo = round(millis()/1000);
          client.print("Tempo trascorso (sec): ");
          client.print(tempo);
          client.print("</br></br><table border=1>");
         
          // Stampa il valore del bearing
            client.print("<tr><td>Bearing</td><td>");
            client.print(bearing);
            client.print(".");
            client.print(fine2);
            client.print("</td></tr>");

          // Stampa il valore di Pitch
            client.print("<tr><td>Pitch</td><td>");
            client.print(pitch2);
            client.print("</td></tr>");

          // Stampa il valore di Roll
            client.print("<tr><td>Roll</td><td>");
            client.print(roll2);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su X
            client.print("<tr><td>Acc. Delta X (g)</td><td>");
            float acx = (acc_x-acc_x0)*0.000636364;
            client.print(acx);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Y
            client.print("<tr><td>Acc. Delta Y (g)</td><td>");
            float acy = (acc_y-acc_y0)*0.000636364;
            client.print(acy);
            client.print("</td></tr>");

          // Stampa il valore di Accelerazione su Z
          // il valore di acc su Z senza movimento e' 15400
          // quindi il fattore di correzione e' 9.8/15400 = 0.000636364
            client.print("<tr><td>Acc. Delta Z (g)</td><td>");
            float acz = (acc_z-acc_z0)*0.000636364;
            client.print(acz);
            client.print("</td></tr>");
           
            // salva i valori di accelerazione per il calcolo
            // del delta di accelerazione
            acc_x0 = acc_x;
            acc_y0 = acc_y;
            acc_z0 = acc_z;

          // Stampa il valore Temperatura
          // T = 68.033 exp(-0.2088*R(Kohm))
          // R_sensore = (10.000*5)/(
          int sensor_t = A0;
          int temp = analogRead(sensor_t);
          double v_temp = (temp*5.0)/1023.0; //voltaggio letto dal pin A0
          double r_temp = (50000.0/v_temp)-10000.0; //resistenza del sensore di temperatura
          double temperatura = 68.033*exp(-0.2088*r_temp/1000.0);
            client.print("<tr><td>Temp. (C)</td><td>");
            client.print(temperatura);
            client.print("</td></tr>");

          // Stampa il valore Umidita
          int sensor_u = A1;
          int umi = analogRead(sensor_u);
          double umidita = -((((umi/1023)*5)-0.8)/3.1)*100;
            client.print("<tr><td>RH (%)</td><td>");
            client.print(umidita);
            client.print("</td></tr>");


            client.print("</table>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

Nessun commento:

Posta un commento

Physics informed neural network Fukuzono

Visto che puro ML non funziona per le serie tempo di cui mi sto occupando ed le regressioni basate su formule analitiche mostrano dei limiti...