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
Tags:
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.
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por