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
#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()