come utilizzare 2 sensori per accendere e spegnere 1 relè

salve a tutti, premetto che sono un neofita e da poco mi sono avvicinato ad arduino, ciò premesso mi sto costruendo una centralina per il controllo di una pompa dell’acqua posta all’interno di un pozzo dove il livello dell’acqua non è continuo, cioè posso attingere per un numero di ore variabile a seconda del periodo, quindi da qui l’esigenza di creare una centralina che possa accende la pompa quando il livello dell’acqua è al massimo ( quindi ad ogni primo avvio) spegnerla quando va al minimo (automaticamente) e riattivarla in automatico quando il livello raggiunge nuovamente il massimo e così via fin quando non lo spengo il pulsante (che ancora devo inserire nel progetto :confused: ).

ho utilizzato come sensori di livello di max e min due sensori per l’umidità de terreno incapsulati in appositi gusci stampati in 3d Vedi per sigillare i contatti immersi.

ho scritto quasi tutto mi blocco quando devo impostare il sensore collegato al pin A0 liv min quindi spegne tutto e accende i due led rossi 1 pompa spenta e l’altro liv acqua min ed il sensore collegato al pin A1 liv massimo che accende tutto

HELP

/*
 *  50 led rosso livello acqua min 50 mt
    51 led verde livello acqua max 35 mt
    52 led verde pompa accesa
    53 led rossa pompa accesa 
    A0 sensore livello acqua min 50 mt
    A1 sensore livello acqua max 35 mt
    22 relè pompa
    8 alimentazione led sensore umidità
*/
#define pompa 22 // relè pompa



const int soglia_critica = 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 accesa 
  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 = analogRead(A0); //Legge il valore analogico
  {Serial.println(sensorValue); //Stampa a schermo il valore
  
  if (sensorValue >= soglia_critica)
  digitalWrite(50,HIGH); //Accendi led ROSSO
    
  else
      digitalWrite(50,LOW); //Spegni led ROSSO
      
 if (sensorValue <= soglia_critica)
    digitalWrite(51,HIGH); //Accendi led VERDE
    
  else
      digitalWrite(51,LOW); //Spegni led VERDE    
     
  if (sensorValue >= soglia_critica)
    
    digitalWrite(pompa,HIGH); //Accendi RELE
    
  else
    
      digitalWrite(pompa,LOW); //Accendi RELE  
      
   if (sensorValue <= soglia_critica){
    Serial.println("pompa accesa livello acqua ok");
    digitalWrite(53,HIGH); //Accendi led VERDE
    digitalWrite(52,LOW); //Spegni led ROSSO
   }
  else {
    Serial.println("pompa spenta livello acqua Basso" );
    digitalWrite(52,HIGH); //Accendi led ROSSO
    digitalWrite(53,LOW); //Spegni led VERDE
  }}


  int sensorValue = analogRead(A1); //Legge il valore analogico
  {Serial.println(sensorValue); //Stampa a schermo il valore
  
  if (sensorValue >= soglia_critica)
  digitalWrite(50,HIGH); //Accendi led ROSSO
    
  else
      digitalWrite(50,LOW); //Spegni led ROSSO
      
 if (sensorValue <= soglia_critica)
    digitalWrite(51,HIGH); //Accendi led VERDE
    
  else
      digitalWrite(51,LOW); //Spegni led VERDE    
     
  if (sensorValue >= soglia_critica)
    
    digitalWrite(pompa,HIGH); //Accendi RELE
    
  else
    
      digitalWrite(pompa,LOW); //Accendi RELE  
      
   if (sensorValue <= soglia_critica){
    Serial.println("pompa accesa livello acqua ok");
    digitalWrite(53,HIGH); //Accendi led VERDE
    digitalWrite(52,LOW); //Spegni led ROSSO
   }
  else {
    Serial.println("pompa spenta livello acqua Basso" );
    digitalWrite(52,HIGH); //Accendi led ROSSO
    digitalWrite(53,LOW); //Spegni led VERDE
  }}   
      
      
  delay(2000); //Attende due secondi
}

Mi piacerebbe tanto anche capire tramite un contatore a che orario stacca e a che ora riattacca il relè che dovrebbe azionare la pompa per avere una contezza di quanto tempo ho irrigato.

grazie a tutti

Ti ricordo che il codice va chiuso nei tag CODE e non nei tag delle tabelle.

Cortesemente edita il tuo post, come già ti dissi in altro thread, e sistemalo. Grazie.

Guglielmo

Grazie, ho provveduto spero vada bene

penso di esserne venuto a capo

/*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, HIGH); //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, LOW); //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
}

testato sembra funzionare

adesso dovrei inserire un pulsante per avviare ed interrompere il ciclo come posso fare?

Che sensore hai utilizzato e come è stato collegato?
Io so che se il sensore è fatto da 2 contatti e viene alimentato in continua per la presenza dei sali dissolti nell'acqua si forma, sui contatti, per effetto dell'elettrolisi un ossidazione che altera il valore della resistenza letto.

Se sai collegare un tasto ad Arduino Hai fatto metà del lavoro. Una volta fatto questo la parte software è molto facile:
1)
Crei una define che dica il PIN a cui è collegato il tasto, magari una seconda che dica se è pullup o meno ed una terza che dica quale è lo stato di premuto. Inoltre crei sempre come variabile globale una variabile tipo byte o bool che contenga lo stato del progetto ( deve andare = 1 non deve andare = 0). Aggiungi infine una variabile sempre byte o bool che ricordi se il pulsante non è ancora stato rilasciato.

Nella setup fai la pinMode() del pulsante, dichiarandolo come INPUT. Per attivare l’eventuale pull up interno ti basterà effettuare una digitalwrite sul pulsante con come secondo parametro il valore della seconda define. digitalWrite (PULSANTE, PULLUP);

Nella loop() aggiungi le seguenti righe di codice

if (digitalRead (PULSANTE)==PREMUTO && giapremuto==0)
{
statoprogramma=!statoprogramma;
giapremuto=1;
}
else
giapremuto=0;

Racchiude l’intero codice che esegue il ciclo da far partire o fermare col pulsante all’interno delle giraffe di una if, con per condizione che stato programma sia uguale a 1.

Chiaro?