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();
}
}
Iscriviti a:
Commenti sul post (Atom)
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...

-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
Nessun commento:
Posta un commento