Un'aiutino? Pompa si accende quando non previsto e non capisco perché

Buongiorno,
Questo è un sistema che mi sono fatto per automatizzare i cambi dell'acquario.
Ma la pompa per riempire l'acquario si accende "da sola" quando non previsto.

Non riesco a capire perché la pompa parte, mi sembra lo sketch sia chiaro, dovrebbe partire solo se il galleggiante è aperto && se è l'ora del cambio (00 e 12) && i minuti sono superiori a quelli dello spegnimento && inferiore a i minuti previsti.

Per me dovrebbe accendersi dalle ore 00.10 alle 00.14, e dalle ore 12.10 alle ore 12.14

Eppure no, sta mattina ho dovuto correre alle 9.16 per staccare la corrente perché avevo tutto allagato.

Non capisco dove sbaglio :frowning:

#include "Wire.h"
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include <avr/wdt.h>             


//millis RTC
unsigned long previousMillisRTC = 0;        // will store last time RTC was updated
const long interval = 1000;              
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Domenica", "Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato"};


//lcd2004
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  
unsigned long previousMillisLCD = 0;        // will store last time Sensore was updated
const long intervalLCD = 250;              // interval at which to check RTC (milliseconds)
#define pulsanteLcd 8                      
int val = 0;                                 
boolean stato = false;


//Elettrovalvola
int valvola = 4;                                       // Pump connected to digital pin 4
int oraAccenzioneValvolaMattina = 00;                  // Ora accenzione Valvola Mattina
int oraAccenzioneValvolaPomeriggio = 12;               // Ora accenzione Valvola Pomeriggio
int minAccenzioneValvola = 00;                         // Minuti accenzione Valvola
int minSpegnimentoValvola = (minAccenzioneValvola + 10);// Minuti Valvola accesa (10min)
int ledValvola = 12;                                   //Per accendere un LED quando la valvola è accesa


//Pompa
int pompa = 7;                                         // Pump connected to digital pin 7
unsigned long previousMillisPompa = 0;                  // will store last time POMPA was updated
int minAccenzionePompa = minSpegnimentoValvola;        // Intervallo per accenzione pompa dopo accenzione Valvola
int minSpegnimentoPompa = (minAccenzionePompa + 4);     // Minuti pompa accesa (4min)
int ledPompa = 13;                                    //Per accendere un LED quando la pompa è accesa


//millis per sensore orizzontale
unsigned long previousMillisSensore = 0;             // will store last time Sensore was updated
//const long interval = 1000;                       // Uguale per RTC e Sensore
int lightPin = 0;                                   // Analog Input LED Sensore
int threshold = 500;                                // 0 chiuso - 1023 aperto



void setup()
{
  wdt_enable(WDTO_1S);         // abilita la funzione watchdog con un tempo di intervento di 1 secondo

  Wire.begin();
  Serial.begin(9600);
  lcd.begin(20, 4);        // initialize the lcd for 20 chars 4 lines, turn on backlight
  //lcd.setCursor(3, 0);    //Start at character 3 on line 0

  //RTC
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  // This line sets the RTC with an explicit date & time, for example to set
  // Anno, mese, giorno, ora, minuti, secondi:
  //rtc.adjust(DateTime(2017, 5, 13, 10, 38, 00));

  //LED power on
  pinMode(ledOn, OUTPUT);

  //LCD
  pinMode(pulsanteLcd, INPUT);
  lcd.noBacklight();


  //Pompa
  pinMode(pompa, OUTPUT);      // sets the digital pin as output
  pinMode(ledPompa, OUTPUT);


  //Elettrovalvola
  pinMode(valvola, OUTPUT);      // sets the digital pin as output
  pinMode(ledValvola, OUTPUT);

} //***Fine SETUP()



void loop()
{
  //LED power on
  digitalWrite(ledOn, HIGH);
  
  {
    //***lcd2004
    unsigned long currentMillisLCD = millis();
    if (currentMillisLCD - previousMillisLCD >= intervalLCD) {
      // save the last time you controlled
      //previousMillisLCD = currentMillisLCD;
      lcd.setCursor(3, 0); //Start at character 4 on line 0
      lcd.print("HELLO, WORLD!");
      
      val = digitalRead(pulsanteLcd);    //legge il valore in input e lo salva in val

      unsigned long currentMillisLCD = millis();
      if (currentMillisLCD - previousMillisLCD >= intervalLCD) {
        previousMillisLCD = currentMillisLCD;
        //se si preme il pulsante e la luce è spenta, stato diventa 1
        if (val == HIGH) {
          stato = not(stato);
          //delay(250);     //introduco un ritardo per risolvere il problema del rimbalzo del segnale
        }

        if (stato) {
          lcd.backlight();     //accende il LED
        }

        else {
          lcd.noBacklight();     //spegne il LED
        }
      }
    }
  }



  //***RTC
  DateTime now = rtc.now();

  unsigned long currentMillisRTC = millis();
  if (currentMillisRTC - previousMillisRTC >= interval) {
    previousMillisRTC = currentMillisRTC;

    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(" ");
    Serial.print(now.day(), DEC);
    Serial.print("/");
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    Serial.println();

    lcd.setCursor(0, 1);              //Start at character 0 on line 2
    //lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
    //lcd.print(" ");
    lcd.print(now.day(), DEC);
    lcd.print("/");
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.print(' ');
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);
    lcd.println("      ");
  }//***Fine RTC


  {
    //***Elettrovalvola
    lcd.setCursor(0, 2);      //Start at character 0 on line 3
    lcd.print("Valvola ");

    unsigned long currentMillisSensore = millis();
    //unsigned long currentMillisValvola = millis();
    if (currentMillisSensore - previousMillisSensore >= interval) {
      // save the last time you blinked the LED
      previousMillisSensore = currentMillisSensore;

      if (now.hour() == oraAccenzioneValvolaMattina && (now.minute() >= minAccenzioneValvola ) && (now.minute() < minSpegnimentoValvola )) {
        digitalWrite(ledValvola, HIGH);       //LED pin 12
        digitalWrite(valvola, HIGH);   // sets the valvola on
        lcd.setCursor(8, 2);
        lcd.print("aperta");
        Serial.print("Valvola ");
        Serial.println("high");
      }
      else if (now.hour() == oraAccenzioneValvolaPomeriggio && (now.minute() >= minAccenzioneValvola ) && (now.minute() < minSpegnimentoValvola )) {
        digitalWrite(ledValvola, HIGH);       //LED pin 12
        digitalWrite(valvola, HIGH);   // sets the valvola on
        lcd.setCursor(8, 2);
        lcd.print("aperta");
        Serial.print("Valvola ");
        Serial.println("high");
      }
      else {
        digitalWrite(ledValvola, LOW);       //LED pin 12
        digitalWrite(valvola, LOW);    // sets the pump off
        lcd.setCursor(8, 2);
        lcd.print("chiusa");
        Serial.print("Valvola ");
        Serial.println("low");
      }
    }
  }//***Fine Elettrovalvola


  {
    //***POMPA
    lcd.setCursor(0, 3);
    lcd.print("Pompa ");

    unsigned long currentMillisPompa = millis();
    if (currentMillisPompa - previousMillisPompa >= interval) {
      // save the last time you blinked the LED
      previousMillisPompa = currentMillisPompa;

      if ((analogRead(lightPin) > threshold ) && (now.hour() == oraAccenzioneValvolaMattina || oraAccenzioneValvolaPomeriggio) && (now.minute() >= minAccenzionePompa) && (now.minute() < minSpegnimentoPompa) ) {
        digitalWrite(ledPompa, HIGH);       //LED pin 13
        digitalWrite(pompa, HIGH);   // sets the pump on
        Serial.print("Pompa ");
        Serial.println("high");
        lcd.setCursor(7, 3);
        lcd.print(" aperta");
      }
      else {
        digitalWrite(ledPompa, LOW);        //LED pin 13
        digitalWrite(pompa, LOW);    // sets the pump off
        Serial.print("Pompa ");
        Serial.println("low");
        lcd.setCursor(7, 3);
        lcd.print(" chiusa");
      }
    }

  }//***Fine Pompa

  wdt_reset();                  // resetta il conteggio del watchdog, se prima di arrivare a questo punto sarà passato più di 1 secondo allora la scheda si resetterà, altrimenti il loop continuerà ad essere eseguito senza problemi

}//***Fine LOOP()

Scusa non ho capito cosa manca?

Il controllo del tempo é molto piú semplice se trasformi ora e minuti in minuti e fai i controlli con i minuti. Se il controllo deve essere piú preciso puó essere neccessario trasformare in secondi.

Ciao Uwe

Oh pensavo che così andasse bene!
Correggo subito, ma non credo possa spiegare che la pompa si accende anche quando non è l'ora, o si?

Modificato, vedremo se era questo il problema!

Stavo pensando che forse dovrei mettere un interrupt sul galleggiante in modo che se si chiude interrompa la pompa in ogni caso no?

Solo che non so se posso usare il sensore che adesso è collegato al pin analogico 5 su un pin digitale? magari il 3 che ha l'interrupt ed è PWM.

Si potrebbe?

Dipende dal sensore che hai collegato all'analogico 5, se lo usci in digitale allora si, se il sensore ha bisogno di un ingresso analogico per essere letto allora no. Comunque potresti pensare di aggiungere un controllo "hardware" sul troppo pieno, se raggiungi il livello massimo interrompi l'alimentazione della pompa a prescindere di cosa dica di fare Arduino, in questo modo anche se il software va in blocco o situazioni simili sei sicuro che l'acqua non fuoriesca, una specie di interruttore d'emergenza che se premuto ferma un macchinario a prescindere dalla programmazione

fabpolli:
... Comunque potresti pensare di aggiungere un controllo "hardware" sul troppo pieno, se raggiungi il livello massimo interrompi l'alimentazione della pompa a prescindere di cosa dica di fare Arduino ...

Direi che, per ovvie ragioni di sicurezza, è la scelta migliore ... qualunque cosa accada un gallegante che stacca la corrente e la soluzione più sicura ! :slight_smile:

Guglielmo

fabpolli:
Dipende dal sensore che hai collegato all'analogico 5, se lo usci in digitale allora si, se il sensore ha bisogno di un ingresso analogico per essere letto allora no. Comunque potresti pensare di aggiungere un controllo "hardware" sul troppo pieno, se raggiungi il livello massimo interrompi l'alimentazione della pompa a prescindere di cosa dica di fare Arduino, in questo modo anche se il software va in blocco o situazioni simili sei sicuro che l'acqua non fuoriesca, una specie di interruttore d'emergenza che se premuto ferma un macchinario a prescindere dalla programmazione

gpb01:
Direi che, per ovvie ragioni di sicurezza, è la scelta migliore ... qualunque cosa accada un gallegante che stacca la corrente e la soluzione più sicura ! :slight_smile:

Guglielmo

Avete ragione, non ci avevo pensato!
Grazie!

Ora Devo solo capire come interfacciare un interruttore che lavora in 12 o 24V con la pompa che lavora in 220V :smiley:

Wado:
Ora Devo solo capire come interfacciare un interruttore che lavora in 12 o 24V con la pompa che lavora in 220V :smiley:

Di questo qui NON puoi parlare o debbo chiudere il thread ... REGOLAMENTO, punto 15.

Guglielmo

gpb01:
Di questo qui NON puoi parlare o debbo chiudere il thread ... REGOLAMENTO, punto 15.

Guglielmo

Capito, Grazie mille

In tanto penso di aver risolto il problema iniziale, sto facendo il collaudo con una lampadina invece che con la pompa (inondare 2 volte il garage mi è servito da lezione :sweat_smile: ) e per ora non si è accesa fuori dell'orario previsto.
Vedremo alle 12.10 se si accende come previsto adesso però! :stuck_out_tongue_closed_eyes: