Estou elaborando um Alimentador com RTC, contudo tem um diferencial que este o alimentador é para um aquário com dois peixes. Desta forma eu preciso que ele derrube a ração por 500 millisegundos ou menor, para que saia a dose de ração adequada, o que me prejudica na hora definir um intervalo tão curto.

contudo não está dando certo, na função void alimentador (), o if executa intermitentemente similar ao blink até encerrar o minuto que programei. Eu precisava que ele ativasse o motor apenas uma ex: se for 6 horas liga motor por 500 millis, desliga motor, aguarda dar 6 horas novamente.

segue abaixo o código em que estou trabalhando, ja quebrei bastante a cabeça esse final de semana nele.

Se alguém puder contribuir agradeço.

//código relógio  alimentador  com RTC


#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

int motPin = 12; // pino do motor
int motState = LOW; // status do motor

void setup () {

Serial.begin(9600);
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
pinMode(motPin, OUTPUT);

}

void loop () {

relogio ();
alimentador ();
}

void relogio () { // imprime a hora no serial monitor
DateTime now = rtc.now();

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), 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();
delay(1000);

}

void alimentador (){


DateTime now = rtc.now(); // identifica a hora do RTC


digitalWrite(motPin, motState);
if (motState == HIGH){
Serial.println("ligou");
}
if (now.hour() == 21 && now.minute () == 06){ // hora da ação
  do{
   motState = !motState; // inverte bolean 
   delay (500); // seria o tempo necessário para a dose correta de ração
   break; // deveria encerrar o loop
}
while (0); // fui obrigado colocar para existir o break
}
}//fim do código

me deram uma dica 

  • Função Void() {

  • A=1 

  • While (A==1) {

  • executa função

  • if (horario = horárioesperado) {

  • A=0 // encerra o loop

  • }

  • fecha o while }

  • fecha função void }

contudo quando utilizo esse sistema ele mantem a mesma configuração inicial talvez não esteja executando de forma correta

Exibições: 1262

Responder esta

Respostas a este tópico

Achei confuso esse seu codigo, sugiro uma limpeza:


if ((now.hour() == 21) && (now.minute() == 06) && (now.second()==0)){ // hora da ação
  { Serial.println("ligou"); 

    digitalWrite(motPin, LOW); 

    delay (500); // seria o tempo necessário para a dose correta de ração
    digitalWrite(motPin, HIGH);

    Serial.println("desligou"); 

    delay(600); // garante que para o proximo if de tempo o segundo inicial já passou

 }
}//fim do código

O delay() é um jeito meio simplista de programar, mas para sua necessidade acredito que atenda bem.

Veja se eh isso.

Eduardo obrigado, testei o código e funcionou, vou utiliza-lo assim.

Contudo não sei se é possível, visto que eu pesquisei bastante e não vi ninguém fazer isso, se fosse para fazer assim;

if (now.hour() == 21){ // hora de inicio da ação
  { Serial.println("ligou"); 

    digitalWrite(motPin, LOW); 

    delay (500); // seria o tempo necessário para a dose correta de ração
    digitalWrite(motPin, HIGH);

}

Teria como limitar o numero de loops dentro do intervalo de uma hora, ou sempre vou ser obrigado a informar, hora, minuto e segundos para o Arduíno executar a ação?. 

Sim, tudo é possivel, só ir pegando o jeito da logica.

Teria que ser algo como:

declarar lá no inicio de tudo uma variável que servirá como flag, avisando que já houve disparo.

int jafoi;

...

if (now.hour() == 21){ // hora de inicio da ação
  if (jafoi==0)

   { Serial.println("ligou");

    jafoi=1; 

    digitalWrite(motPin, LOW); 

    delay (500); // seria o tempo necessário para a dose correta de ração
    digitalWrite(motPin, HIGH);

    }

} else jafoi=0;

Assim se for 21h ele vai rodar e marcar que ja fez, desmarca só quando sair de 21h.

Eduardo testei o código para teste descrevi da forma abaixo:

int A;

if (now.minute() == 3){ // hora da ação
if (A == 0 ){
digitalWrite(motPin, LOW);
delay (500); // seria o tempo necessário para a dose correta de ração
digitalWrite(motPin, HIGH);

}
}else A =0;
}

fiz ele como o informado e testei também retirando as linhas " A", contudo ele não diferiu em nenhuma das opções executando  similar ao Blink, infelizmente não aconteceu a ação marcar, se aconteceu ela não fez diferença na forma como foi utilizada.

Eu acredito que deva ser possível, mas como você falou tem que ir pegando o jeito. Só acho estranho que ninguém postou isso ainda.

Thiago pq vc não tenta usar a função millis?

Faltou o A=1 proximo ao delay(500). Acredito que funcione sim.

Boa tarde,

Procure informação sobre está library TimeAlarms.h, acredito que vai lhe ajudar.

Abs

Mauricio Ortega

RSS

© 2021   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço