Olá amigo boa noite gostaria mais uma vez pedir ajuda a vocês!

É o seguinte eu quero acionar uma porta do Arduino com um botão mais que o Led venha acender 3 minutos depois que o botão for acionado.

por ex: um push button ao ser pressionado o Led acende imediatamente né isso!

eu quero quando o push button for acionado o Led ligue a uns 3 minutos depois

lembrando que eu queria este temporizador sem delay.

Exibições: 1484

Responder esta

Respostas a este tópico

Oi AVSM, boa noite.

Posta o code que você já escreveu e ajudamos a melhora-lo.  (Anexe o arquivo).

Rui

 

Olá Sr Rui obrigado por se importar com a minha dúvida!

amigo este código como visto eu aciono a porta 13 com o pino 7 e desligo via serial

ou seja aterro o pino 7 e imediatamente o led do pino 13 acende.

Então eu quero assim:

ao acionar o botão do pino 7, com 3 minutos o led do pino 13 acenda.

sem delay ok amigo!

Este led está com  status gravado na eeprom ok  amigo!

#include <EEPROM.h> // incluindo biblioteca da e2prom

    int led = 13;

    boolean ledStatus = true;
           
    int botton = 7;
    void setup()
    {
      // Verifica se e2prom ja contem dados
      if (EEPROM.read(511) != 0xEF) // utiliza endereco 511
                                    // como terminador/validador
      {
        // caso nao entao inicia com valor atual
        EEPROM.write(511, 0xEF); // Grava o valor de controle
       
        EEPROM.write(510, ledStatus & 0xFF); // usa endereco 510 para
                                 // guardar o status do LED
      }
      else
      {
        // significa q valor ja existe na eeprom,
        // so pegar
        ledStatus = EEPROM.read(510); // pega valor do endereco 510
                                     // guardar o status do LED
      }
       
      Serial.begin(9600);
      pinMode(led, OUTPUT);
     
      // Iniciando led com estado lido da eeprom
      digitalWrite(led, ledStatus);
     
     
      pinMode(botton, INPUT);
      digitalWrite(botton,HIGH);
    }
    void loop()
    {
      char debounce = 0;
      if (digitalRead (botton) == LOW)
      {
        //unsigned long tempo = millis ();
        //while(tempo + 500 > millis());
        //if (digitalRead (botton)== LOW) debounce = 1;
        

        // inverte o estado do led
        // se estava ligado, desliga e vice-versa
        ledStatus =!ledStatus;
       
        // executa o status
        digitalWrite(led,ledStatus);
        EEPROM.write(510, ledStatus); // atualizando tbem na eeprom
      }
     
     
      if(Serial.available())
      {
        int c = Serial.read();
       
       
        if ( c == 'w')
        {
          ledStatus = false;
          EEPROM.write(510, ledStatus); // atualizando tbem na eeprom
          digitalWrite(led, ledStatus);
        }
        if(c=='s')
        {
          ledStatus = true;
          EEPROM.write(510, ledStatus); // atualizando tbem na eeprom
          digitalWrite(led, ledStatus);
        }
      }
      
    }

Oi AVSM, bom dia.

Vou analisar se code.

Rui

certo amigo

Oi AVSM, boa tarde.


Vi seu code e não entendi a razão de muita coisa, aí resolvi escrever um code com base no que
você escreveu no texto inicial.


Como você não disse como desligar o led, fiz assim.


Após apertar o botão e passar 3 minutos, o led acende.
Se apertar novamente o botão, após apertar o botão e passar 3 minutos, o led apaga.
O code usa millis() ao inves de delay.


http://pastebin.com/tdMumpiW


Rui

sem problema amigo já resolvi isso só tirei a instrução de inversão de estado da porta e coloquei em LOW ficou todo certo agora vou trabalhar na eeprom vou ver se consigo.

Sr Rui estou precisando só mais de um detalhe:

esta ação que é feita pelo acionamento do button para acionar a porta 13 como eu já configurei no seu programa, o led iniciar HIGH ao precionar o botão com 3 minutos o led desliga

então com esse led desligado eu queria salvar esta condição do led LOW na eeporm para ele só ligar novamente depois que eu enviar um caracter pela serial. desculpe eu tinha me esquecido de lhe falar esse detalhe é que esse sistema é controlado pelo celular via bluetooth.

Eu já havia lhe falado quer o bloqueio seria com o Led HIGH mais não é assim, é o contrario eu fiz confusão, você tinha razão.

do jeito que o programa está o Sr só faça o status LOW do led ficar salvo na eprom e configurar

os comando de envio de caractere pela serial que é para voltar o Led para condição de HIGH que é pra desativar  o alarme e outro caractere para voltar o Led para LOW que para bloquear o veículo também pelo Bluetooth.

#include <EEPROM.h> // incluindo biblioteca da e2prom


int led = 13;// Define port 13 como led
int botton = 7;                                  // Define port 7 como botton
byte FlagLed = 0;                                 // Variavel para controle
byte LedSt = 0;                                   // Status do led
unsigned long Tempo = 0;                          // Variavel para tempo
//----------------------------------
void setup()
{
  pinMode(led, OUTPUT);                           // Define port led como saída
  pinMode(botton, INPUT_PULLUP);                  // Define port botton com entrada com pullup
  digitalWrite(led, HIGH);                         // inicia com Led apagado
  Tempo = millis();                               // Estabelece tempo inicial
}
//----------------------------------
void loop()
{
  Tempo = millis();                               // Restaura valor de tempo
  if (digitalRead(botton) == LOW)                 // Se botton foi apertado
  {
    delay(10);                                    // delay para evitar bouncing
    if (digitalRead(botton) == LOW)               // Se botton continua apertado
    {
      FlagLed = 1;                                // Indica botton apertado
    }
  }
  if (digitalRead(botton) == HIGH)                // Se botão esta solto
  {
    while (FlagLed == 1)                             // Se botton foi apertados
    {
      if (millis() - Tempo > 180000)                // Se passaram 3 minutos 180.000ms
      //if (millis() - Tempo > 2000)                // Se passaram 2 segundos (teste)
      {
        LedSt = LOW;                // le status do led invertido em Ledst
        digitalWrite(led, LedSt);                 // Acende ou apaga Led
        Tempo = millis();                         // Restaura valor de tempo
        FlagLed = 0;                              // Desliga indicador de botton apertado
      }
    }
  }
}

AVSM, boa noite.

Desculpe, mas não entendi nada da sua explicação.

procure explicar com uma sequencia lógica.

Este code não le nenhuma serial e nem bluetooth.

Rui

Enrolei tudo né amigo!

o que eu quero que você faça é incluir a eprom neste código para gravar o valor LOW deste Led 13

o quanto ao Bluetooth  é só você configurar a serial e os comandos para comandar este led também ex:

  int led = 13;
    
 
    void setup()
   {        
    Serial.begin(9600);
    pinMode(led, OUTPUT);
    }
            
    void loop()                   
          
 
   {  int c = Serial.read();
       
       
        if ( c == 'w')
        
        digitalWrite(led, LOW);
          
        
        if(c=='s')
        
        digitalWrite(led, HIGH);
          
        
      }
     

este código ele tá com a serial configurada entende se eu enviar o 's' pela serial eu ligo o Led 13 se eu enviar o 'w' pela serial eu desligo o led neste mesmo caso se eu ligar um módulo Bluetooth no Arduino  eu faço a mesma coisa via Bluetooth pelo celular ligo o Led com envio do caractere 's' e desligo o Led com envio do caractere 'w'

é exatamente este código aí que eu quero adicionar no seu código só que eu quero com o status LOW do Led memorizado na e2prom, independentemente de onde o Led for desligado se foi pelo botão ou se foi pela serial quando estiver em LOW é pra ser memorizado.

Este é o código completo do meu projeto funcionado tudo perfeitamente  com exceção a parada do programa quando eu aciono a porta 3 para ligar o tempo para desligar o porta 13

o problema é somente este, quando aciono o button do pino 3 o programa para só funciona depois que passa o tempo estipulado neste trecho:

      char debounce = 0;
 if (digitalRead (botton) == LOW)
{ unsigned long tempo = millis ();
while(tempo + 10000 > millis());
if (digitalRead (botton)== HIGH) debounce = 1;
}
if (debounce )

por ex: o tempo tá em 10 segundos durante este tempo o programa fica travado até o LED 13 desligar quando termina este tempo o programa volta a funcionar.

segue o código completo:

 #include "Timer.h"

    #include <EEPROM.h> // incluindo biblioteca da e2prom
    
    Timer t;
    int buz = 19;
    int pin = 12;
    const int buzzer = 17;
    int b1b2 = 15;
    int psirene = 12;
    int partida = 11;
    int sistemOFF = 10;
    int piscalerta = 9;
    int contato = 18;    
    int led = 13;
    int botton = 3;
    int value =LOW;                
    long previousMillis = 0;        
    long temporizador = 0;          
    int ledStatus = true;
    char alerta = 8;
      
      // LED conectado ao pino digital 13
    char vltc = LOW;                // último valor do LED
    long piscaMillis = 0;        // último momento que o LED foi atualizado
     long veloc = 500;           // tempo de transição entre estados (milisegundos)
    char ocb = 16;                // LED conectado ao pino digital 13
    char vtc = LOW;                // último valor do LED
    long bMillis = 0;        // último momento que o LED foi atualizado
    long vloc = 500;           // tempo de transição entre estados (milisegundos)
    void setup()
    {
      
     //------------------------------------------------------------------
  t.pulse(pin, 30  * 1000, LOW); // 10 seconds
 
 
  // t.pulse(pin, 10 * 60 * 1000, HIGH); // 10 minutes
  digitalWrite(pin,HIGH);
 
 
 
 
 
      // Verifica se e2prom ja contem dados
      if (EEPROM.read(511) != 0xEF) // utiliza endereco 511
                                    // como terminador/validador
      {
        // caso nao entao inicia com valor atual
        EEPROM.write(511, 0xEF); // Grava o valor de controle
       
        EEPROM.write(510, ledStatus & 0xFF); // usa endereco 510 para
                                 // guardar o status do LED
      }
      else
      {
        // significa q valor ja existe na eeprom,
        // so pegar
        ledStatus = EEPROM.read(510); // pega valor do endereco 510
                                     // guardar o status do LED
      }
       
        Serial.begin(9600);
        pinMode (ocb, OUTPUT);
        pinMode (buz, OUTPUT),
        pinMode ( contato, OUTPUT);
        pinMode ( b1b2, OUTPUT);
        pinMode(4, OUTPUT);
        pinMode(12, OUTPUT);
        pinMode(pin,OUTPUT);
        pinMode(led, OUTPUT);
        pinMode (psirene, OUTPUT);
        pinMode ( partida, OUTPUT);
        pinMode ( sistemOFF, OUTPUT);
        pinMode ( piscalerta, OUTPUT);
        pinMode(botton, INPUT);
       
      
       
       
      digitalWrite(botton,HIGH);
      pinMode( alerta, OUTPUT);
      
     pinMode( buzzer, OUTPUT);
      // Iniciando led com estado lido da eeprom
      
      digitalWrite(led, ledStatus);
      digitalWrite(b1b2,HIGH);
       digitalWrite(19,HIGH);
    }          
    
    void loop(){
    digitalWrite(4,HIGH);
   
 
      t.update();
      tone ( buzzer, 2500);
  if (millis() - piscaMillis > veloc) {
    piscaMillis = millis();   // lembre-se do último tempo que piscamos o LED

    // se o LED está apagado, acenda-o e vice-versa.
    if (vltc == LOW)
      vltc = HIGH;
    else
      vltc = LOW;

    digitalWrite(alerta, vltc);
    if (millis() - bMillis > vloc) {
    bMillis = millis();   // lembre-se do último tempo que piscamos o LED

    // se o LED está apagado, acenda-o e vice-versa.
    if (vtc == LOW)
      vtc = HIGH;
    else
      vtc = LOW;

    digitalWrite(ocb, vtc);
  }

 
 
{
        char debounce = 0;
 if (digitalRead (botton) == LOW)
{ unsigned long tempo = millis ();
while(tempo + 10000 > millis());
if (digitalRead (botton)== HIGH) debounce = 1;
}
if (debounce )

        // inverte o estado do led
        // se estava ligado, desliga e vice-versa
        ledStatus = LOW;
       
        // executa o status
        digitalWrite(led,ledStatus);
        EEPROM.write(510, ledStatus); // atualizando tbem na eeprom
      }
          
      if(Serial.available())
      {
        int c = Serial.read();
               
        if ( c== 'n')   digitalWrite(b1b2, LOW);
        
        
           
        if ( c== 'l')   digitalWrite(buz, HIGH);
        
        if ( c== 'm')   digitalWrite(buz, LOW);
        
        if ( c== 'b')   digitalWrite(contato, HIGH);
        
        if ( c== 'v')   digitalWrite(contato, LOW);
                
        if ( c== 'p')   digitalWrite(psirene, HIGH);
                 
        if ( c== 'o')   digitalWrite ( psirene, LOW);
                    
        if ( c=='c')   digitalWrite ( partida, HIGH);
       
        if ( c == 'x' ) digitalWrite ( partida, LOW);
          
        if ( c=='d')  digitalWrite (sistemOFF,HIGH);
         
        if ( c== 'z' )digitalWrite( sistemOFF, LOW);
        
        if (c ==  'e')  digitalWrite ( piscalerta, HIGH);
        
        if ( c== 't')   digitalWrite ( piscalerta, LOW);
       {
        
         
         
         if ( c == 'w')
        
                       
          ledStatus = false;
          EEPROM.write(510, ledStatus); // atualizando tbem na eeprom
          digitalWrite(led, ledStatus);
        }
        if(c=='y')
        {
          ledStatus = true;
          EEPROM.write(510, ledStatus); // atualizando tbem na eeprom
          digitalWrite(led, ledStatus);
        }
      }
      delay(10); // diminuindo frequencia do programa
  {  
 
    {

    }}}}  

Boa tarde nobres colegas! muito obrigado a quem me ajudou foi muito úitil dividir minha dúvida com vocês pois obtive grandes êxitos no desenvolvimento do meu projeto muito obrigado amigo. Valeu!!

problema resolvido!!

graças a excelente indicação que tive daqui eu conseguir solucionar meu problema!

código resolvido!!!

#include <Timer.h>

#include <EEPROM.h> // incluindo biblioteca da e2prom

 

 

 

//+++++++++++++++++Variaveis para leitura do botao 3 e do tempo ++++++++++++++++++++++++++++++++++++++++++++++++++++++++

int buttonState;

int lastButtonState = HIGH;

unsigned long lastDebounceTime = 0;

unsigned long debounceDelay = 20;

unsigned long Tempo = 0;

bool flag = true; // auxiliar

bool  desliga_13 = false;

long TimeOut = 30000L;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

 

Timer t;

int buz = 19;

int pin = 12;// pausa de 1 minuto.

const int buzzer = 17;//sáida de um bip.

int b1b2 = 15; // porta como saída de sinal para controle

int psirene = 12; //porta como saída de sinal para controle

int partida = 11; //porta como saída de sinal para controle

int sistemOFF = 10;//porta como saída de sinal para controle

int piscalerta = 9;//porta como saída de sinal para controle

int contato = 18; //porta como saída de sinal para controle

int led = 13;//porta como saída de sinal para controle

int botton = 3; // botão para acionamento do temporizador

