Alarme com botao de tempo, tempo nao funciona

O senhores mestres, eu sou um precipiante em programar arduino fiz um pequeno projeto e a curiosidade abriu mais portas nao sou um programador formado apenas um curioso, talve minha pergunta para vcs seja facil de resolverl mas eu ja estou de cabelo branco e não consigo sair do lugar, decidi dar um passo maior que a perna e estou tentando fazer um alarme mas nao sei se é possivel fazer isso no arduino.

" meu projeto esta tirando meu sono pois nao tenho conhecimento suficiente para achar o erro, o objetivo do alarme é ele ser acionado depois de um determinado tempo.

exemplo o alarme vai ter um pushbuttom para acender 3 led isso mesmo,

1 toque acende o led do tempo de 10 segundos assim que tocar o pusshbutton ele acende o led de 10 segundos e depois desse 10 segundo ele liga o sensor pir para registra o movimento.

e assim com os outros led ao toque o pushbutton novamente ele apaga o led 1 e acende o led 2 indicando que o tempo de 30 segundos esta ativado, entao o sensor pir passa a ser ligado depois de 30 segundos.

0 3 led vai ser o tempo de 60 segundos ao clicar no pushbutton novamento ele amante o led 1 apagado, apaga o led 2 e acende o led 3 indicando que o tempo de 60 segundo esta acionado entao o sensor pir so vai ligar depois de 60 segundos.

eu nao tenho experiencia com programaçao mais sei emendar codigo, o codigo que montei não da erro porem tambem não funciona. todos os entradas e saidas estao ok mas a funçao em si nao funciona eu não consigo fazer com que o botao chame a funçao quando pressionado se alguem puder colocar uma luz fo ninal do tunel eu ficaria muito grato obrigado a todos.

#include <SPI.h>

#define LED_SISTEMA_LIGADO 9

const int buttonPin = 11;
const int LED_1 = 4;
const int LED_2 = 5;
const int LED_3 = 12;
const int pinoPIR = 6;      // Pino do Sensor PIR
const int led_ligado = 10;  // LED/BUZZER ALERTA TOCANDO
const int LED_MOVIMENTO = 8;  // Pino do Alarme/LED
const int pinoAlarmeBuzzer = 7; //  Buzzer

//alarme dispara apos esse tempo
const unsigned long tempoEspera1  =10000; // 10 segundo
const unsigned long tempoEspera2  = 30000; // 30 segundos
const unsigned long tempoEspera3 = 60000; // 60 segundos

// condição tempo
unsigned long tempoUltimoMovimento = 0;
//unsigned long tempo;

bool ultimo_estado;
bool alarmeAtivo = false;

int buttonState = 0;
int lastButtonState = 0;
int mode = 0; // Alternar modos

void setup() {

  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP); // Usa resistor interno
  pinMode(pinoPIR, INPUT);
  pinMode(pinoAlarmeBuzzer, OUTPUT);
  pinMode(LED_MOVIMENTO, OUTPUT);
  pinMode(LED_SISTEMA_LIGADO, OUTPUT);

   
  Serial.begin(9600); //Inicializa serial para debug
 
 
  SPI.begin(); // Inicia SPI bus
 
    tempoUltimoMovimento = millis(); // Inicia o tempo
}

void loop()
{
    buttonState = digitalRead(buttonPin);
     tempoUltimoMovimento = millis(); // Inicia o tempo
      digitalWrite(LED_SISTEMA_LIGADO, HIGH);   // led INDICA SISTEMA LIGADO
       int estadoPIR = digitalRead(pinoPIR); 


 
/// teste dos botoes

if (buttonState != lastButtonState) {
    if (buttonState == LOW) { // Botão pressionado
      mode++;
      if (mode > 3) mode = 0;

 // Lógica para ligar LEDs
      //if (mode == 1) { digitalWrite(estadoPIR, HIGH); digitalWrite(LED_1, HIGH); digitalWrite(LED_2, LOW); digitalWrite(LED_3, LOW);  }   // FALHA NESTE COMANDO NAO FUNCIONA OS LEDS E O BOTAO
      if (mode == 1) {  digitalWrite(LED_1, HIGH); digitalWrite(LED_2, LOW); digitalWrite(LED_3, LOW);  

 ////////////////////// estado pir 10 SEGUNDOS
 if (estadoPIR == HIGH) {   // FALHA NESTE COMANDO NAO FUNCIONA OS LEDS E O BOTAO NAO CHAMA A AÇAO DE 10 SEGUNDOS
     // Movimento  detetado:
  tempoUltimoMovimento = millis();
    digitalWrite(pinoAlarmeBuzzer, HIGH); // liga Buzzer do alarme 
       alarmeAtivo = true;

  } 
  else {
    // movimento: verifica se passaram 10 SEGUNDOS
  if (millis() - tempoUltimoMovimento >= tempoEspera1) {
      digitalWrite(led_ligado, LOW); // DESAtiva alarme
            digitalWrite(pinoAlarmeBuzzer, LOW); // DESAtiva Buzzer do alarme
     
      if (!alarmeAtivo) {
        Serial.println(" ALARME DESATIVADO");
        delay(500);
        alarmeAtivo = false;
      }
     ////////////////estado pir 30 segundos     
    //else if (mode == 2) { digitalWrite(estadoPIR, HIGH); digitalWrite(LED_1, LOW); digitalWrite(LED_2, HIGH); digitalWrite(LED_3, LOW); //}    // FALHA NESTE COMANDO NAO FUNCIONA OS LEDS E O BOTAO
     else if (mode == 2) {  digitalWrite(LED_1, LOW); digitalWrite(LED_2, HIGH); digitalWrite(LED_3, LOW);

      if (estadoPIR == HIGH) { // FALHA NESTE COMANDO NAO FUNCIONA OS LEDS E O BOTAO NAO CHAMA A AÇAO DE 30 SEGUNDOS
    // Movimento detetado: reinicia o contador
   tempoUltimoMovimento = millis();
  
    digitalWrite(led_ligado, HIGH); // Desliga o led do alarme 
       digitalWrite(pinoAlarmeBuzzer, HIGH); // Desliga Buzzer do alarme 
   
    alarmeAtivo = true;
    Serial.println("Movimento detetado ");
    delay(200);
  } else {
    //  verifica se passaram 30 SEGUNDOS
  if (millis() - tempoUltimoMovimento >= tempoEspera2) {
            digitalWrite(pinoAlarmeBuzzer, LOW); // DESAtiva Buzzer do alarme
         
      if (!alarmeAtivo) {
        Serial.println(" ALARME DESATIVADO");
        delay(500);
        alarmeAtivo = false;
      }
////////////////estado pir 60 SEGUNDOS
//else if (mode == 3) { digitalWrite(estadoPIR, HIGH); digitalWrite(LED_1, LOW); digitalWrite(LED_2, LOW); digitalWrite(LED_3, HIGH); //}  // FALHA NESTE COMANDO NAO FUNCIONA OS LEDS E O BOTAO
      else if (mode == 3) {  digitalWrite(LED_1, LOW); digitalWrite(LED_2, LOW); digitalWrite(LED_3, HIGH); 
        
        if (estadoPIR == LOW) {          // FALHA NESTE COMANDO NAO FUNCIONA OS LEDS E O BOTAO NAO CHAMA A AÇAO DE 60 SEGUNDOS

    // Movimento  nao detectado: 
   tempoUltimoMovimento = millis();
    }
       digitalWrite(pinoAlarmeBuzzer,LOW); // DESliga Buzzer do alarme 
       delay(200);
   
    alarmeAtivo = true;
 
  } else {
    // ACIONA APOS 60 SEGUNDOS
  if (millis() - tempoUltimoMovimento >= tempoEspera3) {
      digitalWrite(led_ligado, HIGH); // Ativa alarme
            digitalWrite(pinoAlarmeBuzzer, HIGH); // Ativa Buzzer do alarme
          
      if (!alarmeAtivo) {
        Serial.println(" ALARME DESATIVADO");
        delay(500);
        alarmeAtivo = false;
      }  
 else{ digitalWrite(LED_1, LOW); digitalWrite(LED_2, LOW); digitalWrite(LED_3, LOW); }
      }
       delay(50); // Debounce
      }
       lastButtonState = buttonState;
     }
    }
   }
  }
 }
}
}
}
}

Onde você conseguiu o código?

Parece que precisa de um sensor PIR. Você tem todos os detalhes?

Olá! Bem vindo ao Forum.

Eu entendi em parte o que você deseja que o programa faça, mas há mais coisas no seu programa do que 3 botões, 3 LEDs e um PIR. Parece ter também outros dois LEDs, um quarto botão e um Buzzer. Só o software não vai resolver. Para ajudarmos seria interessante saber como isso tudo estará integrado e ligado.

Por exemplo: alguns sensores PIR são ativos em nível baixo, mas seu programa espera ler nível alto. Qual é o sensor que você tem? Qual é o Arduino que você está usando?

Uma sugestão que eu posso dar é dividir seu projeto em pedaços menores e só acrescentar novas funcionalidades depois que a primeira estiver funcionando corretamente. Partir direto pro programa mais complicado ou trabalhoso pode ser frustrante.

PS: Sendo esse o seu primeiro post, recomendamos fortemente que você leia o tópico Como obter o melhor desse Forum. Ali tem dicas importantes sobre como fazer suas postagens.

Esqueci de dizer no post anterior que você pode simular seu sistema e seu código usando o aplicativo Wokwi.

Eu fiz aqui um exemplo de contagem regressiva usando o botão preto para configurar o tempo e o vermelho para disparar a contagem.

Sejaa benvindo ao forum.
Porque voce está usando a biblioteca SPI?
Se voce estiver usando Arduino uno, o pino 11 é usado pela SPI e vai entrar em conflito com o botão que está ligado no pino 11.
E por isto este botão vai deixar voce meio que doido.
Se não precisar da SPI remova a inclusão desta biblioteca.
//#include <SPI.h> e // SPI.begin(); // Inicia SPI bus
Se precisar da SPI use para o botão outros pinos diferentes de 10 a 13.
Boa sorte.

xfpd eu ainda não sei escrever codigo na verdade, eu fiz um curso de programaçao a muito tempo, e agora que estou voltando a programar, agradeço imensamente em vc perder seu tempo em me ajudar. sim no alarme vai ter um sensor pir, eu escrevi alguma parte baseado em codigos que encontrei na internet usando linhas de codigos ja escrita entao em palavras clara eu apenas copie e colei, fazendo o meu proprio codigo.

ideia do alarme em meus pensamentos. o alarme vai ser acionado por um cartao rfid ou tag Rfid ou ate mesmo o telefone, eu tenho um codigo rfid, que peguei na internet e ja funciona eu comprei a placa as tag e ja esta tudo funcionando, a ideia é unir essa parte do codigo com o do rfid.

entao a logica vai ser deixr um tempo selecionado, 10 segundos, 30 segundos, 60 segundos penso em deixar esse tempo em minutos mas so depos que conseguir rodar o codigo eu faço as alteraçors, como vai funcionar o tempo de ligar ja vai ficar selecionado,
___ Começa 1-apertar o botão de inicio da leitura do cartao rfid, 2- fazer a leitura do cartao e o alarme ser acionado depois de um determinado tempo. que é o codigo que estou com dificuldade nao sei se ha um jeito mais simple ou melhor mas a falta de conhecimento ainda estou limitado , peço imensa desculpa..

Continue com seus métodos. Copie e cole até funcionar. Adicione um dispositivo e use o código para o novo dispositivo no seu código em funcionamento. É normal cometer erros. Basta pedir ajuda até que seu código esteja funcionando, depois adicione outro dispositivo. Leva tempo.

BRASILINO eu ainda não sei escrever codigo na verdade, eu fiz um curso de programaçao a muito tempo, e agora que estou voltando a programar, agradeço imensamente em vc perder seu tempo em me ajudar. sim no alarme vai ter um sensor pir, eu escrevi alguma parte baseado em codigos que encontrei na internet usando linhas de codigos ja escrita entao em palavras clara eu apenas copie e colei, fazendo o meu proprio codigo.

ideia do alarme em meus pensamentos. o alarme vai ser acionado por um cartao rfid ou tag Rfid ou ate mesmo o telefone, eu tenho um codigo rfid, que peguei na internet e ja funciona eu comprei a placa as tag e ja esta tudo funcionando, a ideia é unir essa parte do codigo com o do rfid.

entao a logica vai ser deixr um tempo selecionado, 10 segundos, 30 segundos, 60 segundos penso em deixar esse tempo em minutos mas so depois que conseguir rodar o codigo eu faço as alterações, como vai funcionar o tempo de ligar ja vai ficar selecionado,
___ Começa 1-apertar o botão de inicio da leitura do cartao rfid, 2- fazer a leitura do cartao e o alarme ser acionado depois de um determinado tempo. que é o codigo que estou com dificuldade nao sei se ha um jeito mais simple ou melhor mas a falta de conhecimento ainda estou limitado , peço imensa desculpa.. gostei muito do que me apresentou no outro topico vou testar e juntar partes no meu codigo,

a ideia é fazer o sensor pir ser ligado apos o tempo que ficou selecionado, do exemplo, porem esse sensor vai estar em minutos o que ainda nao aprendi calcular, depois de acionar o alarme com cartao rifd, ele so vai ligar apos o tempo que foi programado. exemplo eu saio de casa eu aciono o alarme com o rfid, o alarme vai ligar o sensor pir apenas depois de 10 minutos, eu não sei se isso é possivel, talves seja uma ideia que não leve a um resultado satisfatorio, mas com essa ideia estou indo ao extremo em aprender e taentar uma solução, eu peço desculpas se fiz alguma coisa errada no forum eu sou virgem de dorum é a primeira vez que faço uma publicaçao eu vou ler certinho link que me mandou orbigado por sua ajuda.

RUILVIANA, na verdade eu não sei para que serve o spi, muito orbigado por su dica, eu peguei uns 50 codigo pronto ante de começar a montar o meu, acho que ate mais, e quase todos ele tinha essa função spi, eu achei que era uma biblioteca obrigatorio, como antes desse codigo que estou preso, eu estava usando um alarme que funciona com cartao rfid foi um codigo que peguem na interten ja testei e montei o o alarme funciona perfeitamente, então decidi criar o meu proprio alarme usando copiar e colar e escrevendo alguma parte para poder em meu codigo intruduzir o tempo de incio do alarme

eu ainda não sei escrever codigo na verdade, agradeço imensamente em vc perder seu tempo em me ajudar.

ideia do alarme em meus pensamentos. o alarme vai ser acionado por um cartao rfid ou tag Rfid ou ate mesmo o telefone, eu tenho um codigo rfid, que peguei na internet e ja funciona eu comprei a placa as tag e ja esta tudo funcionando, a ideia é unir essa parte do codigo com o do rfid.

entao a logica vai ser deixar um tempo selecionado, 10 segundos, 30 segundos, 60 segundos penso em deixar esse tempo em minutos mas so depos que conseguir rodar o codigo eu faço as alteraçoões, como vai funcionar o tempo de ligar ja vai ficar selecionado,
___ Começa 1-apertar o botão de inicio da leitura do cartao rfid, 2- fazer a leitura do cartao e o alarme ser acionado depois de um determinado tempo. que é o codigo que estou com dificuldade nao sei se ha um jeito mais simple ou melhor mas a falta de conhecimento ainda estou limitado , peço imensa desculpa..

exemplo: eu saio de casa o alarme é ativado pelo rdif, porem o sensor pir so vai funcionar depois do tempo selecionado, que em um futuro vais ser 10 minutos, 30 minutos ou 60 minutos talves seja uma ideia estupida, mas isso esta me abrindo um leque para o meu aprendizado muito obrigado por sua ajuda.

Bom dia.
A biblioteca SPI precisa ser usada quando usamos algum modulo ou chip que se comunica usando este protocolo. (Serial Peripheral Interface ).

Se nenhum modulo ou chip que vamos usar usa este protocolo a biblioteca não deve ser usada, pois alem de poder atrapalhar, como no seu caso, ainda ocupa espaço e tempo de processamento.

Veja seu projeto simulado aqui: Link abaixo.

Fiz algumas modificações para que os LEDs acendessem do modo que voce quer.
Mas acho que ainda existem falhas no projeto.
Por exemplo:
Na sequencia de mode:
mode 1, 2, 3, 0... o que fazer se o mode for 0?

1 Like

Ruilviana muito obrigado, oprojeto que vc fez esta iguazinho ao meu em cima da mesa e ate fiz a alteraçao em meu projeto do mesmo jeito que vc me orientou, enfim eu ainda nao consegui fazer funcionar mas ate o final do ano eu consigo, muito obrigado mesmo

O que significa : " enfim eu ainda nao consegui fazer funcionar ".
De mais detalhes da sua dificuldade.