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.
Parabéns José Cintra. Tópico muito bem feito e esclarecedor.
Abraços ;
Obrigado Murta. Fico muito feliz que gostou.
Muito bom parabéns gosto muito dessa area de transmissão RF vou testar aqui.
Obrigado Apolônio!
Conseguiu testar? Vou ampliar esse post, colocando mais informações sobre esses módulos…
Boa noite, no meu caso preciso de um transmissor um pouco mais potente. com alcance de 2 KM para controlar 2 bombas d’água. consigo fazer isso com o arduino?
Obrigado!
Bem explicado, José. Se quisermos um valor de temperatura mais preciso (com ponto flutuante), como definir o pacote que será enviado? Um abraço!
Olá João!
Mude a linha
int t = dht.readTemperature();
Para
float t = dht.readTemperature();
Na conversão pode ser necessário mudar o tamanho também.
Teste as leitura para saber o tamanho exato. Talvez 9
char msg[9];
temp.toCharArray(msg,9);
Muito obrigado, José! Valeu!
Top me ajudou demais, parabéns
Muito bom o projeto, estou tentando montar com o código, roda normalmente no not porém algo gravar o bootloader aparece a seguinte mensagem de erro:
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x03
(….)
O erro está na comunicação do Arduino e o PC pela porta USB. Verifique se vc escolheu o modelo certo de Arduino no menu Tools. A porta correta, etc.
Veja se a USB estáfuncionando corretamente.
Veja esse post do blog que pode ajudar: https://josecintra.com/blog/arduino-resolvendo-problemas-porta-usb/