Manual

do

Maker

.

com

Rádio HC12 433MHz

Rádio HC12 433MHz

Espero conseguir dar fluxo nos artigos sobre os materiais que estão chegando dos parceiros, mas podem ter certeza, é material para pelo menos 2 meses escrevendo todos os dias. Hoje é a vez da Fulltronic, um parceiro de longa data do nosso site, que abre essa nova temporada de artigos com o rádio HC12 433MHz.

HC12 433MHz

Bem, não é exatamente 433.0MHz. Na verdade, a faixa abrange de 433.4MHz a 473.0MHz, configurável. Esse artigo vai ser simples e direto, mas permita-me discorrer sobre o rádio.

Alcance

Não pude comprovar em ambiente sem obstáculos, mas as indicações são de que o alcance é de até 1km. Já a velocidade é extremamente baixa. Como diz Arnaldo, "a regra é clara"; mais banda, menor alcance. Mais alcance, menos banda.

O HC12 não é um LoRa, mas o alcance é significativo, podendo ser ideal para aplicações de baixo volume de dados.

Pinout

A comunicação com esse módulo se dá diretamente por UART, bastando conectar TX ao RX e vice-versa. Algumas pessoas confundem por não saberem que TX é Transmissão e Rx é Recepção, portanto, um Transmite para o outro que Recebe.

Além dos pinos de dados, o módulo possui um pino extra (SET) para programar ele próprio via comandos AT. Já a alimentação pode ser tanto 3v3 como 5v. A antena pode ser essa de mola que vem junto ou uma antena 433MHz omni com pig tail. A antena omni permite um alcance melhorado, mas a que vem junto já deve ser o suficiente para a maioria das aplicações.

 HC12 com Arduino

Por comodidade, optei por utilizar o Arduino Leonardo, que possui duas seriais; uma para a comunicação com o computador e a outra para utilizar como desejar, sendo os tradicionais pinos 0 e 1, livres para uso nesse modelo de Arduino. Nada que não pudesse ser resolvido com softserial, mas assim também digito menos código (ai, que preguiça). Além do mais, poderia ser utilizado com qualquer outra placa que ofereça uma comunicação UART; ESP8266, ESP32, Raspberry Pi, Banana Pi, Orange Pi, Arduino Industrial 101, Onion Omega, VoCore, Carambola ou diretamente do PC para um Arduino (gostei da última ideia, vou escrever a respeito).

Código de exemplo para rádio HC12 433MHz

Não precisa de nada, nenhuma biblioteca importada. Nada, por isso é tão fácil comunicá-lo com qualquer outra placa.

CODIGO Um sketch extremamente básico para iniciar uma comunicação seria:

void setup(){
    Serial.begin(9600);
    Serial1.begin(9600);
}

void loop(){
    Serial.println("enviando: Manual do Maker");
    Serial1.write("Manual do Maker");
    while (Serial1.available()){
      Serial.print((char)Serial1.read());
    }
    Serial.println("");
    delay(3000);
}

Nesse sketch, inicia-se duas seriais na velocidade de 9600. Escrever na Serial1 escreve os dados para o dispositivo conectado a ela. No caso, o HC12, que se encarrega de jogar "no ar" essa mensagem, seja ela qual for, sempre como bytes.

No receptor da mensagem seria:

bool msg = false;
void setup(){
    Serial.begin(9600);
    Serial1.begin(9600);
}

void loop(){
    Serial.print("Recebido: ");
    while (Serial1.available()){
      Serial.print((char)Serial1.read());
      msg = true;
    }
    Serial.println("");
    if (msg){
        Serial1.write("Bom site!");
        msg = false;
    }
    delay(3000);
}

Repare que a leitura é feita em um loop while enquanto houver dados advindos do emissor. Por isso, cada byte entrante é passado para char com o casting precedendo sua impressão na serial. Para quem não sabe, o casting é a conversão de tipo "in flow". Não é mágico, mas é útil (ou fundamental) em diversos casos.

Quem envia, recebe resposta:

enviado-300x206.webp

E quem recebe a mensagem original, apenas mostra a mensagem (a resposta não está sendo exibida):

recebido-300x178.webp

Ajustes de frequência e baudrate no rádio HC12 433MHz

Se precisar reconfigurar o dispositivo, utilize comandos do protocolo AT, descritos no datasheet (https://www.elecrow.com/download/HC-12.pdf). Eu não sei a range entre frequências. No caso do 915MHz, é a cada 0.125MHz, não pesquisei no 433MHz para saber, mas acredito que também tenha um padrão modular.

Defina um protocolo de mensagens

Para utilizar atuadores ou sensores, é tão simples quanto e basta definirmos um protocolo de troca de mensagem, fazer parsing e aplicar o resultado. Fácil ou não?

Vou sugerir um formato de mensagem para protocolo:

ID (1 Byte), ack (1 Byte) mensagem (1 Byte)

Pode parecer pouco, mas 1 Byte corresponde a 256 valores (0 à 255). O segundo byte (ack) serve para responder se a mensagem foi recebida; se estiver sendo enviada, mande com o valor 0. Se for uma resposta, devolva o ID:ack, sendo que ack pode ser qualquer valor diferente de 0. Se for 0, significa que é mensagem a ser lida; se for diferente de 0, pode ser "comando executado com sucesso" (1), "comando ignorado" (2) etc.

Supondo rádio 1enviando para rádio 2:

1:0:5

Essa mensagem representaria "rádio 1, há uma mensagem para você, ligue o relé 1". O dispositivo 1 lê qualquer coisa que for jogada em sua frequência, mas só importa a mensagem que comece com seu ID. A resposta seria algo como:

2:1:5

Que representaria algo como: "rádio 2, comando executado com sucesso, relé 1 ligado".

Para não executar comandos por engano, pode-se aumentar o identificar e também adicionar o identificador do originador da mensagem. Etc.

Ainda farei mais um ou dois artigos sobre esse rádio, vamos brincar mais em breve!

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.