Controle Remoto de Ventilador com Arduino
Atualmente, diversos dispositivos estão sendo desenvolvidos a fim de oferecer bem-estar às pessoas, através de pequenos sistemas de automação. Entre eles, desenvolveremos nesse artigo, o controle remoto de ventilador com Arduino, que permite ao usuário controlar o ventilador em sua cama.
Algumas empresas já oferecem ventiladores com essa funcionalidade.
Baseado nisto, esse artigo tem o objetivo de criar um controle remoto com Arduino para um ventilador, a fim de permitir controlá-lo por meio de comandos enviados pelo Arduino. Os dados de controle serão copiados do controle original.
Portanto, por meio deste artigo, você aprenderá:
1 – Reconhecer o padrão de código do controle IR;
2 – Realizar a leitura do código RAW;
3 – Enviar o código RAW de cada tecla e controlar as funcionalidades do ventilador;
4 – Desenvolver o controle remoto do ventilador com Arduino.
A seguir, apresentaremos o ventilador e seu controle remoto.
Ventilador comandado por Controle Remoto
Diversas empresas de eletrodomésticos estão trazendo inovações diariamente, com o objetivo de diferenciar seus produtos e impactar no bem-estar dos seus usuários.
Entre os diversos equipamentos, apresentamos este ventilador, que é apresentado na Figura 1. Ele possui funções de controle manual e, também, pode ser controlado através de um controle remoto infravermelho, conforme apresentado na figura a seguir.
O ventilador apresentado e utilizado neste projeto, possui 5 características de controle:
- Botão para desligar;
- Velocidade 1;
- Velocidade 2;
- Velocidade 3;
- Temporizador de Desligamento.
Cada função de controle apresentada acima está presente no controle no ventilador e no controle remoto. Portanto, para cada tecla, haverá um código de controle que será responsável por comandar o ventilador.
Portanto, para que você possa criar o seu controle, é necessário realizar a leitura do código de cada tecla enviada pelo controle infravermelho (IR) do ventilador.
Para isto, necessitaremos conhecer o padrão de código do controle remoto e, caso seja necessário, determinaremos seu código RAW.
Agora, apresentaremos a lista completa de materiais, para que você desenvolva seu projeto.
Lista de Componentes Eletrônicos
- Arduino Nano;
- Kit Infravermelho + Controle Remoto IR;
- Botões 6×6 mm;
- Protoboard;
- Resistor 10kR;
- Resistor 330R.
A seguir, apresentaremos o processo para detecção do padrão de código.
Detecção do Padrão de Código do Controle IR
Primeiramente, devemos detectar o padrão de código do nosso controle. Para isto, devemos montar o seguinte circuito, conforme apresentado na Figura a seguir.
Por meio do circuito apresentado, devemos utilizar o seguinte código, a fim de detectar o padrão e o código RAW, caso o padrão seja desconhecido. Este código pode ser encontrado nos exemplos da biblioteca IRremote.h.
<code>#include <IRremote.h>
/*
* Default is Arduino pin D11.
* You can change this to another available Arduino Pin.
* Your IR receiver should be connected to the pin defined here
*/
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
void dump(decode_results *results) {
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
int count = results->rawlen;
if (results->decode_type == UNKNOWN) {
Serial.print("Unknown encoding: ");
}
else if (results->decode_type == NEC) {
Serial.print("Decoded NEC: ");
}
else if (results->decode_type == SONY) {
Serial.print("Decoded SONY: ");
}
else if (results->decode_type == RC5) {
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6) {
Serial.print("Decoded RC6: ");
}
else if (results->decode_type == PANASONIC) {
Serial.print("Decoded PANASONIC - Address: ");
Serial.print(results->address, HEX);
Serial.print(" Value: ");
}
else if (results->decode_type == LG) {
Serial.print("Decoded LG: ");
}
else if (results->decode_type == JVC) {
Serial.print("Decoded JVC: ");
}
else if (results->decode_type == AIWA_RC_T501) {
Serial.print("Decoded AIWA RC T501: ");
}
else if (results->decode_type == WHYNTER) {
Serial.print("Decoded Whynter: ");
}
Serial.print(results->value, HEX);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 1; i < count; i++) {
if (i & 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.write('-');
Serial.print((unsigned long) results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println();
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
dump(&results);
irrecv.resume(); // Receive the next value
}
}</code>
Após a gravação do código no Arduino, aponte o controle e pressione uma tecla por vez, a fim de realizar a leitura do código e o padrão de controle. Os dados serão lidos e apresentados conforme mostrado na Figura 3.
Para a tecla de desligar é apresentado o código 39D41DC6. Em seguida, é apresentado o padrão como desconhecido. Dessa forma, como não temos um padrão conhecido, necessitamos utilizar o código RAW.
Conforme apresentado na linha a seguir, temo um código RAW com tamanho de 24 blocos. Logo, utilizaremos esse código quando desejarmos realizar o desligamento do ventilador.
Porém, é importante realizar várias leituras de um código RAW para cada tecla. Muitas vezes, ocorrem alguns ruídos indesejados na leitura e isso pode prejudicar os comandos de controle do dispositivo.
Dessa forma, realize diversas medidas e verifique a que mais se repete, a fim de ser utilizada em seu projeto. Portanto, repita esse processo para obter o código RAW para tecla.
A seguir, apresentaremos o processo de construção do circuito do controle remoto com Arduino.
Desenvolvimento do Controle Remoto de Ventilador com Arduino
A partir da leitura dos códigos, iniciaremos desenvolvendo nosso próprio controle remoto com Arduino. Desse modo, construiremos o circuito a seguir.

A partir do circuito apresentado na Figura 4, foi desenvolvido o seguinte código apresentado abaixo.
<code>//Declaracao da Biblioteca IR Remote
#include <IRremote.h>
//Definicao de nome para cada pino
#define BotDesl 2
#define BotTemp 4
#define BotV1 5
#define BotV2 6
#define BotV3 7
//Declaracao das variaveis do programa
bool BotDesliga = 0, BotTempo = 0, BotVel1 = 0, BotVel2 = 0, BotVel3 = 0;
unsigned int CMDdesliga[] = {1050,550,1150,550,300,1450,1050,650,1050,600,250,1450,200,1450,1150,450,350,1450,250,1400,250,1500,200};
unsigned int CMDtempo[] = {1050,550,1150,550,300,1450,1050,650,1050,600,250,1450,200,1450,1150,450,350,1450,250,1400,250,1500,200};
unsigned int CMDvel1[] = {1250,400,1300,400,450,1250,1250,400,1250,450,400,1300,400,1250,450,1250,450,1250,400,1250,1300,400,450};
unsigned int CMDvel2[] = {1250,450,1250,400,450,1250,1300,400,1250,450,400,1250,450,1250,400,1300,400,1250,1300,400,400,1300,400};
unsigned int CMDvel3[] = {1250,400,1300,400,400,1300,1250,450,1250,400,450,1250,400,1300,400,1250,400,1300,400,1300,400,1250,1250};
//Criacao do Objeto IRsend
IRsend irsend;
void setup()
{
pinMode(BotDesliga, INPUT);
pinMode(BotTempo, INPUT);
pinMode(BotVel1, INPUT);
pinMode(BotVel2, INPUT);
pinMode(BotVel3, INPUT);
}
void loop()
{
BotDesliga = digitalRead(BotDesl);
BotTempo = digitalRead(BotTemp);
BotVel1 = digitalRead(BotV1);
BotVel2 = digitalRead(BotV2);
BotVel3 = digitalRead(BotV3);
if(BotDesliga == 1)
{
irsend.sendRaw(CMDdesliga, 24, 38);//Desliga o Ventilador
}
if(BotTempo == 1)
{
irsend.sendRaw(CMDtempo, 24, 38);//Controla o tempo de desligar o ventilador
}
if(BotVel1 == 1)
{
irsend.sendRaw(CMDvel1, 24, 38);//Liga o Ventilador na Velocidade 1
}
if(BotVel2 == 1)
{
irsend.sendRaw(CMDvel2, 24, 38);//Liga o Ventilador na Velocidade 2
}
if(BotVel3 == 1)
{
irsend.sendRaw(CMDvel3, 24, 38);//Liga o Ventilador na Velocidade 3
}
delay(1000);
}</code>
Agora, a partir do código apresentado, desenvolveremos a discussão completa da lógica desenvolvida.
Dicussão da Lógica Desenvolvida para o Controle com Arduino
Primeiramente, realizamos todas as inclusões de bibliotecas, definições de nomes para cada pino e declaração de novas variáveis, conforme apresentado abaixo.
<code>//Declaracao da Biblioteca IR Remote #include <IRremote.h> //Definicao de nome para cada pino #define BotDesl 2 #define BotTemp 4 #define BotV1 5 #define BotV2 6 #define BotV3 7 //Declaracao das variaveis do programa bool BotDesliga = 0, BotTempo = 0, BotVel1 = 0, BotVel2 = 0, BotVel3 = 0;</code>
Em seguida, criamos 5 vetores. Cada vetor será utilizado para armazenar a sequência de código RAW de cada tecla do controle. Na porção de código abaixo, apresentamos todos os vetores criados.
<code>unsigned int CMDdesliga[] = {1050,550,1150,550,300,1450,1050,650,1050,600,250,1450,200,1450,1150,450,350,1450,250,1400,250,1500,200};
unsigned int CMDtempo[] = {1050,550,1150,550,300,1450,1050,650,1050,600,250,1450,200,1450,1150,450,350,1450,250,1400,250,1500,200};
unsigned int CMDvel1[] = {1250,400,1300,400,450,1250,1250,400,1250,450,400,1300,400,1250,450,1250,450,1250,400,1250,1300,400,450};
unsigned int CMDvel2[] = {1250,450,1250,400,450,1250,1300,400,1250,450,400,1250,450,1250,400,1300,400,1250,1300,400,400,1300,400};
unsigned int CMDvel3[] = {1250,400,1300,400,400,1300,1250,450,1250,400,450,1250,400,1300,400,1250,400,1300,400,1300,400,1250,1250};</code>
Posteriormente, foi criado o objeto IR Send. Ele é será responsável por enviar os comandos IR. Em seguida, todos os pinos dos botões foram configurados como entrada, conforme apresentado na porção de código abaixo.
<code>//Criacao do Objeto IRsend
IRsend irsend;
void setup()
{
pinMode(BotDesliga, INPUT);
pinMode(BotTempo, INPUT);
pinMode(BotVel1, INPUT);
pinMode(BotVel2, INPUT);
pinMode(BotVel3, INPUT);
}</code>
Finalmente, temos a estrutura do código principal na função loop. O código será responsável por realizar a leitura dos botões e enviar os sinais de controle para o Ventilador.
<code>void loop()
{
BotDesliga = digitalRead(BotDesl);
BotTempo = digitalRead(BotTemp);
BotVel1 = digitalRead(BotV1);
BotVel2 = digitalRead(BotV2);
BotVel3 = digitalRead(BotV3);
if(BotDesliga == 1)
{
irsend.sendRaw(CMDdesliga, 24, 38);//Desliga o Ventilador
}
if(BotTempo == 1)
{
irsend.sendRaw(CMDtempo, 24, 38);//Controla o tempo de desligar o ventilador
}
if(BotVel1 == 1)
{
irsend.sendRaw(CMDvel1, 24, 38);//Liga o Ventilador na Velocidade 1
}
if(BotVel2 == 1)
{
irsend.sendRaw(CMDvel2, 24, 38);//Liga o Ventilador na Velocidade 2
}
if(BotVel3 == 1)
{
irsend.sendRaw(CMDvel3, 24, 38);//Liga o Ventilador na Velocidade 3
}
delay(1000);
}</code>
Primeiramente, são realizadas as leituras de cada botão. Caso um botão esteja pressionado, será enviado um comando com o seu respectivo código RAW.
Para exemplificar, utilizaremos o botão de Velocidade 1. Caso ele esteja pressionado, será executado o comando a seguir.
<code>if(BotVel1 == 1)
{
irsend.sendRaw(CMDvel1, 24, 38);//Liga o Ventilador na Velocidade 1
}</code>
O comando utilizado (irsend.sendRaw) para enviar o código RAW possui 3 parâmetros:
- O primeiro CDMvel1 é referente ao vetor que armazena o código RAW da velocidade 1;
- O segundo comando (24), representa a quantidade de bloco de dados que será enviado. Este valor é obtido na leitura do código RAW na Figura 3.
- Finalmente, temos a frequência de envio, que é de 38 kHz. Em grande parte dos controles remotos IR é utilizado o valor de 38 kHz como padrão.
Após o envio desse comando, o ventilador será ligado na velocidade 1. Esse processo é repetido para qualquer botão pressionado. Porém, será enviado um código RAW de acordo com a tecla acionada.
Por fim, o sistema aguarda 1 segundo e retorna ao início do loop, a fim de ler, novamente, o estado dos botões.
Conclusão
Finalmente, por meio do sistema desenvolvido, foi possível copiar todos os códigos do controle e comandar o ventilador com o Arduino.
O sistema apresentou-se útil e, além disso, em aplicações futuras podemos integrá-lo com um aplicativo no celular. Dessa forma, você poderá controlar o ventilador pelo seu próprio celular.
Além disso, com o objetivo de utilizar os pinos do Arduino, você pode implementar um sistema de controle de iluminação do quarto e incluir novas funcionalidades ao seu projeto.
Portanto, realize a leitura de outros artigos em nosso Blog AutoCore Robótica e desenvolva novas ideias a partir do artigo apresentado.
