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.
Tags:
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.
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
{
{
}
}
}
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por