arduino e relè wifi ewlink

Salve e tutti, spero di non sbagliare sezione

vi riassumo in breve il progetto

ho un serbatoio che si autoalimenta e lo uso per irrigare, grazie all'apertura dell'elettrovalvola posta alla base.

all'interno del serbatoio ho inserito due sensori di umidità per il terreno che uso per rilevare la presenza dell'acqua, uno impostato come sensore di massimo e uno come sensore di minimo collegati ai relativi led verde e rosso.

adesso ho comprato una scheda relè 4 ch wifi tipo sonoff per poterla gestire da remoto, nella scheda si possono aggiungere i pulsanti (come quelli che si usano nei progetti arduino) per attivare i relè manualmente e quando e il tutto viene rilevato dall'applicazione in remoto.

l'idea è quella di far interagire arduino con il pulsante della scheda relè che gestisce l'uscita dell'elettrovalvola

quindi la sequenza d'uso è :

1 da remoto o fisicamente attivo il relè dell'elettrovalvola
2 i flusso rimane aperto fino a quando il sensore di minimo non rileva più acqua e va a commutare lo spato del pulsante spegnendo il relè e relativa valvola
3 quando il sensore di max rileva la presenza di acqua si ricommuta lo stato del pulsante attivando il relè e quindi l'elettrovalvola

4 il tutto io lo posso monitore da remoto attraverso l'app fino a quando decido di spegnere tutto

ho già scritto e provato il codice con i sensori di max e min i quali azionano il pin 22 dove ho collegato ad un relè che adesso dovrei sostituire con il pulsante.

ecco il codice

/*Sketch per rilevare l'umidita' del terreno (valore analogico) e accendere un led se si raggiunge una soglia critica. */
/*
    50 led rosso livello acqua min 50 mt
    51 led verde livello acqua max 35 mt
    52 led rosso pompa spenta
    53 led verde pompa accesa
    A0 sensore livello acqua max 35 mt
    A1 sensore livello acqua min 50 mt
    22 relè pompa
    
*/
#define pompa 22 // relè pompa
#define led_liv_min 50
#define led_liv_max 51
#define led_pompa_off 52
#define led_pompa_on 53
#define liv_max A0
#define liv_min A1




const int soglia_minima = 800; //sensore di livello mimino
const int soglia_massima = 400; //sensore di livello massimo

void setup()
{
  Serial.begin(9600);
  pinMode(50, OUTPUT);  //led rosso livello acqua min 50 mt
  pinMode(51, OUTPUT);  //led verde livello acqua max 35 mt
  pinMode(52, OUTPUT);  //led verde pompa accesa
  pinMode(53, OUTPUT);  //led rossa pompa spenta
  pinMode(pompa, OUTPUT);  //relè pompa
  pinMode(A0, INPUT);   // sensore livello acqua min 50 mt
  pinMode(A1, INPUT);   // sensore livello acqua max 35 mt

  
}

void loop()
{
  
  int sensorValue_1 = analogRead(A0); //Legge il valore analogico liv MAX
  {

    if (sensorValue_1 <= soglia_massima)
    {
      Serial.println("pompa accesa livello acqua ok");
      digitalWrite(pompa, LOW); //Accendi pompa
      digitalWrite(led_pompa_on, HIGH); //Accendi led VERDE pompa
      digitalWrite(led_liv_max, HIGH); //Accendi led VERDE liv MAX
      digitalWrite(led_liv_min, LOW); //Spegni led ROSSO liv min
      digitalWrite(led_pompa_off, LOW); //Spegni led ROSSO pompa
      
    }
  }

  int sensorValue_2 = analogRead(A1); //Legge il valore analogico liv Min
  {

    if (sensorValue_2 >= soglia_minima)
    {
      Serial.println("pompa spenta livello acqua Basso" );
      digitalWrite(pompa, HIGH); //spegni pompa
      digitalWrite(led_pompa_on, LOW); //Spegni led VERDE pompa
      digitalWrite(led_liv_max, LOW); //Spegni led VERDE liv MAX
      digitalWrite(led_liv_min, HIGH); //Accendi led ROSSO liv min
      digitalWrite(led_pompa_off, HIGH); //Accendi led ROSSO pompa
      
    }
  }

  delay(2000); //Attende due secondi
}

potreste aiutarmi ad integrare il pulsante all'interno del codice.....grazie a tutti

vi allego uno schema di massima

Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta è stato spostato nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato ::slight_smile:

Guglielmo

Non è mica chiaro il funzionamento del tutto.

Hai un serbatoio che si autoalimenta. Che significa? Che c'è un dispositivo che lo mantiene sempre pieno?

Usi due sensori umidità per controllare il livello. A parte l'uso anomalo che ne fai, significa che il sensore di minimo viene sommerso quando il serbatoio è pieno?

Infine il programma. Non capisco come possa funzionare. Sembra che svuoti il serbatoio non appena lo trova pieno.

Puoi spiegare un po' meglio le varie fasi, partendo dal serbatoio vuoto? Mentre si riempie che succede? Arduino è spento? E il pulsante interviene quando? Sempre in qualunque condizione? Solo a serbatoio pieno? Mezzo pieno?

Un po' troppi interrogativi per provare a immaginare.

Ciao,
P.

ciao pgiagno, spero di riuscire a darti tutti le info.....le tue domande sono azzeccate, hai inquadrato perfettamente la cosa!

1 - il serbatoio si alimenta da una piccola sorgente in autonomia, quindi si riempie da solo quando è troppo pieno un semplice galleggiante chiude l'ingresso dell'acqua

2 - il sensore di minimo è collocato quasi sul fondo del serbatoio ed è sempre sommerso nell'acqua ho isolato tutti i collegamenti costruendo con la stampa 3d una sorta di capsula dove ho inserito il sensore e solo le due linguette entrano a contatto con l'acqua

3 - si, il programma è pensato proprio per svuotare il serbatoio ogni volta che è pieno, questo perchè......se devo fornire es. 1000 lt di acqua nell'orto ed il recipiente è da 300 lt ho bisogno che il ciclo pieno vuoto vada avanti per almeno tre volte.

sarebbe bello riuscire ad impostare una cosa del genere cioè es se devo fornire 3 ore di flusso continuo d'acqua che corrispondono ad es a 1000 lt, arduino dovrebbe misurare il tempo di attività del relè che comanda l'elettrovalvola (cioè erogazione d'acqua) e poi spegnere il tutto.....ma ad oggi non ho idea di come possa farlo e se si può.

la fase si articolano casì:

1 - pigio il pulsante o attivo il relè (elettrovalvola) da remoto ed apro il flusso dell'acqua
2 - arduino attraverso i sensori min e max non appena rileva la mancanza d'acqua interviene sul pulsante che fa staccare il relè della scheda(elettrovalvola).
3 - appena arduino rileva l'acqua con il sensore di max interviene nuovamente sul pulsante ed attiva il relè (elettrovalvola).

questo a ciclo continuo fono a quando non interrompo il ciclo spegnando tutto

perchè collegare arduino al pulsante e non direttamente all'elettrovalvola? ti starai chiedendo, se uso la scheda relè wifi da remoto tramite app posso monitorare se sto irrigando o se è spento in attesa che si riempia nuovamente il serbatoio e decidere di spegnere il tutto.

il pulsante funziona solo quando il serbatoio è pieno perchè se il sensore di massimo non rileva acqua non si avvia.

spero di aver trasferito tutto quello che ho realizzato e vorrei realizzare, nel descrivere un progetto (racchiuso nella mia testa) a parole non è semplice visti i vari aspetti, molte cose avvolte sfuggono....ed è solo una parte , lo sto realizzando a step l'idea è molto più articolata......grazie !

Allora proviamo a scrivere in italiano il programma di quello che vuoi fare.

Premetto che non sono sicuro che i sensori di umidità funzionino come credi tu, ma con un paio di prove te ne puoi assicurare. È necessario scegliere UN SOLO valore discriminante per i sensori. Potresti sceglere il valore 612 che sta a metà fra 0 e 1023. Se il valore è maggiore o uguale a 612 il sensore è immerso, se è minore di 612 il sensore NON è immerso. Devi verificare innazi tutto questi valori immergendo il sensore in un bicchiere e tirandolo fuori SENZA ASCIUGARLO. Verifica il valore a sensore immerso e a sensore NON immerso, ma bagnato, e regola il valore di riferimento sulla metà della somma dei due valori che hai trovato.

Definiamo un po' di variabili

livelloBagnato = è il valore che hai trovato con la procedura di cui sopra

sensoreMassima = è il sensore che fornisce un segnale analogico in input >= livelloBagnto quando è sommerso, e < livelloBagnato quando no
ledVerdeLivelloMax = è acceso quando il sensoreMassima >= livelloBagnato, e spento quando il sensoreMassima è < livelloBagnato

sensoreMinima = è il sensore che fornisce un segnale analogico in input >= livelloBagnto quando è sommerso e < livelloBagnato quando no
ledRossoLivelloMin = è acceso quando il sensoreMinima < livelloBagnato, e spento quando il sensoreMinima è >= livelloBagnato

RELEpompa = è il comando della pompa, HIGH a pompa accesa, LOW a pompa spenta
ledRossoPompa = è acceso quando la pompa è spenta, e spento quando la pompa è accesa
ledVerdePompa = è acceso quando la pompa è accesa, e spento quando la pompa è spenta
statoPompa = è uguale a ON (equivalente a true) quando la pompa è accesa e uguale a OFF (equivalente a false) quando è spenta

pulsantePremuto = segnala se il pulsante è stato premuto e quindi il ciclo si deve ripetere indefinitamente fino allo spegnimento del tutto

//SITUAZIONE INIZIALE: SERBATOIO PIENO, PULSANTE RILASCIATO, POMPA FERMA
Nel setup
pulsantePremuto = false

//SITUAZIONE A REGIME: A PULSANTE PREMUTO E SERBATOIO PIENO IL CICLO DI SVUOTAMENTO CONTINUA FINO ALLO SPEGNIMENTO DEL TUTTO
Nel loop

SE sensoreMassima >= livelloBagnato
 ledVerdeLivelloMax = HIGH
 ledRossoLivelloMin = LOW
 SE pulsantePremuto = true
   RELEpompa = HIGH
 SE statoPompa = ON
   ledVerdePompa HIGH
   ledRossoPompa LOW
 ELSE
   ledVerdePompa LOW
   ledRossoPompa HIGH
SE sensoreMassima < livelloBagnato E sensoreMinima >= livelloBagnato
 ledVerdeLivelloMax = LOW
 ledRossoLivelloMin = LOW
 SE statoPompa = ON
   ledVerdePompa HIGH
   ledRossoPompa LOW
 ELSE
   ledVerdePompa LOW
   ledRossoPompa HIGH
SE sensoreMinima < livelloBagnato
 ledVerdeLivelloMax = LOW
 ledRossoLivelloMin = HIGH
 RELEpompa = LOW
 statoPompa = OFF
 ledVerdePompa LOW
 ledRossoPompa HIGH

SE pulsante = premuto E sensoreMassima >= livelloBagnato
 pulsantePremuto = true
 RELEpompa = HIGH
 statoPompa = ON
 ledVerdePompa HIGH
 ledRossoPompa LOW

Con questo programma il ciclo si ripete all'infinito. Per fermarlo devi spegnere tutto. Vedi come fare per programmare un numero definito di cicli (ad esempio: 3) o come fare per spegnerlo senza togliere corrente al tutto.

Ciao,
P.

Io non sono un esperto, i consigli già dati da pgiagno dovrebbero averti già messo sulla buona strada, aggiungo solo un paio di considerazioni:

  1. per il tuo progetto cerca "macchina a stati" ( cerca "arduino macchina a stati" ) ti aiuterà a comprendere meglio il funzionamento e fare in modo che in caso di modifica al programma tu possa intervenire con più semplicità.

  2. se hai bisogno di "wifi" e in ogni caso vuoi verificare il funzionamento e lo stato dell'irrigazione, anziché fare una catena arduino --> ewlink, valuta un ESP8266 (che è presente nei prodotti sonoff) o meglio ancora un ESP32. Ci sono molte guide su come comandare gli ESP via WiFi.

salve e tutti e grazie per il sostegno,

gentile Pgiagno il problema di accendere e spegnere la scheda arduino lo risolvo alimentandolo attraverso uno dei 4 relè della scheda wifi quindi lo posso accedere e spegnere anche da remoto

ho letto il tuo skecht e sto cercando di scriverlo nel modo corretto(anche se sono una schiappa), ma nel frattempo mi è venuta un'idea vediamo cosa ne pensate ......cioè nel codice che ho postato all'inizio il relè che attiva pompa è acceso o spento a seconda di come si trovano i sensori, e funziona bene perchè l'ho stestato più volte, l'aspetto che dovrei cambiare è il funzionamento del relè, invece di restare aperto o chiuso dovrebbe soltanto fornire un impunso di un secondo (tipo pigiare il pulsante) e poi restare spento fino al successovo combio di stato dei sensori, ho provato ad inserire un delay ma continua sempre ad andare in loop e quindi si accende e spegne continuamente. come posso risolvere?

gentile khriss75 ho dato uno sguardo all'argomentodella macchian a stati che mi hai suggerito è molto valido ma visto che non ne so molto prima d ricominciare a scrivere tutto il codice vorrei cercare se possibile di completare e rendere funzionante questo. per il wifi ho già i pezzi e comprarne di nuovi proprio non mi va vediamo se l'esperimento funziona!

grazie a tutti

Per farlo devi usare millis() non delay(). Prova a leggere qui e qu.

Devi predisporre una variabile booleana che setti come false nel setup(). Se il serbatoio è pieno e la variabile è false viene acceso il relè della pompa (che a questo punto, da quanto hai detto, diventa un pulsante), viene cambiato lo stato della variabile da false a true, per impedire che continui ad accendere il relè della pompa, e memorizzato l'istante di accensione. Trascorso il tempo (1 secondo, calcolato con millis()) il relè della pompa viene spento. Quando il livello tocca il minimo la variabile viene riportata a false e, non appena il serbatoio è pieno il ciclo ricomincia.

Ciao,
P.

salve a tutti,
ho fatto un pò di prove premetto che usando il delay ed aggiungedo un'altro if (sensore max asciutto e sensore min bagnato) pin pompa, high......funziona tutto.

seguendo il vostri suggerimenti ho cercato di lavorare utilizzandi i millis perchè altrimenti dovrei inserire un delay di cirda 20 min dopo il primo if per dar il tempo al sensore di massimo di non essere più immerso altrimenti mi entrerebbe nuovamente nel primi if spegnendo questa volta la pompa

vi allego il codice .....praticamente è come se la parte di codice con i millis non la legge

#define pompa 22 // relè pompa
#define led_liv_min 50
#define led_liv_max 51
#define led_pompa_off 52
#define led_pompa_on 53
#define liv_max A0
#define liv_min A1

const int soglia_minima = 800; //sensore di livello mimino
const int soglia_massima = 400; //sensore di livello massimo
const int soglia_bagnato = 600; //sensore di livello bagnato
int sensorValue_1 = analogRead(A0); //Legge il valore analogico liv MAX
int sensorValue_2 = analogRead(A1); //Legge il valore analogico liv MIN
int stato = 600;
int pausa = 10000;
long ultimaLettureTempo = 0;



void setup() {
  Serial.begin(9600);
  pinMode(50, OUTPUT);  //led rosso livello acqua min 50 mt
  pinMode(51, OUTPUT);  //led verde livello acqua max 35 mt
  pinMode(52, OUTPUT);  //led verde pompa accesa
  pinMode(53, OUTPUT);  //led rossa pompa spenta
  pinMode(pompa, OUTPUT);  //relè pompa
  pinMode(A0, INPUT);   // sensore livello acqua min 50 mt
  pinMode(A1, INPUT);   // sensore livello acqua max 35 mt
}

void loop() {
  int sensorvalue_1 = analogRead(A0); //Legge il valore analogico liv MAX
  int sensorvalue_2 = analogRead(A1); //Legge il valore analogico liv MIN

  if (sensorvalue_1 < soglia_bagnato and sensorvalue_2 < soglia_bagnato)
  {
    Serial.println("pompa accesa livello acqua ok");
    digitalWrite(pompa, LOW); //Accendi impulso relè pompa
    delay (500);
    digitalWrite(pompa, HIGH); //Spegni Accendi impulso relè pompa
    digitalWrite(led_pompa_on, HIGH); //Accendi led VERDE pompa
    digitalWrite(led_liv_max, HIGH); //Accendi led VERDE liv MAX
    
      digitalWrite(led_liv_min, LOW); //Spegni led ROSSO liv min
      digitalWrite(led_pompa_off, LOW); //Spegni led ROSSO pompa
    }
    ultimaLettureTempo = millis(); //memorizza il tempo
    if (millis() - ultimaLettureTempo > pausa)
    {
      digitalWrite(pompa, HIGH);
    }
  
  if (sensorvalue_1 > soglia_bagnato and sensorvalue_2 < soglia_bagnato)
  {
    Serial.println("pompa a regime livelli ok");
    digitalWrite(pompa, HIGH);
    digitalWrite(led_pompa_on, HIGH); //Accendi led VERDE pompa
    digitalWrite(led_liv_max, HIGH); //Accendi led VERDE liv MAX
      digitalWrite(led_liv_min, LOW); //Spegni led ROSSO liv min
      digitalWrite(led_pompa_off, LOW); //Spegni led ROSSO pompa
    }
  
  if (sensorvalue_1 > soglia_bagnato and sensorvalue_2 > soglia_bagnato)
  {
    Serial.println("livello basso pompa spenta");
    digitalWrite(pompa, LOW); //Accendi impulso relè pompa
    delay (500);
    digitalWrite(pompa, HIGH); //Spegni Accendi impulso relè pompa
    digitalWrite(led_liv_min, HIGH); //Accendi led ROSSO liv min
    digitalWrite(led_pompa_off, HIGH); //Accendi led ROSSO pompa
      digitalWrite(led_pompa_on, LOW); //Spegni led VERDE pompa
      digitalWrite(led_liv_max, LOW); //Spegni led VERDE liv MAX}

    }
    ultimaLettureTempo = millis(); //memorizza il tempo
    if (millis() - ultimaLettureTempo > pausa)
    {
      digitalWrite(pompa, HIGH);
    }
  
  delay(5000);
}

mi sono incartato.... :o

Sì, ti sei incartato.

Per cominciare se avessi utilizzato la Formattazione automatica dell'IDE avresti visto che la parte

 ultimaLettureTempo = millis(); //memorizza il tempo
 if (millis() - ultimaLettureTempo > pausa)
 {
   digitalWrite(pompa, HIGH);
 }

è FUORI dalle istruzioni

 if (sensorvalue_1 < soglia_bagnato and sensorvalue_2 < soglia_bagnato)
   .  .  .
 if (sensorvalue_1 > soglia_bagnato and sensorvalue_2 < soglia_bagnato)
   .  .  .

e quindi viene eseguita SEMPRE, e per ben DUE volte, quindi l'istruzione

 if (millis() - ultimaLettureTempo > pausa)

è SEMPRE FALSA, e la pompa non viene spenta.

Avevo corretto il programma precedente, ma se questo funziona, bene così

Ciao,
P.