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
- 1 x Placa Uno R3 + Cabo USB para Arduino
- 1 x Protoboard 400 Pontos
- 1 x Chave Push-Button Mini Switch SPST
- 1 x Micro Servo 9g SG90 TowerPro
- 1 x Diodo Retificador 1N4007
- 1 x Transistor NPN BC337
- 1 x LED Difuso 5mm Verde
- 1 x Resistor 270Ω 1/4W
- 2 x Resistor 10KΩ
- 1 x Kit Controle Remoto IR
- 1 x Clip Conector de Bateria 9V
- 1 x Bateria Alcalina 9V
- 1 x Kit Jumpers Macho-Macho x65 Unidades
- 1 – Interruptor de luz comum tipo gangorra (tecla já instalada no local)
Montagem do circuito
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.