RF 433 MHz consiste em um par de módulos transmissor e receptor de baixíssimo custo.
Ideal para iniciantes que desejam uma comunicação Wireless.
Popularmente usado em controle remoto, também se usa para transmissão de dados em baixa velocidade e curta distância.
Utiliza uma comunicação via rádio frequência com modulação AM e frequência de trabalho de 433MHz.
Especificações
Transmissor:
-
- Descrição do Produto: MX-FS-03V
- Alcance: 20-200 metros
- Tensão de operação: 3,5-12V
- Modo de operação: AM (Modulação em Amplitude)
- Taxa de transferência: 4KB/s
- Potência de transmissão:10mW
- Frequência de transmissão: 433MHz
- Dimensões: 19mm x 19mm
Receptor:
-
- Descrição do Produto: MX-05V
- Tensão de operação: 5V DC
- Corrente de operação: 4mA
- Sensibilidade: -105dB
- Frequência de recepção: 433MHz
- Dimensões: 30mm x 14mm x 7mm
Material Necessário para Teste e Projeto
-
- 02 – Arduino
- 01 – Par de Módulos TX/RX RF 433 MHz
- 02 – Push button
- 02 – Resistor 220 Ω
- 02 – Resistor 10 KΩ
- Jumpers
Conhecendo os Módulos RF 433 MHz
Quase sempre, quando obtemos algum dispositivo novo, é logo saber se realmente está funcionando, mas para isso devemos ter conhecimento de como fazer a conexão correta.
A montagem com o Arduino é bem simples como podemos observar nos esquemas a seguir:
Primeiramente, devemos incluir a biblioteca RH_ASK.h na IDE Arduino. Feito isso, monte os módulos nas respectivas placas conforme os esquemas:
Transmissor
Receptor
Feita a montagem, então carregue os códigos:
Transmissor (Pino DATA na Porta Digital 12)
//TRANSMITTER PINO 12 // RadioHead - Version: Latest #include <RH_ASK.h> // SPI - Version: Latest // Not actualy used but needed to compile #include <SPI.h> RH_ASK driver; void setup() { Serial.begin(9600); if (!driver.init()) Serial.println("init failed"); } void loop() { const char *msg = "Hello World!"; driver.send((uint8_t *)msg, strlen(msg)); driver.waitPacketSent(); delay(1000); }
Receptor (Pino DATA na Porta Digital 11)
//RECEIVER // RadioHead - Version: Latest #include <RH_ASK.h> // SPI - Version: Latest // Not actualy used but needed to compile #include <SPI.h> RH_ASK driver; void setup() { Serial.begin(9600); if (!driver.init()) Serial.println("init failed"); } void loop() { uint8_t buf[12]; uint8_t buflen = sizeof(buf); if (driver.recv(buf, &buflen)) { int i; Serial.print("Message: "); Serial.println((char*)buf); } }
O interessante desta biblioteca RH_ASK.h é que os pinos DATA já estão definidos. O transmissor devemos conectar o pino DATA na porta digital 12 no Arduino. O receptor devemos conectar o pino DATA na porta digital 11.
Então, já com os códigos carregados, basta abrir o Monitor Serial do receptor e se estiver tudo correto aparecerá uma mensagem a cada 1 segundo.
Projeto
Depois de testar o funcionamento dos módulos RF 433 MHz, estamos prontos para iniciarmos um projeto simples de acendimento de LEDs via rádio.
Então, monte o projeto conforme os esquemas:
Transmissor
Receptor
Inclua a biblioteca VirtualWire.h e depois carregue os códigos:
Código transmissor
#include <VirtualWire.h> #define pinRF 12 struct tipoPacote { boolean valor1; boolean valor2; }; tipoPacote pacote; boolean leBotao(int porta); // Protótipo função que lê o botão. # define botaoPin_1 5 // Entrada do push button # define botaoPin_2 6 // Entrada do push button void setup() { vw_set_tx_pin(pinRF); vw_set_ptt_inverted(true); vw_setup(2000); Serial.begin(9600); pinMode(botaoPin_1, INPUT_PULLUP); // Define o pino do botão como INPUT_PULLUP pinMode(botaoPin_2, INPUT_PULLUP); } void loop() { vw_send((uint8_t *)&pacote, sizeof(pacote)); vw_wait_tx(); pacote.valor1 = leBotao(botaoPin_1); Serial.print("Botao Verde "); Serial.println(pacote.valor1); pacote.valor2 = leBotao(botaoPin_2); Serial.print("Botao Vermelho "); Serial.println(pacote.valor2); delay(100); } boolean leBotao(int porta) // Funçao lê botão { static boolean estadoAnterior[2] = {true, true}; /* static --> para manter a variável na memória */ boolean estadoBotao = digitalRead(porta); boolean ligado = false; if (!estadoBotao && estadoAnterior[porta]) /* Esse controle permite que, mesmo o botão permanecendo apertado, vai ser considerado apenas uma vez*/ { ligado = true; } estadoAnterior[porta] = estadoBotao; return ligado; }
Código Receptor
#include <VirtualWire.h> #define pinRF 11 struct tipoPacote { boolean valor1; boolean valor2; }; tipoPacote pacote; uint8_t buf[sizeof(pacote)]; uint8_t buflen = sizeof(pacote); # define LedVerde 5 # define LedVermelho 6 void setup() { Serial.begin(9600); vw_set_rx_pin(pinRF); vw_setup(2000); vw_rx_start(); pinMode(LedVerde, OUTPUT); pinMode(LedVermelho, OUTPUT); } void loop() { if ( vw_have_message() ) { vw_get_message(buf, &buflen); memcpy(&pacote, &buf, buflen); } if (pacote.valor1 == true) { digitalWrite(LedVerde, digitalRead(LedVerde) ^ 1); // Acende e apaga LED Verde Serial.println("LED Verde"); pacote.valor1 = false; } if (pacote.valor2 == true) { digitalWrite(LedVermelho, digitalRead(LedVermelho) ^ 1); // Acende e apaga LED Verde Serial.println("LED Vermelho"); pacote.valor2 = false; } delay(100); }
Então, feito isso, é só observar que ao pressionar cada botão seu respectivo LED acende e ao pressionar novamente o mesmo apaga.