Boa noite a todos!

Gostaria de saber como faço para utilizar a função millis, pelo que eu ouvi falar ela vai servir para o problema que estou tendo no  meu código.

Tenho 3 botões de pulso 3 leds e uma sirene, a ideia é fazer uma chave de prioridade tipo (passa ou repassa) ou seja, quem apertar primeiro o botão vai ligar o led referente ao botão e tocar a sirene, e ao mesmo tempo (tempo definido) os outros 2 botões ficam inativos mesmo se forem apertados.

O problema é que a sirene tem um som insuportável, então quero que o tempo da sirene seja diferente (menor) que o tempo dos ledes acesos, mas preciso que se iniciem ao mesmo tempo e com função delay isso não é possível. 

Com a função millis consigo resolver isso? ou teria uma forma melhor de fazer isso?

Obrigado gente!

Exibições: 1698

Anexos

Responder esta

Respostas a este tópico

boa noite Casimiro.

      O uso do "millis" é simples, mas ao mesmo tempo sistemático, ou seja: exige que você tenha disciplina em usá-lo, e sempre da mesma forma ("sem sair dos trilhos" nem "reinventar a roda"). E por ser sempre da mesma forma, isso torna seu uso simples.

      Não tive tempo até o momento, de olhar seu código, mas assim que puder darei uma olhada cuidadosa.

      Então se vc quer saber como usar o "millis", e ainda como controlar seu Sistema sem falha alguma, veja os posts que aponto a seguir, onde eu demonstro como é simples conseguir estas duas coisas. Se vc está realmente interessado, vai gostar do conteúdo dos posts, e além disso vai aprender técnicas seguras (que nunca falham) e eficientes de escrever o código para o Sistema que vc está implementando. São estes:

      link 1:  Maquina 1 - Garagem

      link 2:  Maquina 2 - Garagem

     Como disse, logo que puder, olharei seu código. Mas acho que seria de grande proveito para vc ver os posts que indiquei, e assim vc mesmo vai conseguir "dominar a Máquina".

 

    Abrçs,

    Elcids

Obrigado Elcids, vou ver sim, já tentei iplementar mas sem sucesso, mas talvez a explicação que vi estava confusa quem sabe aprendo agora!

Abraço.

oi Casimiro, bom dia.

    Ainda não pude analisar seu código. Mas tem um post mais recente em que também implementei uma "Máquina de Estados", a qual faz uso intensivo do "millis" para temporização do Sistema.

    Dê uma olhada, pois acredito que vai te ajudar também. Segue:

    Link:  Semáforo "inteligente" - Garagem

    Abrçs,

    Elcids

Olá pessoal.

Eu escrevi um artigo aqui no meu site:

http://www.labirito.com/tutorial/arduino/multitarefa

Tentei explicar em detalhes o uso do millis para simular multitarefa no Arduino.

Tenho certesa de que vai resolver suas dúvidas.

Boa leitura,

  'Eiju

Recomendo tbm a leitura desse tutorial sobre millis()

https://forum.arduino.cc/index.php?topic=503368.0

Esta em inglês, mas nada que o tradutor do chrome não resolva, esta muito bem detalhado

Bom dia,

Usei recentemente estes tempos de intervalos com millis() em um projeto.

Então como estava com a memoria fresca, fiz o código básico para você.

Acredito que resolva seu problema.

int ledPin1 = 5; //LED no pino 11   ### NA VERDADE É PINO 5 MESMO
int ledPin2 = 6; //LED no pino 12   ### NA VERDADE É PINO 6 MESMO
int ledPin3 = 7; //LED no pino 13  ### NA VERDADE É PINO 7 MESMO
int Sirene = 8; //LED no pino 13    ### NA VERDADE É PINO 8 MESMO
int Botao1 = 2; //Botão no pino 2
int Botao2 = 3; //Botão no pino 3
int Botao3 = 4; //Botão no pino 4


int apertou = 0;
long t_sirene = 2000; // DEFINA TEMPO PADRAO PARA SIRENE
long t_intervalo_sirene = 0;
long t_led = 5000; // DEFINA TEMPO PADRAO PARA SIRENE
long t_intervalo_led = 0;

void setup() {
pinMode(Sirene, OUTPUT);
pinMode(ledPin1, OUTPUT); //Pino do LED será saída
pinMode(Botao1, INPUT); //Pino com botão será entrada
pinMode(ledPin2, OUTPUT);
pinMode(Botao2, INPUT);
pinMode(ledPin3, OUTPUT);
pinMode(Botao3, INPUT);
}

void apertado(int x){
apertou = 1;
t_intervalo_led = t_led + millis(); // SETA TEMPO DE INTEVALOR PARA O LED , SOMASE O TEMPO PADRAO PARA LED ACESO + MILLIS()
t_intervalo_sirene = t_sirene + millis();// SETA TEMPO DE INTEVALOR PARA A SIRENE , SOMASE O TEMPO PADRAO PARA SIRENE ACESO + MILLIS()
digitalWrite(x, HIGH); // ATIVA LED
digitalWrite(Sirene, HIGH); //ATIVA SIRENE
}


void controle_sirene(){
if (t_intervalo_sirene <= millis()) { // VERIFICA SE ACABOU O TEMPO
digitalWrite(Sirene,LOW); // DESATIVA SIRENE
}
}


void controle_led(){
if(t_intervalo_led <= millis()){ // VERIFICA SE ACABOU O TEMPO
digitalWrite(ledPin1,LOW); // DESATIVA LED
digitalWrite(ledPin2,LOW); // DESATIVA LED
digitalWrite(ledPin3,LOW); // DESATIVA LED
apertou = 0;

}
}

void loop() {
controle_led(); // VERIFICA ESTADO LED
controle_sirene(); // VERIFICA ESTADO SIRENE

if(digitalRead(Botao1) == HIGH && apertou == 0) { //Se botão estiver pressionado (HIGH)
apertado(ledPin1);
}

if(digitalRead(Botao2) == HIGH && apertou == 0) { //Se botão estiver pressionado (HIGH)
apertado(ledPin2);
}
if(digitalRead(Botao3) == HIGH && apertou == 0) { //Se botão estiver pressionado (HIGH)
apertado(ledPin3);
}
}

Espero ter ajudado.

oi Adler, estou aproveitando este seu post, para avisar que deixei no seu Skype, informações adicionais sobre seu projeto.

Abrçs,

Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço