Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
TECHNOSAT

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

Recommended Posts

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

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×