Imagine que você deseja acender uma lâmpada por meio do controle remoto. Além do circuito para detectar o controle, você vai precisar de usar um relé. Porém, podem aparecer muitas dúvidas na hora de criar o circuito e calcular os parâmetros necessários para essa aplicação. Portanto, vamos ver como fazer para acionar um relé com o Arduino.
Para um melhor entendimento, sugiro que leia o post sobre o que é e como funciona o relé. Além do post sobre transistor.
Circuito
Detalhes importantes
Vamos fazer um projeto para acionar uma lâmpada com um simples toque em um botão. Devemos ficar atentos a alguns detalhes:
O relé, normalmente, puxa muita corrente (cerca de 70mA) e as portas digitais do Arduino não são capazes de fornecer essa corrente. Porém, o pino 5v do Arduino é capaz de fornecer até 200mA. Portanto, é necessário utilizar um transistor sendo alimentado pelo 5v. Desse modo, a porta digital vira apenas um botão: ela atua na base do transistor e manda ele acionar ou não. E assim, o transistor deixa a corrente passar ou não para o relé.
Outra informação importante é que a bobina do relé produz uma tensão inversa quando é desligada. Isso, porque o indutor cria um campo magnético contrário para tentar equilibrar a falta do campo magnético que existia anteriormente, porém é um campo que aparece rapidamente. Dessa forma, somos obrigados a usar um diodo em paralelo com o relé para poder evitar que algum componente seja danificado. Esse diodo servirá para “absorver” essa corrente.
Montagem
De acordo com a imagem acima, temos: um botão conectado no pino digital 3 de um lado e no GND do outro. Portanto é um botão que enviará um sinal de nível baixo quando for pressionado.
Além disso, vamos precisar de um transistor NPN (pode ser o BC547), um diodo, um resistor (VEJA COMO CALCULAR ABAIXO) e, claro, de um relé 5V. Em uma ponta da bobina do relé, ele recebe o 5v do Arduino e na outra ele liga no coletor do transistor.
O pino digital 2 liga em um ponta do resistor e a outra ponta dele liga na base do transistor (servindo como botão). Por fim, o emissor do transistor fica ligado ao GND. E, como ditor anteriormente, o diodo fica em paralelo com o relé, sendo que o anodo fica ligado no mesmo lado que o 5v.
Em relação as chaves do relé, basta ligar a lâmpada na chave normalmente aberta do relé. Para ter certeza de qual é o pino certo, é só fazer um teste de continuidade com o multímetro ou testar na prática. Ou então, recorrer aos pinos comuns dos relés:
Como calcular valor do resistor
Para saber o valor do resistor, precisamos de seguir algumas etapas:
1- Ache o valor da resistência da bobina do relé com um multímetro
No meu caso foi de 80Ω
2- Calcule a corrente de funcionamento do relé segundo a lei de Ohm. Relé 5v e resistência de 80Ω:
3- Descobrir o beta do transistor
Basta olhar o datasheet ou procurar em algum site na internet. Vou utilizar o transistor BC547 e o beta mínimo dele é 110.
4- Agora é só usar a fórmulas do transistor para calcular a resistência de base.
Sendo que Vpino é a tensão que sai do pino do Arduino (5v); Vt é a queda de tensão da base do transistor para o emissor; Bmin é o beta mínimo e Irele é a corrente de funcionamento do relé calcula acima. Resolvendo para os meus valores:
Pronto, agora é só usar um resistor com um valor que seja o mais próximo abaixo do valor calculado. De acordo com o circuito, eu optei por usar um que está um pouco mais abaixo (4,7K).
Programação
A programação é a parte mais simples de todas, pois basta mandar um sinal de nível alto (5v) no resistor para ligar o relé ou de nível baixo para desliga-lo. Como dito anteriormente, o projeto consta em acionar uma lâmpada ao apertar um botão.
Explicação
Primeiro definimos as entradas e saídas. Observe que vou configurar um Pull-up para o botão.
1 2 3 4 5 6 7 | #define rele 2 #define botao 3 void setup(){ pinMode(rele, OUTPUT); pinMode(botao, INPUT_PULLUP); } |
Precisamos criar uma variável de controle. Essa variável serve só para saber se o relé deve ser acionado ou não.
1 | bool liga = false; |
Agora basta testar se o botão foi pressionado e comutar o estado do relé.
1 2 3 4 5 6 7 8 9 10 11 12 13 | void loop(){ if(digitalRead(botao) == LOW){ // Se o botao foi pressionado if(liga == false){ // Se a variavel de controle estiver falsa digitalWrite(rele, HIGH); // Liga o rele e comuta a variavel de controle liga = true; delay(500); // Adiciona um delay para dar um tempo do botão ser despressionado }else{ // Se a variavel de controle for verdadeira digitalWrite(rele, LOW); // Desliga o rele e comuta a variavel de controle liga = false; delay(500); // Adiciona um delay para dar um tempo do botão ser despressionado } } } |
Pronto. Agora, quando apertamos o botão, o relé aciona, e, quando apertamos novamente, o relé desliga.
Código completo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #define rele 2 #define botao 3 bool liga = false; void setup(){ pinMode(rele, OUTPUT); pinMode(botao, INPUT_PULLUP); } void loop(){ if(digitalRead(botao) == LOW){ // Se o botao foi pressionado if(liga == false){ // Se a variavel de controle estiver falsa digitalWrite(rele, HIGH); // Liga o rele e comuta a variavel de controle liga = true; delay(500); // Adiciona um delay para dar um tempo do botão ser despressionado }else{ // Se a variavel de controle for verdadeira digitalWrite(rele, LOW); // Desliga o rele e comuta a variavel de controle liga = false; delay(500); // Adiciona um delay para dar um tempo do botão ser despressionado } } } |
Com base neste tutorial, você é capaz de acionar qualquer carga que utilize corrente alternada. Seja um ventilador, uma lâmpada, uma televisão etc.
Relé – O que é e como funciona
Boa tarde!
Sou completamente leigo na programação, mas muito curioso…então comprei um arduino para dar os primeiros passos!
Sei que o delay trava o programa no tempo dele, então como implantar um tempo de retardo maior ao acionar o botão até o tempo da lâmpada ligar!
Ex: ao acionar o botão a lâmpada ligaria 10seg depois.
Vi um post seu sobre millis, mas como sou leigo ainda não peguei a lógica da programação!
Boa tarde, Gilmar!
Uma boa forma de fazer isso é utilizando o millis igual você comentou que leu aqui no site. De fato aquele código é um pouco complicadinho a princípio, mas com o tempo você vai entender ele sem problemas.
Agora, uma alternativa a nível “gambiarra” seria criar uma variável e ir acrescentando após apertar o botão. Dessa forma, você acionaria a lâmpada depois que variável atingisse um certo valor (teria que descobrir na prática).
Pra facilitar sua vida, segue adiante o esqueleto de um código para fazer o que você quer, mas utilizando o millis() de forma mais simples:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#define RELE 3
unsigned long timer;
uint8_t botao_ativo = 0;
void setup()
{
pinMode(BOTAO, INPUT_PULLUP);
pinMode(RELE, OUTPUT);
}
void loop()
{
if(!digitalRead(BOTAO))
{
botao_ativo = 1;
timer = millis();
delay(100); // Debounce
}
// Quando apertar o botão,fica verificando
// se está na hora de ligar a lampada
if(botao_ativo)
{
if((millis() - timer) > 10000)
{
botao_ativo = 0; // Volta a variável para 0
digitalWrite(RELE, HIGH);
}
}
}