Neste pequeno projeto vamos demonstrar como usar o Arduino para transmitir dados de sensores via RF – Rádio Frequência
Nosso objetivo é testar a transmissão wireless por RF com Arduino.
Para isso, vamos usar o módulo RF 433 Mhz (transmissor e receptor) muito simples, barato e fácil de configurar.
Esse módulo proporciona a comunicação unidirecional com alcance entre 20 a 200 metros com baixo consumo de energia.
Hardware Necessário
Para o transmissor:
- Arduino compatível (no meu caso, usei o Arduino Mega 2560);
- Sensor de temperatura DHT11;
- Módulo transmissor RF 433 Mhz.
Para o receptor:
- Arduino compatível;
- Módulo receptor RF 433 Mhz.
Onde Comprar:
Curto Circuito – Componentes Eletrônicos e Acessórios
Software Necessário
Para controlar o sensor DHT11, precisaremos da biblioteca da Adafruit que você pode baixar do seguinte endereço:
https://github.com/adafruit/DHT-sensor-library
Essa lib é dependente da Adafruit Unified Sensor Library que você encontra aqui:
https://github.com/adafruit/Adafruit_Sensor
Lembre-se: Para instalar essas bibliotecas, você pode usar a própria IDE do Arduino através do Gerenciador de Bibliotecas.
Para a transmissão RF, vamos usar uma biblioteca bem leve que é especializada nos módulos que estamos usando:
Transmissor: https://github.com/zeitgeist87/RFTransmitter
Receptor: https://github.com/zeitgeist87/RFReceiver
Biblioteca auxiliar: https://github.com/zeitgeist87/PinChangeInterruptHandler
Esquema de ligação
No transmissor, ligamos o DHT11 na porta digital 3 e o Transmissor RF na porta digital 11.
No receptor, ligamos o Receptor RF na porta digital 2.
Veja o Vídeo da montagem aqui:
O Sketch
Para o transmissor:
#include "DHT.h" #define DHTPIN 3 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); #include <RFTransmitter.h> #define NODE_ID 1 #define OUTPUT_PIN 11 RFTransmitter transmitter(OUTPUT_PIN, NODE_ID); void setup() { dht.begin(); } void loop() { delay(5000); //Tempo entre as transmissões int t = dht.readTemperature(); //Leitura da temperatura em Celsius if (isnan(t)) { Serial.println("Falha na leitura da temperatura!"); return; } //Nessas 3 linhas convertemos a temperatura de int para array de chars String temp = String(t); char msg[5]; temp.toCharArray(msg,5); transmitter.send((byte *)msg, strlen(msg) + 1) // Envio dos dados delay(5000); transmitter.resend((byte *)msg, strlen(msg) + 1); //Retransmissão para garantir a integridade }
Para o Receptor:
#include <PinChangeInterruptHandler.h> #include <RFReceiver.h> // Leitura na porta 2 RFReceiver receiver(2); void setup() { Serial.begin(9600); receiver.begin(); } void loop() { char msg[MAX_PACKAGE_SIZE]; //As 2 variáveis abaixo podem ser usadas para determinar o pacote e o canal byte senderId = 0; byte packageId = 0; byte len = receiver.recvPackage((byte *)msg, &senderId, &packageId); Serial.println(""); Serial.print("Temperatura: "); Serial.print(msg); Serial.println(" C"); }
Melhorando o alcance da transmissão
Como vimos, esses módulos possuem um alcance pequeno que pode variar entre 20 a 200 metros. Seguem algumas dicas para melhorar essa faixa:
- Utilização de antenas para aumentar o alcance da transmissão: Nos módulos existe um furação para colocação de uma antena como essa: Antena Helicoidal de 2dBi para RF 433MHz
- Alimentação elétrica do transmissor: O transmissor suporta tensões de entrada de 5 a 12V. Quanto maior a tensão, melhor a transmissão. Uma dica é usar uma fonte de 12V para alimentar o Arduino e ligar o módulo na porta VIN.
Conclusão
Espero ter ajudado o(a) leitor(a) em seus estudos sobre transmissão wireles RF com Arduino.