Como usar os módulos RF 315/433Mhz

untitled-2

Estes módulos operam em pares, transmissor e receptor, nas frequências ou de 315 ou 433Mhz, verifique sua versão. Eles são facilmente encaixados na protoboard e funcionam muito bem com Microcontroladores de modo que é possível criar um link de dados wireless, ou seja, transmitir dados de um Arduino para o outro sem quaisquer fios entre eles. Uma vez que os módulos ou são apenas transmissores ou apenas receptores eles só iram se comunicar em uma direção, sendo esta uma comunicação do tipo Simplex. Neste caso, as transmissões podem ser feitas apenas num só sentido, de um emissor para um ou mais receptores.

Aqui vamos ler a temperatura utilizando um DHT22 em um Arduino, transmitir para outro Arduino via RF no qual a temperatura será exibida em um display LCD, para isso vamos precisar de:

Componentes:

2 – Arduino (Qualquer versão)
1 – Transmissor RF 315Mhz (link)
1 – Receptor RF 315Mhz (link)
1 – Sensor de Temperatura e Umidade DHT22 (link)
1 – Display LCD 1602 com I2C (link)
2 – Fios de cobre de 22cm (Leia abaixo)
+ Protoboard e acessórios

Antena:

Para antena de fio:

Para a antena de fio não há mistério, é simplesmente um condutor de cobre conectado ao circuito em que considerando a frequência de 315Mhz e que o comprimento da antena será de 1/4 do comprimento de onda temos que a antena deve possuir 22,6 cm de comprimento, bastando apenas soldar o fio de cobre no ponto designado para a antena. Já para a frequência de 433Mhz o comprimento é de 16,5 cm e o procedimento é o mesmo.

Para antena helicoidal:

As antenas helicoidais são construídas na forma espiral ou hélice a partir de um ou múltiplos condutores. Esse tipo de antena é naturalmente escolhido para produção de radiação polarizada de forma circular (FUSCO, 2006). Essa antena utiliza polarização circular, é bastante comum na comunicação de satélites, pois não precisam ajuste de polarização. Também é utilizada em receptores de navegação GPS, pois apresentam uma abertura compatível com o ângulo do sinal incidente dos satélites (FRANZ, 2007). Sua estrutura básica pode ser observada na figura abaixo.

Antena helicoidal – Imagem: everythingrf.com

Como é possível montar antenas de diversos ganhos de acordo com a necessidade ou vontade deixamos aqui o site onde você pode calcular como deve montar a antena da forma que queira: http://www.changpuak.ch/electronics/calc_12a.php

Montagem:

Ligações:

Transmissor

Receptor

Arduino Módulo RF Arduino Módulo RF
5V VCC 5V VCC
GND GND GND GND
D5 DAT D5 DAT
Arduino DHT22 Arduino Display LCD
5V Pino 1 5V VCC
D2 Pino 2 GND GND
GND Pino 4 A4 SDA
A5 SCL

Códigos:

Biblioteca VirtualWire (link)

Transmissor

#include <VirtualWire.h>
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup()
{
  Serial.begin(115200);   // Inicializa a Serial
  vw_set_tx_pin(5);       // Define o pino de dados como D5
  vw_setup(2000);         // Velocidade (Bits por segundo)
  dht.begin();            // Inicializa o DHT
}

void loop()
{
  float t = dht.readTemperature(); // Lê a temperatura
  char temp[16];
  dtostrf(t, 3, 1, temp);       // Converte o valor float para char
  Serial.print("Enviado : ");
  Serial.println(temp);
  envia(temp); // Envia os dados
  delay(2000);
}

void envia (char *dados)
{
  vw_send((uint8_t *)dados, strlen(dados));
  vw_wait_tx();                                 // Aguarda o fim do envio
}

Receptor

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <VirtualWire.h>


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
String temp;

void setup()   {
  lcd.begin(16, 2);           // Inicializa o Display
  Serial.begin(115200);       // Inicializa a Serial
  vw_set_rx_pin(5);           // Define o pino de dados como D5
  vw_setup(2000);             // Velocidade (Bits por segundo)
  vw_rx_start();              // Inicializa o receptor

  lcd.setCursor(0, 0); //Seta a posição do cursor
  lcd.print("Aguardando...");
  delay(2000);
}

void loop()
{
  uint8_t message[VW_MAX_MESSAGE_LEN];
  uint8_t msgLength = VW_MAX_MESSAGE_LEN;
  
  if (vw_get_message(message, &msgLength))
  {
    Serial.print("Recebido: ");
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("Temperatura");
    // Converte para texto
    for (int i = 0; i < msgLength; i++)
    {
      Serial.write(message[i]);
      temp += char(message[i]);
    }
    lcd.setCursor(5, 1);
    lcd.print(temp);
    lcd.print(" ");
    lcd.print((char)223); // Símbolo de graus
    lcd.print("C");
    Serial.println();
    
    temp = "";    //Limpa o texto
    
    //Pisca o led indicador
    digitalWrite(12, HIGH);
    delay(100);
    digitalWrite(12, LOW);
  }
}

 

Este artigo contou com o apoio da ICStation que nos forneceu produtos para que nós continuemos criando conteúdo para o site, deixamos aqui nosso agradecimento pelo apoio. Se você não viu o unboxing, acesse aqui: https://youtu.be/ZdTkUyJx6ko

Quer ganhar desconto nas compras da ICStation? Basta usar:
Cupom: Jmics
Válido somente até 26/12/16, corre lá!
ICStation:  https://bit.ly/2chMjJI

 

0

Graduando em Engenharia Elétrica pela Universidade Federal de São João del Rei (UFSJ) também é Técnico em Eletrotécnica pelo Centro Federal de Educação Tecnológica de Minas Gerais (CEFET-MG). Apaixonado por criação e desenvolvimento de projetos relacionados à software e hardware.

1 Comentário

  1. Maike Douglas - 26/02/2018 reply

    Cara, achei bacana a parte que fala sobre a antena, pois nenhum outro artigo sobre Modulo Rf que li falou sobre. Porem teu tutorial é bom pra copiar e colar, e fazer pequenas modificações… Tem muita coisa não comentada, e tem muita coisa que só um comentário resumido não é bastante.
    Vamos lá, Não sou tão iniciante, mas tbm não sou avançado…

    Gostaria de entender :

    char temp[16]; // oque significa esse [16]?

    dtostrf(t, 3, 1, temp); // Como funciona essa conversão, o que cada valor separado por virgula e pra que ela serve…

    Entre as linhas 33 e 37 da parte que recebe… Não consegui entender o que esta acontecendo nessa parte.

    for (int i = 0; i < msgLength; i++) // o que esta sendo incrementado e pra que..
    {
    Serial.write(message[i]);
    temp += char(message[i]); // tbm não entendi o que acontece aqui
    }

    Estou tentando fazer com que um Arduino Pro Mini com um teclado matricial tipo membrana, acione um modulo rele de 4 canais para acender lampadas em outro Arduino tipo UNO.
    Onde cada numero do teclado vai acionar seus respectivos relé para acender suas respectivas lampadas.

    Se puder me da uma luz no meu projeto, so gostaria de saber como enviar um codigo, ou uma sequencia de 3 numeros, algo que identifique a tecla que estou pressionando.
    No meu entendimento as portas digitais só enxergam 0 e 1, acho que teria que usar as portas analogicas, mas não sei como usar… mas se puder ser feito pelas portas digitais, me da um exemplo de como ficaria.

    Grato.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *