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
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

11 comentários em “Transmitindo Dados de Sensores via RF com Arduino”

    1. Obrigado Apolônio!
      Conseguiu testar? Vou ampliar esse post, colocando mais informações sobre esses módulos…

  1. 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!

  2. Bem explicado, José. Se quisermos um valor de temperatura mais preciso (com ponto flutuante), como definir o pacote que será enviado? Um abraço!

    1. 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);

  3. 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
    (….)

Deixe um comentário

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