X

Transmitindo Dados de Sensores via RF com Arduino

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.

Módulo RF 433 MHz

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.

Referências

José Cintra:
Related Post