Go Down

Topic: Problema com a rotina de tempo dentro de uma função (Read 92 times) previous topic - next topic

brunofranrodrigues

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.
https://drive.google.com/open?id=1VxcMq6P0ZxEh_OiaATS5PMZTWLe6SuqH

brunofranrodrigues

Simplifiquei para ficar mais facil a leitura do codigo.

Code: [Select]

#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;
    }
  }
}

bubulindo

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:

Code: [Select]
OnTime = (estadoOn * 60000);

Não precisam de estar dentro de parêntesis. Tira porque torna tudo confuso.

Estas variáveis:

Code: [Select]

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??

Code: [Select]
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.
This... is a hobby.

Go Up