Estou com dificuldades na função controlaIrrigacao().
Criei uma condição para que quando chegue em uma determinada hora o sistema de irrigação ligue com uma frequencia menor.
O padrão seria de 15 minutos ligado e 15 minutos desligado.
No exemplo abaixo eu deixei de 1 em 1 minuto para ficar mais facil de visualizar.
A questão que mesmo a condição sendo verdadeira a variavel não se altera.
long OnTime = 0; // milliseconds of on-time
long OffTime = 0; // milliseconds of off-time
if ((t.hour >= OnHour && t.min >= OnMin) && (t.hour <= OffHour && t.min <= OffMin)) {
OnTime = (15 * 60000);
OffTime = (80 * 60000);
} else {
OnTime = (estadoOn * 60000);
OffTime = (estadoOff * 60000);
Link do fonte todo.
Simplifiquei para ficar mais facil a leitura do codigo.
#include <DS3231.h>
// Rele de acionamento da bomba de irrigação
#define pin_rele_rain 10
// Init the DS3231 using the hardware interface
DS3231 rtc(SDA, SCL);
Time t;
static byte estadoSTR1 = 1;
static byte estadoOn = 1;
static byte estadoOff = 1;
const int OnHour = 17;
const int OnMin = 16;
const int OffHour = 17;
const int OffMin = 20;
long OnTime = 0; // milliseconds of on-time
long OffTime = 0; // milliseconds of off-time
int state_reles_rain = LOW;
unsigned long startMillis = 0;
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
void setup() {
Serial.begin(9600);
rtc.begin();
pinMode (pin_rele_rain, OUTPUT); //Rele do sistema de irrigação
}
void loop() {
t = rtc.getTime();
unsigned long currentMillis = millis();
if ((t.hour >= OnHour && t.min >= OnMin) && (t.hour <= OffHour && t.min <= OffMin)) {
OnTime = (15 * 60000);
OffTime = (80 * 60000);
} else {
OnTime = (estadoOn * 60000);
OffTime = (estadoOff * 60000);
switch (estadoSTR1)
{
case 0x01:
if (estadoSTR1 == 1 && startMillis == 0) {
startMillis = currentMillis;
state_reles_rain = HIGH;
digitalWrite(pin_rele_rain, state_reles_rain);
}
if ((state_reles_rain == LOW) && (currentMillis - previousMillis >= OnTime))
{
state_reles_rain = HIGH; // turn it on
previousMillis = currentMillis;
digitalWrite(pin_rele_rain, state_reles_rain); // Update the actual LED
} else if ((state_reles_rain == HIGH) && (currentMillis - previousMillis >= OffTime))
{
state_reles_rain = LOW;
previousMillis = currentMillis;
digitalWrite(pin_rele_rain, state_reles_rain);
}
break;
case 0x02:
startMillis = currentMillis;
state_reles_rain = LOW; // turn it on
digitalWrite(pin_rele_rain, state_reles_rain);
break;
}
}
}
OnTime e Offtime deveriam ser unsigned long também, apenas por uma questão de consistência e prevenir possíveis problemas no futuro.
Os teus cálculos, como este:
OnTime = (estadoOn * 60000);
Não precisam de estar dentro de parêntesis. Tira porque torna tudo confuso.
Estas variáveis:
static byte estadoSTR1 = 1;
static byte estadoOn = 1;
static byte estadoOff = 1;
São globais, logo não precisam da palavra static à frente delas.
O que é que pretendes atingir com este cálculo??
OnTime = (estadoOn * 60000);
OffTime = (estadoOff * 60000);
Porque não teres apenas o número de milisegundos??
Já imprimiste a hora e os minutos do RTC para comprovar que o relógio está a andar e, mais importante ainda, que a hora é representada entre 0 e 23 e não entre 0 e 11??
A lógica que colocaste dentro do switch case nunca funcionará... explica o que pretendes já que me parece que estás a complicar o que é simples.