int value = LOW;

long previousMillis = 0;

long temporizador = 0;

int ledStatus = HIGH;

char alerta = 8;

 

// LED conectado ao pino digital 13

char vltc = LOW;                // último valor do LED

long piscaMillis = 0;        // último momento que o LED foi atualizado

long veloc = 500;           // tempo de transição entre estados (milisegundos)

char ocb = 16;                // LED conectado ao pino digital 13

int vtc = LOW;                // último valor do LED

long bMillis = 0;        // último momento que o LED foi atualizado

long vloc = 500;           // tempo de transição entre estados (milisegundos)

 

struct var_ {

  int s_tatus : 1 ;

};

 

 

 

void setup()

{

 

 

  Serial.begin(9600);

 

  delay(10);

  //------------------------------------------------------------------

  t.pulse(pin, 30  * 1000, LOW); // 10 seconds

 

  // t.pulse(pin, 10 * 60 * 1000, HIGH); // 10 minutes

  digitalWrite(pin, HIGH);

  int endereco_511 = EEPROM.read(511);

  delay(10);

  // Verifica se e2prom ja contem dados

  if (endereco_511 != 0xEF) // utiliza endereco 511

  { // como terminador/validador

    Serial.print("endereco_511 = ");

    Serial.flush();

    Serial.println(endereco_511);

    Serial.flush();

    // caso nao entao inicia com valor atual

    EEPROM.write(511, 0xEF); // Grava o valor de controle

    EEPROM.write(510, ledStatus & 0xFF); // usa endereco 510 para

    // guardar o status do LED

  }

  else

  {

    // significa q valor ja existe na eeprom,

    // so pegar

    ledStatus = EEPROM.read(510); // pega valor do endereco 510

    // guardar o status do LED

    Serial.print("endereco_510 = ");

    Serial.flush();

    Serial.println(ledStatus);

    Serial.flush();

  }

 

  Serial.begin(9600);

  pinMode (ocb, OUTPUT);

  pinMode (buz, OUTPUT);

  pinMode (contato, OUTPUT);

  pinMode (b1b2, OUTPUT);

  pinMode (4, OUTPUT);

  pinMode (12, OUTPUT);

  pinMode (pin, OUTPUT);

  pinMode (led, OUTPUT);

  pinMode (psirene, OUTPUT);

  pinMode ( partida, OUTPUT);

  pinMode ( sistemOFF, OUTPUT);

  pinMode ( piscalerta, OUTPUT);

  pinMode (botton, INPUT_PULLUP);/// coloque pullUp

 

  //digitalWrite(botton, HIGH);

  pinMode( alerta, OUTPUT);

 

  pinMode( buzzer, OUTPUT);

  // Iniciando led com estado lido da eeprom

 

  digitalWrite(led, ledStatus);

 

  digitalWrite(b1b2, HIGH);

  digitalWrite(19, HIGH);

  delay(100);

}

 

 

unsigned long tempo;

 

 

void loop() {

  digitalWrite(4, HIGH);

 

  t.update();

  tone ( buzzer, 2500);

  if (millis() - piscaMillis > veloc) {

    piscaMillis = millis();   // lembre-se do último tempo que piscamos o LED

 

    // se o LED está apagado, acenda-o e vice-versa.

    if (vltc == LOW)

      vltc = HIGH;

    else

      vltc = LOW;

 

    digitalWrite(alerta, vltc);

    if (millis() - bMillis > vloc) {

      bMillis = millis();   // lembre-se do último tempo que piscamos o LED

      // se o LED está apagado, acenda-o e vice-versa.

      if (vtc == LOW)

        vtc = HIGH;

      else

        vtc = LOW;

 

      digitalWrite(ocb, !vtc);

      //---------------------------------------------

    }

    {

 

      //*****************************************************************************************************************************

 

      // Leitura do botao 3

 

      int reading = digitalRead(botton);

      if (reading != lastButtonState) {

        lastDebounceTime = millis();

        Serial.println("reading != lastButtonState");

      }

 

      if ((millis() - lastDebounceTime) > debounceDelay) {

        if (reading != buttonState) {

          buttonState = reading;

          if (buttonState == LOW) {

            Serial.println("buttonState == LOW");

            desliga_13 = true;

            if (flag) {

              flag = false;

              Serial.println("flag");

              Tempo = millis();

            }

          }

        }

      }

      lastButtonState = reading;

 

      if (desliga_13 == true) {

        Serial.println(millis() - Tempo);// debug

 

        if ((millis() - Tempo ) > TimeOut) {// testa se passou de 3 minutos se sim executa Status

          flag = true;

          ledStatus = LOW;

          digitalWrite(led, ledStatus);

          EEPROM.write(510, ledStatus); // atualizando tbem na eeprom

          desliga_13 = false;

          Tempo = 0;

        }

      }

 

      //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

      /*

        char debounce = 0;

        if (digitalRead (botton) == LOW)

        {

        unsigned long tempo = millis ();

        while (tempo + 180000 > millis()); // tempo de desligamento da porta 13 ficando com Status gravado na e2peom após o acionamento do push button do pino 3

        if (digitalRead (botton) == HIGH) debounce = 1;

        }

       if (debounce) ledStatus = LOW;// status da porta 13 após os 3 minutos do acionamento do push button

 

        // executa o status

        digitalWrite(led, ledStatus);

        EEPROM.write(510, ledStatus); // atualizando tbem na eeprom

      */

    }

 

    if (Serial.available())

    {

      int c = Serial.read();

 

      if ( c == 'n') digitalWrite(b1b2, LOW); // comando de desativar a porta pela serial/blutooth pelo celular

      if ( c == 'l') digitalWrite(buz, HIGH); //comando de ativar a porta pela serial/blutooth pelo celular

      if ( c == 'm') digitalWrite(buz, LOW); // comando de desativar a porta pela serial/blutooth pelo celular

      if ( c == 'b') digitalWrite(contato, HIGH); // comando de ativar a porta pela serial/blutooth pelo celular

      if ( c == 'v') digitalWrite(contato, LOW); // comando de desativar a porta pela serial/blutooth pelo celular

      if ( c == 'p') digitalWrite(psirene, HIGH); //comando de ativar a porta pela serial/blutooth pelo celular

      if ( c == 'o') digitalWrite(psirene, LOW); //comando de desativar a porta pela serial/blutooth pelo celular

      if ( c == 'c') digitalWrite(partida, HIGH); //comando de ativar a porta pela serial/blutooth pelo celular

      if ( c == 'x') digitalWrite(partida, LOW);  //comando de desativar a porta pela serial/blutooth pelo celular

      if ( c == 'd') digitalWrite(sistemOFF, HIGH); //comando de ativar a porta pela serial/blutooth pelo celular

      if ( c == 'z') digitalWrite(sistemOFF, LOW); //comando de desativar a porta pela serial/blutooth pelo celular

      if ( c == 'e') digitalWrite(piscalerta, HIGH); // comando de ativar a porta pela serial/blutooth pelo celular

      if ( c == 't') digitalWrite(piscalerta, LOW); //comando de desativar a porta pela serial/blutooth pelo celular

      {

        if ( c == 'w') //comando de desativar pela serial/bluetooth pelo celular pino 13 com Status gravado e2prom

          ledStatus = false;

        EEPROM.write(510, ledStatus); // atualizando tbem na eeprom

        digitalWrite(led, ledStatus);

      }

      if (c == 'y') //comando de ativar pela serial/bluetooth pelo celular pino 13 com Status gravado e2prom

      {

        ledStatus = true;

        EEPROM.write(510, ledStatus); // atualizando tbem na eeprom

        digitalWrite(led, ledStatus);

      }

    }

    delay(10); // diminuindo frequencia do programa

    {

      {

      }

    }

  }

}

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2019   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço