Olá, Pessoal eu de novo, como eu faço para adaptar essa rotina trocando o delay pelo millis, já estudei e fiz de tudo mas não consegui fazer funcionar.

a ideia é que quando um objeto entra no sensor ele desliga o rele por 3 segundos e depois liga novamente. no delay funciona perfeitamente mas esta interferindo em outra tarefa executada ao mesmo tempo.

void loop(){
  entrada = !digitalRead(sensor);
  if (entrada == HIGH ){
    flag = 1;
    }
    while(flag==1){
      digitalWrite(rele,HIGH);
      segundos–;
      delay(1000);
      if(segundos == 0){
        segundos = 5;
        flag = 0;
        digitalWrite(rele, LOW);
        delay(3000);
      }
   }
  delay(200);
}

Exibições: 462

Responder esta

Respostas a este tópico

Olhe este artigo que é bem detalhado e didático, mostrando como fazer dois LEDs piscarem em tempos diferentes em duas tarefas executadas simultaneamente. Tenho certeza que vai ajudar a resolver seu caso.
https://www.filipeflop.com/blog/subtituindo-delay-por-millis-no-ard...

/*
 * Exemplo de código usando millis()
 */
// Inicia variáveis de tempo
unsigned long millisTarefa1 = millis();
unsigned long millisTarefa2 = millis();
 
// Iniciação
void setup(){
  // Inicia comunicação na porta serial
  Serial.begin(9600);
  // Define pinos dos leds como saída
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
// Laço perpétuo
void loop(){
  // Executa tarefa 1
  tarefa1();
  // Executa tarefa 2
  tarefa2();
}
 
void tarefa1(){
  // Verifica se já passou 200 milisegundos
  if((millis() - millisTarefa1) < 200){
    // Acende o led do pino 7
    digitalWrite(7, HIGH);
  }else{
    // Apaga o led do pino 7
    digitalWrite(7, LOW);
  }
  // Verifica se já passou 400 milisegundos
  if((millis() - millisTarefa1) > 400){
    millisTarefa1 = millis();
  }
}
 
void tarefa2(){
  // Verifica se já passou 1000 milisegundos
  if((millis() - millisTarefa2) < 1000){
    // Acende o led do pino 8
    digitalWrite(8, HIGH);
  }else{
    // Apaga o led do pino 8
    digitalWrite(8, LOW);
  }
  // Verifica se já passou 2000 milisegundos
  if((millis() - millisTarefa2) > 2000){
    millisTarefa2 = millis();
  }
}

vlw, mas eu não quero pisca um led. eu preciso apagar com um ir sensor um led por 3 segundos e ele volta a acender ate chegar outro pulso, o pisca não me serve.

O exemplo vai te ajudar você a entender como usar millis() e escrever o código que precisa.

Esse foi o objetivo do meu comentário, afinal o seu post tem como título: "Troca de delay por millis".

Sim vc esta certo eu que me expressei errado, estou estudando o exemplo mas ainda não consegui montar um logica que funcione como eu preciso, mas vlw.

Como referência há mais informações sobre o tema "tarefas paralelas / millis() por delay()" em:

https://labdegaragem.com/forum/topics/delay-por-millis

Olá, 

Ainda não consegui resolver a troca do delay pelo millis, mas consegui fazer a função que precisava, ela só não roda ainda por conta do delay.

temporizador_opto_com_pulso.ino

Ola Ernesto,

Abaixo segue a alteração após o setup() no seu programa para fazer a temporização do LED após apertar o Botão. Note que há um efeito chamado Boucing do Botão, que implica em ignorar o botão por uns 250 ms após ser apertado, pois nesse tempo o sinal fica "quicando" entre HIGH e LOW por efeito da mecânica do contato elétrico do botão.

// temporização dos botões e LEDs, também usados como flags
// o botão tem tempo para fazer o debouncing funcionar! Importante
unsigned long tempoBotao = 0, tempoLED = 0;

void loop(){

  // OBS.: caso o botão seja apertado com o LED aceso, vai iniciar desse ponto novos 5 segundos - mantendo-o ligado
   if (!digitalRead(botao) && !tempoBotao) { // o botao liga em LOW (pull-up) e devemos esperar o tempo de deboucing para ler novamente
     tempoBotao = millis() + 250; // 250 millisegundos de deboucing
     tempoLED = millis() + 5000; // o LED ficará ligado por 5 segundos após apertar o botão
     digitalWrite(led, 0); // Ligamos o LED em LOW
  }

  // se o tempo de debouncing do botao passou, liberamos o botao para ser verificado novamente
  // do contrário o botão ficará "travado" para uso / ser apertado
  if (millis() > tempoBotao) tempoBotao = 0;

 

 // A temporização do LED expirou? - apaga o LED ao final de 5 segundos após o "último apertar do botão"
  if (millis() > tempoLED) {
    tempoLED = 0;        // Anulamos a temporiação do LED
    digitalWrite(led, 1); // Apagamos o LED em HIGH
  }
}

temporizador_opto_com_pulso_millis.ino

Olá, Rodrigo desculpe te pentelhar e muito obrigado pela ajuda.

o problema ainda persiste, a contagem de tempo esta perfeita, mas o problema que ele começa a contar quando solta o botão eu preciso que ele apague o led (por 5 segundos) e religue com o botão precionado. no codigo que eu passei ele faz isso mas com o delay que esta me atrapalhando.

Beleza, o caminho é esse que mostrei.
Deixo o resto por sua conta!

abraços.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço