Ir ao conteúdo
  • Cadastre-se

Arduino comunicação serial arduíno hc12 lm35 lcd-i2c


Posts recomendados

Boa tarde a todos. Posto abaixo "dois pares de códigos" que elaborei para o Arduíno usando em ambos o "Módulo RF Wireless HC-12" com apoio de um LCD I2C 16x2. Trata-se do melhor módulo RF que já encontrei para trabalhar com o Arduíno, que alcança distância de mais de 1000 metros e sua programação é bem simples, utilizando uma biblioteca nativa do Arduíno chamada "SoftwareSerial". Os programas abaixo funcionam perfeitamente e podem auxiliar àqueles que, como eu, estão a procura de uma comunicação RF potente e de simples programação.

 

O primeiro código faz a leitura remota de temperatura em um LM35 pelo HC12-transmissor e é recebida por outro HC12-receptor, sendo impressa no LCD 16x2. Todas as informações para ligação ao hardware estão no próprio programa.

 

O segundo código ascende e apaga 02 leds no HC12-receptor (simulando a lâmpadas de uma casa) com apenas dois botões que são acionados no HC12-transmissor, que imprime o estado das lâmpadas no LCD-I2C. O grande diferencial deste projeto á a comunicação de confirmação mantida entre os módulos,de forma que, além de atuar (ascendo ou apagando), os módulos RFs emitem confirmação uma ao outro de que receberam a ordem para executar alguma ação. Todas as informações para ligação ao hardware estão no próprio programa.

 

O que ainda ainda não consegui, e neste ponto gostaria de alguma ajuda, é unir os dois códigos de forma que: em repouso, no LCD fique registrado continuamente a temperatura (c/ backlight apagado p/ economizar) e quando os botões forem acionados, as mensagens sobre a iluminação seja impressa por dois segundos no LCD (sobre escrevendo a temperatura) , retornando logo após ao registro contínuo da temperatura. Talvez eu não esteja compreendendo por completo a comunicação serial e por isso não tive exito em juntar os dois programas.

 

1) Transmissor Temperatura HC12/LM35: 

//Transmissor de temperatura com LM35 HC12.
// Autor: Odair José Gomes

//LIGAÇÕES LM35:
//https://portal.vidadesilicio.com.br/lm35-medindo-temperatura-com-arduino/

const int LM35 = A0; // Define o pino analogico para leitura do LM35.
float temperatura; // Variável que armazenará a temperatura medida após a conversão.
#include <SoftwareSerial.h> // biblioteca SoftwareSerial (nativa arduino).
SoftwareSerial mySerial(2, 3); //RX, TX criado pela biblioteca SoftwareSerial.

void setup() { // configurações iniciais
     Serial.begin(9600); // inicializa a comunicação serial.
     mySerial.begin(9600); // inicializa Serial do HC12.
     }

void loop() { // laço de repetição
     temperatura = (float(analogRead(LM35))*5/(1023))/0.01; // converte a leitura pino A0 p/ Cº e armazena na variavel.
     Serial.println (temperatura, 1); // escreve a leitura convertida na serial do PC c/ 1 digito após a virgula.
     mySerial.write(analogRead(LM35)); // encaminha a leitura de A0 p/ o HC12 receptor.
     mySerial.flush(); // faz a limpesa da serial.
     delay(1000); // espera 1 segundo
     //FIM
  }

2) Receptor Temperatura HC12/LCD-I2C: 

//Receptor de temperatura com LM35 HC12.
// Autor: Odair José Gomes

//LCD 16x2 I2C:
// http://www.arduinoecia.com.br/2014/12/modulo-i2c-display-16x2-arduino.html

#include <SoftwareSerial.h> // biblioteca SoftwareSerial (nativa do arduino).
SoftwareSerial mySerial(2, 3); //RX, TX criado pela biblioteca SoftwareSerial.
#include <Wire.h> // biblioteca I2C p/ uso do modulo I2C com o LCD 16x2.
#include <LiquidCrystal_I2C.h> // biblioteca LCD.
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE); // configuração LCD I2C.
float temperatura; // Variável que armazenará a temperatura medida após a conversão.


void setup() {
  Serial.begin(9600); // inicializa a comunicação serial do PC
  mySerial.begin(9600); // inicializa a comunicação serial do HC12.
  lcd.begin (16,2); // inicia o LCD 16 colunas/02 linhas.
  }

void loop() {
  if(mySerial.available()>1){ // se houver dados no serial:
    temperatura = (float(mySerial.read ())*5/(1023))/0.01; // converte a leitura pino A0 p/ Cº e armazena na variavel.
    lcd.setCursor(3,0); //posiciona o curosr de escrita
    lcd.print("TEMPERATURA "); // escreve a seguinte frase
    lcd.setCursor(6,1); //posiciona o cursor de escrita do LCD.    
    lcd.print(temperatura,1); // escreve a leitura convertida no LCD c/ 1 digito após a virgula.    
    mySerial.flush(); // faz a limpesa da serial. 
    }    
    delay(20);//uma pequena espera p/ melhorar a comunicação.
    }    
    //FIM

1) Automação Iluminação Receptor Arduíno HC12/Leds:  

//Receiver HC12 com 02 Leds. 
//Autor Odair José Gomes

// HC12:
//http://www.arduinoecia.com.br/2016/11/modulo-wireless-hc-12-arduino.html

#include <SoftwareSerial.h> // biblioteca SoftwareSerial (nativa do arduino). 
SoftwareSerial mySerial(2, 3); // RX, TX criados pela biblioteca SoftwareSerial.
int ledPin13 = 13; //led no pino 13.
int ledPin12 = 12; //led no pino 12.
unsigned long last = millis(); //variavel que armazena "millis ()".
int input; // variavel que armazena os dados enviados pelo receptor HC12.

void setup() { // configurações iniciais.
  mySerial.begin(9600); // inicia o serial do HC12.
  Serial.begin (9600); // inicia o serial do PC.
  pinMode(ledPin13, OUTPUT); //pino led 13 como saida.
  pinMode(ledPin12, OUTPUT); //pino led 12 como saida.
}

void loop() { // laço de repetição.

  boolean ledState13 = digitalRead(ledPin13); //variavel que armazena o estado do led 13.
  boolean ledState12 = digitalRead(ledPin12); //variavel que armazena o estado do led 12.
  
  if(mySerial.available() > 1){ // se houver dados na serial:    
    input = mySerial.parseInt(); //leia a entrada em série e converta em número inteiro (-32,768 a 32,767).
    if(millis() - last > 250){ //se o tempo agora for 250 milissegundos maior do que a última vez.
    
      if(ledState13 == 0 && input == 1111){ //se o LED 13 estiver desligado e o código recebido for 1111.
          digitalWrite(ledPin13, HIGH); // liga o led pino 13.
          mySerial.println(1222); //envie um código de confirmação ao HC12 transmissor. Neste caso, 1222.
          Serial.println ("led13 aceso"); // escreva a frase no serial do PC.
          
      }else if(ledState13 == 1 && input == 1111){//se o LED 13 estiver ligado e o código recebido for 1111.
         digitalWrite(ledPin13, LOW); // desliga o led pino 13.
         mySerial.println(1333); //envie um código de confirmação ao HC12 transmissor. Neste caso, 1333.
         Serial.println ("led13 apagado"); // escreva a frase no serial do PC.
      }
      
    if(ledState12 == 0 && input == 2111){ //se o LED 12 estiver desligado e o código recebido for 2111.
          digitalWrite(ledPin12, HIGH); // liga o led pino 12.
          mySerial.println(2222); //envie um código de confirmação ao HC12 transmissor. Neste caso, 2222.
          Serial.println ("led12 aceso"); // escreva a frase no serial do PC.
          
      }else if(ledState12 == 1 && input == 2111){//se o LED estiver ligado e o código recebido for 2111.
         digitalWrite(ledPin12, LOW); // desliga o led pino 12.
         mySerial.println(2333);//envie um código de confirmação ao HC12 transmissor. Neste caso, 2333.
         Serial.println ("led12 apagado"); // escreva a frase no serial do PC.         
      }      
      
    }    
    mySerial.flush();// limpe o buffer serial para entradas indesejadas.   
    last = millis();//reset millis ().   
  }
  
  delay(20);//uma pequena pausa para uma melhor comunicação serial.
 
}
// FIM

2) Automação Iluminação Transmissor Arduíno HC12/LCD-I2C:  

//Sender HC12 com 02 Leds.
//Autor: Odair Jose Gomes

// LCD I2C: http://www.arduinoecia.com.br/2014/12/modulo-i2c-display-16x2-arduino.html
// HC12: http://www.arduinoecia.com.br/2016/11/modulo-wireless-hc-12-arduino.html

#include <SoftwareSerial.h> // biblioteca SoftwareSerial (nativa do arduino). 
#include <Wire.h> // biblioteca wire.
#include <LiquidCrystal_I2C.h> //biblioteca LCD.
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3, POSITIVE); // configuração LCD I2C.
SoftwareSerial mySerial(2, 3); // RX, TX criados pela biblioteca SoftwareSerial.
int buttonPin8 = 8; // botão no pino 8.
int buttonPin9 = 9; // botão no pino 9.
int input; // variavel que armazena os dados enviados pelo transmissor HC12.

void setup() { // configurações inciais.
  pinMode(buttonPin8, INPUT); // pino 8 como entrada.
  pinMode(buttonPin9, INPUT);  
  mySerial.begin(9600); // inicia o serial do HC12.
  Serial.begin(9600); // inicia o serial do PC.
  lcd.begin (16,2); // informa que o LCD é 16x2.
  lcd.setBacklight(LOW); // apaga a luz de fundo do LCD.  
  }

void loop() { // laço de repetição. 
  int buttonState8 = digitalRead(buttonPin8); //variável que armazena o estado do botão pino 8.
  int buttonState9 = digitalRead(buttonPin9); 
  
  if(buttonState8 == 1){ //se o botão8 foi acionado.
    mySerial.println(1111); //envie um código exclusivo para o HC12 receptor atuar. Neste caso, 1111.      
    }
    
  if(buttonState9 == 1){ //se o botão9 foi acionado.
    mySerial.println(2111); //envie um código exclusivo para o HC12 receptor atuar. Neste caso 2111.       
    }
    
    input = mySerial.parseInt(); //leia a entrada em série e converta em número inteiro (-32,768 a 32,767).
    
    if(input == 1222){ //se este código for recebido:
    Serial.println ("GARAGEM ACESA"); // escreve a palavra no seria do PC.
    lcd.setBacklight(HIGH); // acende a luz de fundo do LCD.  
    lcd.setCursor(3,0); // movimenta o cursor do LCD.
    lcd.print("GARAGEM "); // escreve a apalavra no LCD.
    lcd.setCursor(0,1); // movimenta o cursor do LCD.
    lcd.print("LAMPADA ACESA "); // escreve a apalavra no LCD.
    delay (2000); // espera 2 segundos.
    lcd.clear(); //limpa o LCD.
    lcd.setBacklight(LOW); // apaga a luz de fundo do LCD.      
    }
   
    else if(input == 1333){
    Serial.println ("GARAGEM APAGADA");
    lcd.setBacklight(HIGH);
    lcd.setCursor(3,0);
    lcd.print("GARAGEM ");
    lcd.setCursor(0,1);
    lcd.print("LAMPADA APAGADA ");
    delay (2000);
    lcd.clear();
    lcd.setBacklight(LOW);
    }      
       
    if(input == 2222){
    Serial.println ("AREA DO FUNDO ACESA");
    lcd.setBacklight(HIGH);
    lcd.setCursor(2,0);
    lcd.print("AREA DO FUNDO ");
    lcd.setCursor(2,1);
    lcd.print("LAMPADA ACESA ");
    delay (2000);
    lcd.clear();
    lcd.setBacklight(LOW);    
    }
   
    else if(input == 2333){
    Serial.println ("AREA DO FUNDO APAGADA");
    lcd.setBacklight(HIGH);
    lcd.setCursor(2,0);
    lcd.print("AREA DO FUNDO ");
    lcd.setCursor(1,1);
    lcd.print("LAMPADA APAGADA ");
    delay (2000);
    lcd.clear();
    lcd.setBacklight(LOW);    
    }
   
  delay(20);//espera 20 ms para melhorar a comunicação
}
//FIM

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...