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)
Dockerizza Flask
Un esempio semplice per inserire in un container Docker una applicazione Flask Partiamo da una semplice applicazione che ha un file app.py ...
-
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
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...
Nessun commento:
Posta un commento