ho creato un sketch che consente di inviare email tramite arduino da un account libero a uno gmail (seguendo il tutorial sul playground), e uno sketch che rileva il livello dell'acqua e tramite l'ip della ethernet shield visualizza sul browser il valore del livello nei casi in cui esso è al di sopra o al di sotto di una certa soglia.
ora vorrei unire i due sketch, cioè vorrei che quando il livello dell'acqua scende al di sotto della soglia venga inviata una email.
il problema è che la misura del livello viene fatta nel loop ovviamente, mentre l'email viene inviata nel setup: l'ideale sarebbe poter passare il valore misurato nel setup, cosa che mi sembra impossibile.
Buongiorno ,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiQUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
si ho fatto due funzioni, una che invia l'email, una per fare la richiesta dalla pagina web con ip dell'arduino:se il livello è sotto la soglia manda la mail.
dovrebbe mandarla.
il punto è che sembra che le due funzioni non riescano a coesistere.
#include <SPI.h>
#include <Ethernet.h>
int analogInPin = A0;
int sensorValue = 0;
int time = 1000;
int wait = 1000;
int precedente=0;
// SEZIONE VARIABILI PER LE MAIL DI NOTIFICA
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte server[] = { 212, 48, 24, 41 }; // Server SMTP di libero
String ServerName = "smpt.libero.it";
String Sorgente = "xxxxx@libero.it";
String Destinazione = "yyyyy@gmail.com";
String Titolo = "ARDUINO NOTE - LIVELLO ACQUA CISTERNA CRITICO";
String Mess = "Attenzione! Il contenuto d'acqua della cisterna sta per esaurirsi. Contattare l'amministratore del sistema!";
String Risposta="";
String User = "xxxxxx64"; //xxxxx@libero.it in Base 64
String Pass = "zzzzzz64"; //password in Base 64
EthernetClient clientMail;
// SEZIONE VARIABILI PER LE RICHIESTE HTTP
EthernetClient clientHTTP;
EthernetServer serverHTTP(80);
int sogliaCritica=600;
void setup()
{
Serial.begin(9600);
// delay(1000);
//Ethernet.begin(mac);
//delay(2000);
pinMode( analogInPin, INPUT);
}
void loop()
{ sensorValue = analogRead(analogInPin);
Serial.print("sensor = " );
Serial.println(sensorValue);
if (sensorValue>sogliaCritica)
{precedente=0;
richiestaHTTP();
}
delay(1000);
if ((sensorValue<50) and (precedente==0)){
precedente=1;
Serial.begin(9600);
Serial.println("Program started, waiting for router...");
delay(time); /* allow the router to identify the Arduino before the Arduino connects to the internet */
Serial.println("Starting network module...");
Ethernet.begin(mac);
delay(2000);
Serial.println("connecting...");
/*if (analogRead(A0)>sogliaCritica) richiestaHTTP();
else */invioMail();
}
}
void richiestaHTTP(){
Serial.println("Inizio fase HTTP.");
delay(5000);
//Inizio fase richiesta HTTP utente
EthernetClient clientHTTP = serverHTTP.available();
if (clientHTTP)
{while(clientHTTP.connected())
{
// Inizio del codice HTML
clientHTTP.println("<html>");
clientHTTP.println("<head><title>Livello acqua</title></head>");
clientHTTP.println("<body bgcolor='#f0ffff'>");
clientHTTP.println("<p>
");
clientHTTP.println("<h1 align=center> Università .
");
clientHTTP.println("<h2 align=center> Benvenuti nel portale della struttura.
");
clientHTTP.println("In questa pagina potete verificare il livello d'acqua della vostra struttura.
");
clientHTTP.println("<h1 align=center><b> Il livello dell'acqua è");
clientHTTP.println(analogRead(A0));
clientHTTP.println(" millimetri</b></p>");
clientHTTP.println("</body>");
clientHTTP.println("</html>");
//Controllo il livello d'acqua al momento della richiesta dell'utente
if( analogRead(A0)>sogliaCritica) clientHTTP.println("<h2 align=center>Il livello d'acqua è sufficiente per coprire il suo fabbisogno.");
else clientHTTP.println("<h2 align=center>Il livello dell'acqua è al di sotto del valore di soglia. Non faccia sprechi per il momento.");
clientHTTP.stop();
}
}
}
void invioMail(){
if (clientMail.connect(server, 25)) {
Serial.println("Connesso al server SMTP di Libero.");
ClientReq("EHLO " + ServerName);
ClientReq("AUTH LOGIN ");
ClientReq(User);
ClientReq(Pass);
ClientReq("MAIL From:<" + Sorgente +">");
ClientReq("RCPT To:<" + Destinazione + ">");
ClientReq("DATA");
ClientReq("To: " + Destinazione);
ClientReq("From: " + Sorgente);
ClientReq("Subject: "+ Titolo);
ClientReq("");
ClientReq(Mess);
ClientReq("");
ClientReq(".");
ClientReq("QUIT");
} else {
Serial.println("Connessione non riuscita.");
}
if (!clientMail.connected()) {
Serial.println();
clientMail.stop();
for(;;);
}
}
//Funzione che invia il messaggio al server e attende risposta
void ClientReq(String messaggio) {
clientMail.println(messaggio);
Serial.println("Client: " + messaggio);
delay(1000);
ServerResp();
}
//Funzione che legge la risposta del server
void ServerResp() {
if (clientMail.available()) {
char c = clientMail.read();
while (clientMail.available()) {
Risposta +=c;
c = clientMail.read();
}
Serial.println("Server: " + Risposta);
Risposta="";
}
}
Definisci non riescano a coesistere, perchè il tuo codice compila in modo corretto, da solo un warning di eccessivo uso di memoria, che potrebbe rientrare eliminando le stringhe di debug o spostandole a mezzo della funzione F().
Cosa non funziona?
Dopo una breve lettura del codice ho notato che se fallisci la connessione al server mail
if (!clientMail.connected()) {
Serial.println();
clientMail.stop();
for(;;);
}
blocchi tutto il programma in modo indefinito con il for forse è quello che non torna nell'esecuzione, al primo fallimento di connessione il programma di fatto non esegue mai più il loop
fabpolli:
Definisci non riescano a coesistere, perchè il tuo codice compila in modo corretto, da solo un warning di eccessivo uso di memoria, che potrebbe rientrare eliminando le stringhe di debug o spostandole a mezzo della funzione F().
Cosa non funziona?
coesistere nel senso che l'email è inviata correttamente solo se la parte di pagina html in richiestaHTTP() è commentata, altrimenti non la invia o invia una mail senza oggetto e senza contenuto.
fabpolli:
Dopo una breve lettura del codice ho notato che se fallisci la connessione al server mail
if (!clientMail.connected()) {
Serial.println();
clientMail.stop();
for(;;);
}
blocchi tutto il programma in modo indefinito con il for forse è quello che non torna nell'esecuzione, al primo fallimento di connessione il programma di fatto non esegue mai più il loop
eliminando il for mi dà connessione non riuscita all'infinito
Innanzitutto proverei a spostare l'inizializzazione della scheda ethernet dal loop al setup (è già presente ma commentato) tanto serve farlo solo una volta poi metti le varie stringhe che invii a mezzo seriale o altro dentro la funzione F che ti libera un po' la memoria se è quello il problema potrebbe risolvere.
Inoltre la parte che ti segnalavo prima spostala dentro il rampo else e prova ad eliminare
if (!clientMail.connected()) {
e
for(;;);
e controlla cosa succede, anche perché salvo sbalzi di lettura del sensore la funzione dovrebbe essere richiamata una sola volta se viene raggiunta la soglia minima e mai più finché la il valore letto non torni nel range corretto