Duvida - Problema com uso do Millis() multíplos intervalos - ajuda com código

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

Exibições: 579

Responder esta

Respostas a este tópico

o que exatamente o código tem que fazer?

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

 http://pastebin.com/nRxL3dr8

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:

http://forum.arduino.cc/index.php?topic=124974.0

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

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço