Bom dia garagistas,
Estou tentando executar uma ação com múltiplos intervalos e estou usando millis() no lugar de delay, o testei com 1 funcionou certinho, mas quando aumento quantidade o código buga e não estou conseguindo melhorar, preciso de uma luz, já faz uns 3 dias que estou quebrando a cabeça
segue o link para o código no pastebin http://pastebin.com/NuhF7UjE
Tags:
minha ideia inicialmente é tipo um sistema de de irrigação com intervalos diferenciados para períodos claros e períodos escuros
mas no caso quando for identificado noite acionaria 4 segundos a cada 2 horas, e quando dia a cada 1 hora por exemplo.
deixei para teste com 1 seg e 4 segundos para visualização, mas ele não esta fazendo a leitura correta dos intervalos, ou as vezes trava num void só.
não sei se fiz certo. da uma olhada
unsigned long noite = 2L * 60L * 60L * 1000L;
unsigned long dia = 1L * 60L * 60L * 1000L;
unsigned long val = 4L * 1000L;
unsigned long compirriga = 0;
unsigned long compdia = 0;
unsigned long compnoite = 0;
boolean dianoite = 0;
boolean irriga=0;
int ValvPin = 13;
int ldrPin = 1; //LDR no pino analígico 8
int ldr = 0;//Valor lido do LDR
void setup() {
pinMode(ValvPin, OUTPUT);
compdia = millis();
compnoite = millis();
}
void loop() {
unsigned long tempo = millis();
ldr = analogRead(ldrPin);
if (ldr >= 800) {dianoite=0;}else{dianoite=1;}
if( dianoite==0 & tempo - compnoite > noite) {
irriga=1;
compirriga=millis();
compnoite = millis();
}
if( dianoite==1 & tempo - compdia > dia) {
irriga=1;
compirriga=millis();
compdia = millis();
}
if (irriga==1 & tempo - compirriga > val){
digitalWrite(ValvPin,HIGH);
}else {irriga=0;digitalWrite(ValvPin,LOW);}
}
Napster, obrigado pela ajuda testei aqui, ficou bem sucinto o código, mas infelizmente não funcionou, mas dei umas corrigidas nele, no entanto encontrei a falha.
Segue o link corrigido
Achei interessante o seu método de controle do millis, mas não entendi muito a logica , parece mais simples, teria como explicar?
qual a parte que você modificou? nao achei kkkk
e depois que vocÊ modificou fiko funcionando?
você esqueceu o LOW no final, mas não funcionou, mas tambem não vi erro de logica
Murta bem lembrado do multitarefa, um post desse ai era meu hehe, vou ter de estudar de novo.
Achei um novo jeito bacana de fazer o blinkWhitoutDelay
#define runEvery(t) for (static uint16_t _lasttime;//variavel que realiza a contagem do tempo\
(uint16_t)((uint16_t)millis() - _lasttime) >= (t);\
_lasttime += (t))
//exemplo
void loop() {
runEvery(500) Serial.println("500 milliseconds have passed since last printed");
runEvery(100) { // função que executa a thread
Serial.print("Sensor Value: ");
Serial.println(analogRead(A1));
}
os detalhes da macro esta nesse link abaixo:
Bom dia TA.
S
será que falta um fecha parentesis antes do ; nesta linha ?
#define runEvery(t) for (static uint16_t _lasttime;//variavel que realiza
RV
Boa tarde RV, boa pergunta, eu testei e funciona, mas parece que não tolera um intervalo muito grande
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por