Módulo de RF enviar somente uma informação

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();
}

você não está perdendo um par de {} para este if?

Eu coloquei o par de {} conforme você mencionou J-M-L Jackson e coloquei uma trava no if, ficou assim:

` if (millis() - prev_time1 > interval1  && trava==0 )
        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
           trava=1;
           Serial.println("OK");

Ai pedi para zerar essa memória na minha condição de reset geral.. ai deu certo, muito obrigado pela ajuda..

:slight_smile: :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.