Ligue e desligue uma lâmpada por controle remoto utilizando um Arduino e um micro servo Deixe um comentário

Neste post você vai aprender a acender uma lâmpada por controle remoto usando um Arduino e um micro servo. Dessa forma, não há a necessidade de utilizar  um relé e de manipular a rede elétrica.

Imagine que certo dia você resolveu que queria controlar a lâmpada do seu quarto. Naturalmente, seu primeiro passo foi buscar um projeto no blog da MakerHero e rapidamente você encontrou o projeto com relé e Arduino. Fez então toda a programação e pesquisou exatamente como fazer todas as ligações entre o relé e a rede elétrica. Com tudo pronto e ansioso para colocar a mão na massa e exibir sua façanha para a família, entra o seu pai e diz:

“Negativo! Você vai colocar fogo na casa, nem pensar em mexer na rede elétrica. Isso que dá ficar o dia inteiro na internet, fica vendo essas invenções e depois quer fazer o mesmo. Seu irresponsável, vai estudar pra ser Doutor…”

Nesse momento sua ideia perfeita vai por água a baixo, mas você não vai desistir! O que resta? Navegar novamente no Blog e encontrar uma outra alternativa. Eis que surge, uma nova forma de fazer a mesma coisa e você se pergunta: “Como não pensei nisso antes?”

Funcionamento

O princípio de funcionamento do projeto é acoplar mecanicamente um micro servo ao interruptor existente no local, evitando com isso acessar a rede elétrica  O micro servo estará preso e posicionado para empurrar o interruptor de um lado para o outro.

O acionamento eletrônico do micro servo será gerado por um botão de pulso externo e por infravermelho, conforme a programação do Arduino. Dois botões do controle remoto irão ligar e desligar a lâmpada de imediato, enquanto que um terceiro vai ligar ou desligar a mesma 30 segundos após o acionamento.

Uma observação importante é que usei um diodo em contra fase para proteção (contra surtos de corrente proveniente do motor do micro servo) da porta do Arduino. Um push-button foi utilizado no projeto para o fazer o acionamento manual da lâmpada.

Comparando os sistemas

Com o micro servo: Sem choques elétricos, baixo consumo em modo de repouso ou com o acionamento. O acoplamento do servo ao interruptor será feito por um dos parafuso do espelho. Esta fixação, dependendo o tipo do interruptor, pode gerar algum trabalho.

Com o módulo relé: Risco de choque elétrico, consumo elevado de energia e sobreaquecimento do relé durante a passagem de corrente na sua bobina (lâmpada acesa). Em contra partida a ligação dos fios do interruptor ao relé é bem simples, sem a necessidade de atentar para uma inversão dos fios.

Materiais necessários

Montagem do circuito

Imagem 1 - Circuito no Fritzing para acender uma lâmpada por controle remoto usando um Arduino e um micro servo
Imagem 1 – Circuito no Fritzing
Imagem 2 - Visão geral do circuito físico para acender uma lâmpada por controle remoto usando um Arduino e um micro servo
Imagem 2 – Visão geral do circuito físico
Imagem 3 - Fixação da cantoneira plástica para apoio do servo
Imagem 3 – Fixação da cantoneira plástica para apoio do servo
Imagem 4 - Servo fixado na cantoneira
Imagem 4 – Servo fixado na cantoneira
Imagem 5 - Alavanca do servo acoplada ao interruptor por aproximação
Imagem 5 – Alavanca do servo acoplada ao interruptor por aproximação

Código

Nesse código vamos utilizar a biblioteca IRremote. Você pode baixar a mesma clicando aqui:

#include <Servo.h>  //Inclui a biblioteca do micro servo 
#include <IRremote.h>  //Inclui a biblioteca do receptor de infra vermelho 
#define SERVO 3  // Porta Digital 3 para o micro servo 
void dunilay(unsigned long int tempo);  //Função de tempo com comando millis 
int ligar = 0;  //inicia a variável de início do botão em zero
int Led = 4;  //Porta para o led de status
int Botao = 8;  //Porta para o botão de pulso externo
int RECV_PIN = 11;  //Porta para o receptor infra vermelho
int posicao;  // Inicia a variável de posição do Servo
int EstadoBotao1;  //Inicia a variável de estado do botão
float armazenavalor = 0;  //Inicia a variável que armazena o valor da tecla do controle
IRrecv irrecv(RECV_PIN);  //Observação: Não sei explicar esses comandos para o controle IR,
decode_results results;  //foram copiados do site da MakerHero 
Servo s;  // Variável Servo

void setup ()
{
//Serial.begin(9600);  //Inicia a comunicação serial, somente para descobrir cada código dos botões(Pode ser usado qualquer controle)
s.attach(SERVO);  //Chama a função Servo
pinMode( Botao, INPUT );  //Seleciona a porta como entrada
pinMode( Led, OUTPUT );  //Seleciona a porta como saída
s.write(110);  // Inicia motor posição 110° (Essa variável deve ser ajustada conforme a tecla usada)
dunilay(500);  //Tempo para estabilizar o Servo
irrecv.enableIRIn();  //Inicializa o receptor Infra Vermelho
dunilay(50);
digitalWrite(Led, HIGH);  //Mantém o Led apagado
}

void loop() 
{
EstadoBotao1 = digitalRead( Botao );  //Armazena o estado do botão
if (irrecv.decode(&results))
{
//Serial.print("Valor lido:");
//Serial.println(results.value, HEX); " //Após anotar o valor em hexadecimal do botão do controle, deve ser comentada a linha
armazenavalor = (results.value);
irrecv.resume(); //Lê o próximo valor } 
//////////////////////////////////////////////////////// 
//==== ACIONAMENTO COM O CONTROLE INFRA VERMELHO ==== // 
////////////////////////////////////////////////////////
if (armazenavalor == 0xF7C03F)  //Tecla para ligar 
{
digitalWrite(Led, HIGH); /////////////////////////////
dunilay(50);             /// Pisca o led de status ///
digitalWrite(Led, LOW);  ///////////////////////////// 
s.write(50); //Posiciona o servo em 50°(50 graus)
dunilay(500); //Estabiliza o servo 
ligar = 1; //troca o estado da variável
armazenavalor = 0; //Zera a variável
digitalWrite(Led, HIGH); //Mantém o Led apagado 
EstadoBotao1 = HIGH; //Seta a porta do botão como alta 
dunilay(50);
}
if (armazenavalor == 0xF740BF) //Tecla para desligar
{
digitalWrite(Led, HIGH); /////////////////////////////
dunilay(50);             /// Pisca o led de status ///
digitalWrite(Led, LOW);  /////////////////////////////
s.write(110); //Posiciona o servo em 110°(110 graus) 
dunilay(500); //Estabiliza o servo 
ligar = 0; //troca o estado da variável
armazenavalor = 0; //Zera a variável
digitalWrite(Led, HIGH); //Mantém o Led apagado
EstadoBotao1 = HIGH; //Mantém o botão em estado alto
dunilay(50);
}
if (armazenavalor == 0xF700FF and ligar == 1) //Tecla para temporizador, 30 segundos desliga
{
for(int f = 0; f <= 1000; f++)
{
digitalWrite(Led, bitRead (millis(), 8 ) ); // Pisca o led de status enquanto temporiza
dunilay(30);
digitalWrite(Led, HIGH);
}
s.write(110); //Posiciona o servo em 110°(110 graus)
dunilay(500); //Estabiliza o servo
ligar = 0; //troca o estado da variável
armazenavalor = 0; //Zera a variável
digitalWrite(Led, HIGH); //Mantém o Led apagado
EstadoBotao1 = HIGH; //Mantém o botão em estado alto
}
if (armazenavalor == 0xF700FF and ligar == 0) //Tecla para temporizador, 30 segundos liga
{
for(int f = 0; f <= 1000; f++)
{
digitalWrite(Led, bitRead (millis(), 8 ) ); // Pisca o led de status enquanto temporiza 
dunilay(30);
digitalWrite(Led, HIGH);
} 
s.write(50); //Posiciona o servo em 50°(50 graus)
dunilay(500); //Estabiliza o servo
ligar = 1; //troca o estado da variável
armazenavalor = 0; //Zera a variável
digitalWrite(Led, HIGH); //Mantém o Led apagado
EstadoBotao1 = HIGH; //Mantém o botão em estado alto
}
///////////////////////////////////////////////////////////////////////////////////
// ==== LÊ O BOTÃO EXTERNO E ACIONA O SERVO LIGANDO OU DESLIGANDO A LÂMPADA ==== // ///////////////////////////////////////////////////////////////////////////////////
if ( EstadoBotao1 == LOW and ligar == 0 ) //Caso botão externo pressionado, aciona o servo e liga a luz 
{
digitalWrite(Led, HIGH); /////////////////////////////
dunilay(50); /// Pisca o led de status ///
digitalWrite(Led, LOW); /////////////////////////////
s.write(50); //Posiciona o servo em 50°(50 graus)
dunilay(500); //Estabiliza o servo 
ligar = 1; //troca o estado da variável 
digitalWrite(Led, HIGH); //Mantém o Led apagado
EstadoBotao1 = HIGH; //Mantém o botão em estado alto
}
if ( EstadoBotao1 == LOW and ligar == 1 ) //Caso botão externo pressionado, aciona o servo e apaga a luz
{
digitalWrite(Led, HIGH);
dunilay(50);
digitalWrite(Led, LOW);
s.write(110); //Posiciona o servo em 110°(110 graus) 
dunilay(500); //Estabiliza o servo 
ligar = 0; //troca o estado da variável
digitalWrite(Led, HIGH); //Mantém o Led apagado
EstadoBotao1 = HIGH; //Mantém o botão em estado alto 
}
}
void dunilay(unsigned long int tempo)
{
unsigned long int tempo_Inicial = millis(); // ==== Rotina de tempo, produzida por Tarozzi ==== 
while (millis() < tempo_Inicial + tempo) {}
}

Resultado

Com esse projeto, descobrimos que com um pouco de imaginação e alguma habilidade de montagem, podemos automatizar de forma simples e segura as luzes da nossa casa. Não podemos desmerecer as horas gastas na programação ou na fixação do servo em questão.

Espero ter agregado mais um pouco de conhecimento e que o post tenha ficado divertido para os leitores. A propósito, o servo pode ser fixado com cola quente, eu apenas adaptei uma cantoneira plástica que tinha na minha sucata.

Gostou de aprender a acender uma lâmpada por controle remoto usando um Arduino e um micro servo? Então deixe um comentário aqui embaixo e vamos trocar uma ideia. Um abraço a todos e até a próxima postagem.

Faça seu comentário

Acesse sua conta e participe