Olá, nesse código que eu tenho, ao inserir sinal no pino 2 digital por no mínimo 1 segundo , ele começa a enviar informações do RF transmissor para o RF receptor na velocidade de 200ms infinitamente , até que eu remova o sinal do pino 2..
Porem eu preciso que ao inserir sinal no pino 2 por mais de 1 segundo, ele envie a informação somente uma vez, independente do tempo que a entrada 2 ficar acionada..
Ai ao remover o sinal e injetar novamente no pino 2 ele me dê novamente só uma informação.
Como fazer isso? tentei executar o loop do if somente uma vez, ele manda a informação (acompanhei pelo serial monitor), mas não chega no RF receptor.
Código do programa TRANSMISSOR:
#include <RH_ASK.h> //INCLUSÃO DE BIBLIOTECA
#include <SPI.h> //INCLUSÃO DE BIBLIOTECA
unsigned char prev_but1 =0;
unsigned char but1 = 0;
unsigned long prev_time1 = 0;
const unsigned long interval1 = 1000;
RH_ASK driver; //CRIA O DRIVER PARA COMUNICAÇÃO
const int pinoBotao = 2; //PINO DIGITAL UTILIZADO PELO PUSH BUTTON
void setup(){
Serial.begin (9600);
driver.init(); //INICIALIZA A COMUNICAÇÃO RF DO DRIVER
pinMode(pinoBotao, INPUT_PULLUP); //DEFINE O PINO COMO ENTRADA / "_PULLUP" É PARA ATIVAR O RESISTOR INTERNO
//DO ARDUINO PARA GARANTIR QUE NÃO EXISTA FLUTUAÇÃO ENTRE 0 (LOW) E 1 (HIGH)
}
void loop(){
const char *msg = "led"; //VARIÁVEL RECEBE O VALOR (led)
// if(digitalRead(pinoBotao) == LOW){ //SE A LEITURA DO PINO FOR IGUAL A LOW, FAZ
// driver.send((uint8_t *)msg, strlen(msg)); //ENVIA AS INFORMAÇÕES PARA O RECEPTOR (PALAVRA: led)
// driver.waitPacketSent(); //AGUARDA O ENVIO DAS INFORMAÇÕES
// delay(200); //INTERVALO DE 200 MILISSEGUNDOS
// }
if (digitalRead(pinoBotao) != prev_but1 && digitalRead(pinoBotao) == LOW)
{
prev_time1 = millis();
}
if (digitalRead(pinoBotao) == LOW)
{
if (millis() - prev_time1 > interval1 )
driver.send((uint8_t *)msg, strlen(msg)); //ENVIA AS INFORMAÇÕES PARA O RECEPTOR (PALAVRA: led)
driver.waitPacketSent(); //AGUARDA O ENVIO DAS INFORMAÇÕES
delay(200); //INTERVALO DE 200 MILISSEGUNDOS
Serial.println("OK");
} else {prev_time1 = millis();
}
prev_but1 = digitalRead(pinoBotao);
}
Código RECEPTOR:
#include <LiquidCrystal.h> //INCLUSÃO DE BIBLIOTECA
#include <avr/wdt.h>
#include <RH_ASK.h> //INCLUSÃO DE BIBLIOTECA RF
#include <SPI.h> //INCLUSÃO DE BIBLIOTECA RF
RH_ASK driver; //CRIA O DRIVER PARA COMUNICAÇÃO RF
String str = ""; //VARIÁVEL DO TIPO STRING RF
int statusLed = 0; //VARIÁVEL DO TIPO INT (CONTROLA O ESTADO ATUAL DO LED) RF
int esd =7;
int card =8;
const int ledpin =9;
int buzzer =10;
int buttonState;
int buttonState1;
int porta;
int trava;
int trava1;
int trava2;
int trava3;
int trava4;
int trava5;
int trava6;
int esd_ok;
int cracha_ok;
int reset;
unsigned char prev_but =0;
unsigned char but = 0;
unsigned long prev_time = 0;
const unsigned long interval = 2000;
LiquidCrystal lcd(12, 13, 5, 4, 3, 2); //PORTAS DO ARDUINO QUE SÃO UTILIZADAS PELO DISPLAY LCD
void setup(){
lcd.begin(16, 2); //SETA A QUANTIDADE DE COLUNAS(16) E O NÚMERO DE LINHAS(2) DO DISPLAY. EM SUMA: UMA MATRIZ DE 16 COLUNAS E 2 LINHAS
Serial.begin (9600);
pinMode(6,OUTPUT); //DECLARA QUE O PINO 6 É UMA SAÍDA
pinMode(ledpin, OUTPUT); //DECLARA QUE O PINO 9 É UMA SAÍDA
pinMode(buzzer, OUTPUT); //DECLARA QUE O PINO 9 É UMA SAÍDA
analogWrite(6,130); //ESCREVE O VALOR 50 NA PORTA 6 (CONTROLE DO CONTRASTE VIA PWM)
wdt_enable(WDTO_8S); //FUNÇÃO QUE ATIVA E ALTERA O WATCHDOG}
pinMode(esd, INPUT);
pinMode(card, INPUT);
driver.init(); //INICIALIZA A COMUNICAÇÃO RF DO DRIVER RF
}
void loop() {
//buttonState = digitalRead(esd); //CARD
buttonState1 = digitalRead(card); //ESD
if (reset==1)
{
buttonState=0;
esd_ok =0;
cracha_ok =0;
trava=0;
trava1=0;
trava2=0;
trava3=0;
trava4=0;
}
if (buttonState1 == 1)
{
cracha_ok=1;
}
if (buttonState == 1 )
{
esd_ok=1;
}
if (esd_ok ==0 && cracha_ok ==0 && trava==0 )
{
lcd.clear();
lcd.setCursor(0,0); //SETA A POSIÇÃO EM QUE O CURSOR INCIALIZA(LINHA 1)
lcd.print(" VALEO "); //ESCREVE A PALAVRA "MASTERWALKERSHOP" NA PRIMEIRA LINHA DO DISPLAY LCD
lcd.setCursor(0,1); //SETA A POSIÇÃO EM QUE O CURSOR RECEBE O TEXTO A SER MOSTRADO(LINHA 2)
lcd.print(" CONTROLE DE ESD"); //ESCREVE A PALAVRA "DISPLAY LCD 16X2" NA SEGUNDA LINHA DISPLAY LCD
digitalWrite(ledpin, LOW);
trava=1;
Serial.println("CONTROLE DE ESD ");
}
if (cracha_ok ==1 && trava1==0)
{
lcd.clear();
lcd.setCursor(0,0); //SETA A POSIÇÃO EM QUE O CURSOR INCIALIZA(LINHA 1)
lcd.print(" REALIZE "); //ESCREVE A PALAVRA "MASTERWALKERSHOP" NA PRIMEIRA LINHA DO DISPLAY LCD
lcd.setCursor(0,1); //SETA A POSIÇÃO EM QUE O CURSOR RECEBE O TEXTO A SER MOSTRADO(LINHA 2)
lcd.print(" TESTE ESD"); //ESCREVE A PALAVRA "DISPLAY LCD 16X2" NA SEGUNDA LINHA DISPLAY LCD
trava1=1;
Serial.println("REALIZE O TESTE ESD");
}
if (esd_ok ==1 && trava2==0 )
{
lcd.clear();
lcd.setCursor(0,0); //SETA A POSIÇÃO EM QUE O CURSOR INCIALIZA(LINHA 1)
lcd.print(" APROXIME"); //ESCREVE A PALAVRA "MASTERWALKERSHOP" NA PRIMEIRA LINHA DO DISPLAY LCD
lcd.setCursor(0,1); //SETA A POSIÇÃO EM QUE O CURSOR RECEBE O TEXTO A SER MOSTRADO(LINHA 2)
lcd.print(" O CRACHA"); //ESCREVE A PALAVRA "DISPLAY LCD 16X2" NA SEGUNDA LINHA DISPLAY LCD
trava2=1;
Serial.println("APROXIME O CRACHA ");
}
if (esd_ok ==1 && cracha_ok ==1 && trava3==0 )
{
trava3=1;
trava4=4;
lcd.clear();
lcd.setCursor(0,0); //SETA A POSIÇÃO EM QUE O CURSOR INCIALIZA(LINHA 1)
lcd.print(" PORTA"); //ESCREVE A PALAVRA "MASTERWALKERSHOP" NA PRIMEIRA LINHA DO DISPLAY LCD
lcd.setCursor(0,1); //SETA A POSIÇÃO EM QUE O CURSOR RECEBE O TEXTO A SER MOSTRADO(LINHA 2)
lcd.print(" LIBERADA"); //ESCREVE A PALAVRA "DISPLAY LCD 16X2" NA SEGUNDA LINHA DISPLAY LCD
Serial.println("PORTA LIBERADA ");
}
if(trava4==4)
{
digitalWrite(buzzer, LOW);
delay(100);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
digitalWrite(ledpin, LOW);
delay(5000);
reset=1;
}
else{
reset=0;
digitalWrite(ledpin, HIGH);
digitalWrite(buzzer, HIGH);
}
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]; //LÊ A MENSAGEM RECEBIDA (PALAVRA: led) RF
uint8_t buflen = sizeof(buf); //CRIA O COMPRIMENTO DO BUFFER PARA O TAMANHO DE buf RF
if(driver.recv(buf, &buflen)){ //SE O DRIVER RECEBEU buf(INTEIRO) E buflen (COMPRIMENTO DE DADOS), FAZ RF
str = ""; //VARIÁVEL RECEBE VAZIO RF
int i; //VARIÁVEL LOCAL DO TIPO INTEIRO RF
for(int i = 0; i < buflen; i++){ //PARA i IGUAL A 0, ENQUANTO i MENOR QUE buflen, INCREMENTA i RF
str += (char)buf[i]; //VARIÁVEL RECEBE OS CARACTERES E FORMA A PALAVRA RF
}
if((str.equals("led")) && (statusLed == 0)){ //SE str FOR IGUAL A "led" E statusLed FOR IGUAL A 0, FAZ RF
statusLed = 1; //VARIÁVEL RECEBE 1 RF
buttonState=1; //ACENDE O LED
}else{ //SENÃO, FAZ RF
if((str.equals("led")) && (statusLed == 1)){ //SE str FOR IGUAL A "led" E statusLed FOR IGUAL A 1, FAZ RF
statusLed = 0; //VARIÁVEL RECEBE 0 RF
buttonState=0; //APAGA O LED RF
}
}
}
Serial.println(buttonState);
wdt_reset();
}