inviare email con arduino al verificarsi di una condizione

ciao a tutti!

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.

avete dei suggerimenti?
grazie:)

Buongiorno ,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (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.

Guglielmo

Sposta la porzione di codice che nel setup invia la mail in una tua funzione Es.

void inviaMail(){
  ...
}

e la richiami nel loop quando il livello è basso/alto Es.

if(lowLevel){
   inviaMail();
}

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&agrave . 


");
             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 &egrave");
             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 &egrave sufficiente per coprire il suo fabbisogno.");
             else clientHTTP.println("<h2 align=center>Il livello dell'acqua &egrave 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

cioè mettere

  clientMail.stop();

dentro l'else che dice

 Serial.println("Connessione non riuscita.");

?

Cioè

if (clientMail.connect(server, 25)) {
      ...
  }
else {
   Serial.println("Connessione non riuscita.");
   Serial.println();
   clientMail.stop();
}