Go Down

Topic: Protótipo de alarme(Iniciante) (Read 525 times) previous topic - next topic

palomacs

Dec 11, 2017, 04:33 am Last Edit: Dec 11, 2017, 04:41 am by palomacs



Olá estou iniciando na programação em Arduíno,e estou tentando construir um protótipo que dê um alarme quando o botão de ligar for apertado duas ou mais vezes em menos de 15 segundos .O alarme será dado através de um led piscante.Estou tendo problemas com relação ao tempo ,gostaria de saber se tem algum erro lógico no seguinte código:

#include "TimerOne.h"
const byte pinLED1 =12;
const byte botaoAcende = 2;
const byte botaoApaga = 3;
unsigned long tempoAtual = 0, tempoInicio = 0;
const unsigned long tempoAceso = 15000;
int contador = 0;
volatile boolean estado = 0;


void setup() {
pinMode(pinLED1, OUTPUT);
pinMode(botaoAcende, INPUT);
pinMode(botaoApaga, INPUT);
attachInterrupt(digitalPinToInterrupt(botaoApaga),ApagaLED, FALLING);
//attachInterrupt(digitalPinToInterrupt(botaoAcende),AcendeLED, FALLING);

/*Usando a interrupção por tempo fazemos o led inverter o estado aceso e apagado a cada 1 seg*/
Timer1.initialize();
Timer1.attachInterrupt(pisca, 1000);


}

void loop() {

/*Verifica se o botão foi pressionado*/
estado = digitalRead(botaoAcende);

  /*Se ele apertou o botão*/
  if(estado == HIGH ){
    tempoInicio = millis();
    contador = contador++;
    /*Se ele apertar 2 vezes o botão e o tempo for menor do que 15 segundos*/
    if((contador >= 2) && ((tempoInicio-tempoAtual) <= tempoAceso))              
    {
      AcendeLED();
      tempoAtual = tempoInicio;
    }else{
       digitalWrite(pinLED1, LOW);
    }
  }

  /*Se passar 15 segundos ele deve zerar o contador*/
  if((tempoInicio-tempoAtual) >= tempoAceso)
  {
      contador = 0;
  }


}

void ApagaLED(){
digitalWrite(pinLED1, LOW);
tempoAtual = tempoInicio;
}

void AcendeLED(){
digitalWrite(pinLED1, estado);
}

void pisca()
{
estado ^= 1;
}

dnc0

O código simples está aqui em baixo:
Code: [Select]

//I/O
byte bt = 3; //terminal do botão
byte alarme = 13; //terminal do LED(alarme)

//Variáveis
bool press = false; //o botão ja voi apertado?
long debouncetime = 250; //tempo de debunce para o botão
volatile unsigned long last=0; //ultima vez que obotão foi apertado(debounce)

int falta = 0; //quantos segundos faltam para esperar o segundo clique no botão


//Protótipos
void bt_press(); //executa quando o botão é apertado

void setup(){
  Serial.begin(9600);
  pinMode(bt,INPUT_PULLUP); //define o terminal do botão como entrada e com PULLUP interno
  pinMode(alarme,OUTPUT); //define o terminal do alarme como saida
  attachInterrupt(1,bt_press,LOW); //sempre que ocorrer uma interrupçao externa no terminal 3 (Arduino Uno) executar a função "bt_press"
}//end setup

//DICA: pode-se colocar a rotina contida no loop principal em uma interrupção por timer e assim executar outras tarefas no main loop!

void loop(){
  //se o botão já foi apertado pela primeira vez, imprime na serial quantos segundos restam para o segundo clique
  if(press){
    Serial.print("Falta: ");
    Serial.println(falta);
    falta--; // diminui o tempo restante do contador
    if(falta<=0){ //se já se passaram 15s então desconsidere(reseta a flag de botão apertado)
      press=false;
    }
     delay(1000); //delay de 1s para a contagem do tempo restante
  }
}//end loop

//Funções

void bt_press(){
  if((long)(millis() - last >= debouncetime)){ //debounce do botão da interrupção
    detachInterrupt(1); //desativa temporariamente a interrupção externa
    //delay(50);
    Serial.println("bt press");
    if(!press){ // Se é a primeira que o botão foi apertado? se sim...
      press = true;
      falta=15; //indica que faltam N segundos para esperar o segundo clique
      attachInterrupt(1,bt_press,LOW); //ativa novamente a interrupção
    }else if(press && falta>0){ //se o botão já foi apertado em 15s
      digitalWrite(alarme,HIGH); //ativa o alarme
      press=false; //reseta a flag
    }
    last= millis(); //debounce
  }
}//end func bt_press


Como sugestão recomendo coloca a rotina principal(o que esta dentro do void loop) em um interrupção por timer para que o projeto possa executar outras tarefas no main loop.

Go Up