Vamos controlar um interruptor com o Arduino?
Por Filipe Caetano | MagicKey para o PPLWARE Na sequência dos artigos que temos apresentado para a plataforma Arduino, hoje demonstrar como controlar um interruptor. Este interruptor “partilhado” permitirá que a luz seja controlada através de um normal interruptor ou ainda a partir do computador.
Neste artigo vamos disponibilizar o código fonte, para que seja possível controlar uma saída digital, de acordo com as leituras feitas no interruptor ligado a uma porta digital de entrada e de acordo com os dados recebidos do computador via porta série.
Tal como no anterior artigo acerca do Arduino (ver aqui) partimos de um exemplo para construir o nosso código, no entanto desta vez foi necessário realizar consideráveis alterações.
Visto que iremos ter que ter uma entrada digital, onde vamos ligar o botão do interruptor, o exemplo escolhido foi Digital->Button.
Na comunicação do Arduino com o computador nos dados trocados entre eles definiu-se
- zero significaria a luz desligada
- e um valor diferente de zero que a luz ligada.
O código desenvolvido para o Arduino foi o seguinte:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
int buttonStatemem = 0;
int luzon = 0;
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
//inicialização da porta a velocidade de 9600
Serial.begin(9600);
}
void loop(){
//verifica se existem dados na porta serie para leitura
if (Serial.available())
{
if(Serial.read()==48) //0 em ascii é 48
{
luzon = 0;
}
else
{
luzon=1;
}
}
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// Verifica se o botão se encontra primido e se ainda não foi tratado
if(buttonState==HIGH && buttonStatemem==LOW)
{
if(luzon == 0)
{ luzon = 1;
}
else
{
luzon = 0;
}
buttonStatemem=HIGH;
}
else if(buttonState==LOW)
{
buttonStatemem=LOW;
}
//Liga ou desliga a o Led (luz)
if(luzon == 0)
{
digitalWrite(ledPin, LOW);
}
else
{
digitalWrite(ledPin, HIGH);
}
// Envia o estado da luz
Serial.println(luzon);
delay(500);
}
A imagem seguinte mostra a montagem muito simples feita no Arduino.
Pode ver-se que o botão (B) liga aos 5 volts e ao pino 2 tal como definimos no código. È conveniente adicionar uma resistência de 10Kohm (chamada resistência de Pull-Down) ligada ao pino 2 e ao GND, isto para que quando o botão não está premido estejam 0volts no pino 2, quando esta resistência não é colocada pode acontecer que mesmo que o botão não esteja premido a porta esteja a 1. A saída para controlar uma lâmpada é feita no pino 13, o Arduino tem ligado a este pino o Led assinalado na imagem que vamos usar como saída.
A parte de ligação a lâmpada é feita com recurso a um transístor (T) C547B e um rele 5v/220v. basta então ligar o pino 13 a base do transístor passando antes por uma resistência de 10Kohm. O emissor deste deve ser ligado ao GND e o colector a um dos terminais de controlo do rele. O outro terminal de controlo do rele deve então ser ligado aos 5volts, de forma há que quando o pino 13 esteja no nível alto (5volts) o transístor entre em condução e haja uma correte a circular na bobine do rele e este faça com que haja condução na parte de potencia (220 volts).
Nota: A montagem apresentada destina-se a marca e modelos das componentes utilizadas, caso se opte por outras componentes deve ter-se em atenção antes da montagem os seus datasheet.
Para o computador desenvolveu-se uma simples aplicação em c# que enviava comando para o Arduino Ligar ou Desligar a luz, e recebia ainda informação se a luz estava ligada ou desligada.
Para isso bastou apenas criar uma normal Windows aplication, e incluir o namespace System.IO.Ports para assim podermos utilizar a porta série.
Criou-se então a porta série através do comando, SerialPort porta = new SerialPort();
Foi adicionado um botão ligar, onde foi colocado o seguinte codigo:
porta.BaudRate = 9600; //velocidade que definimos no código do Arduino porta.PortName = “Com4”; // porta serie de comunicação com o Arduino porta.ReadTimeout = 200; // timeout de espera para que a aplicação não fique presa na leitura dos dados da porta serie. porta.Open(); // abertura da porta serie.
Para a leitura e tratamento dos dados vindos do Arduino adicionou-se um timer a aplicação. Este continha o seguinte codigo:
try
{
string recebido = porta.ReadLine();
if (recebido == "0\r")
{
Textbox1.Text = “Luz Desligada”;
}
else
{
Textbox1.Text = “Luz Ligada”;
}
}
catch
{}
Faltava então adicionar dois botões, um para ligar e outro para desligar a luz, no evento do clique do botão de ligar a luz colocou-se o seguinte código:
porta.Write("1");
no de desligar a luz foi o seguinte:
porta.Write("0");
Na secção de download disponibiliza-se esta aplicação para download, mas com algumas melhorias gráficas.
Artigos relacionados
- Conhece a plataforma de desenvolvimento Arduino?
- Programe no Arduíno – Alerta para gelo na estrada
- Comunicação entre PC e Arduino
Download: Projecto da aplicação do PC (source code)
Download: Executável - aplicação para PC
Download: Código do Arduino:interruptor
Homepage: Magick Key
Este artigo tem mais de um ano
Obrigado!
Com esta historia estou a começar a ficar com o bichinho do Arduino.
Para quem quiser um projeto semelhante a este: https://www.youtube.com/watch?v=TATpGpE7ocU
O “click” que se ouve é o relé a fazer contacto.
porreiro, era mesmo disto que precisava
muito bom este artigo, gostava que alguem disponibiliza se como e que se pode controlar por wireless um arduino atraves de iphone/android 🙂
Daniel, o que pede já é possivel com recurso a por exemplo a comunicação XBEE.
Sendo necessário adicionar um XBEE ao Android (pouco cómodo digo eu) e outro ao Arduino.
Existe uma versão do Arduino com bluetooth.
http://loja.lusorobotica.com/118-arduino-bluetooth.html
Agora a nivel de software para o iphone/android … não sei como é …
Agora junta php nisso, e controlas o interruptor via web, 😛 sais da faculdade ligas o interruptor q por sua vez ta ligado a um aquecedor e quando chegares a casa ja tens a casa quentinha
Tiago, é uma possibilidade, ou ainda adicionar um modulo GPRS e pode controlar-se o interruptor por SMS.
Ou a arder =P
Abraço
hum e que nao tenho conhecimento disso mesmo :/ e para iphone tambem ha?
Apenas sei que funciona em Androide, no entanto também poderá ser possivel em iphone, mas desconheço.
Podes sempre fazer umas páginas web no arduino e acede-las através de um browser.
A.F.
Começa a ser moda essa pergunta: https://pplware.sapo.pt/smartphones/android/electrodroid-2-0-electrnica-no-android/comment-page-1/#comment-386944
Belo artigo muitos parabéns vou já experimentar
Tem-se falado muito do Arduino, mas existe também umas placas da Velleman (K8055) com ligação USB e que permite também o controlo de, por exemplo, abrir ou fechar um portão ou ligar e desligar um alarme.
Penso que também seja um bom produto para ser discutido aqui no pplware.
Boas..
Placas da Velleman…Existem toneladas de kits ai pela net fora de toda a forma e feitio…eu ca gosto mais dos europeus, pois sou europeu, no entanto existem alguns que não são opensource e a nivel de licenciamento são perigosos…
alguns sites:
http://www.beagleboard.org…opensoruce
http://www.luminarymicro.com/products/evaluation_kits.html/…não conheço a licença
http://www.stm32circle.com/hom/index.php …ainda não ha licença, o SO que corre é o circleOS, mas que ainda não esta licenciado…o triste é que é europeu e feito com chips europeus da STMicroElectrónics…enfim
cmps
Uma pergunta de quem esta interessado mas percebe pouco de electrónica:
Como e que faço a ligação da resistência ao transístor???
Olá.
Normalmente solda-se o pino da resistência ao pino do transístor.
Também podes usar uma placa de testes, e aí não tens de soldar nada.
Outra solução:
Usar uma breadboard (http://en.wikipedia.org/wiki/Breadboard).
Torna-se mais simples ligar os componentes e reutilizar os mesmos em novos projectos.
E onde posso arranjar o rele referido? É que comprei um kit arduino mas nao trazia esse componente….
Os relés são comprados em lojas de electrónica.
Segue este link e vê algumas lojas online em Portugal:
http://zigtek.blogspot.com/2011/02/lojas-de-electronica-portugal.html
Cumprimentos
vai ao site da leiritrónica..e compras online a um preço relativamente baixo
Vocês são os maiores. Não percebo nada disto mas começo a ficar com um enorme entusiasmo. Vou mesmo comprar um ferro de soldar este fim de semana.
têm calma rapaz! informa-te melhor sobre electrónica, pois dou-te um exemplo, soldar componentes electrónicos com um ferro de soldar de 80W não é aconselhável, derretes tudo 😛
Inscreve-te num fórum de electrónica que o pessoal ai te recomende e expõe la as tuas duvidas 😛
Para começar aconselho-te uma placa de testes, evita as soldas, que são um dos principais problemas ao iniciar na electrónica…
Está à venda no LIDL, desde o início desta semana, uma mini estação de soldar bastante boa. Com um pouco de sorte encontras aindanos LIDLs mais remotos, ou sempre podes fazer o pedido.
A potência de 48W pode parecer pouca… mas não é, é mais que suficiente para este tipo de trabalhos. Nesta caso, um ferro de 60 ou 80W só iria influenciar no tempo que o ferro demora a atingir a temperatura pretendida (o mais potente é, obviamente, mais rápido).
boas..
48W é ja demasiado, no entanto podes contornar isso diminuindo o tempo da soldadura o idela anda entre os 35 e os 45 w…
cmps
É óbvio que estamos a falar de aparelhos com temperatura regulável.
Uma estação de soldar de 80W é óptima! Assim que se liga, atinge a temperatura pretendida em alguns segundos. Já a de 48W demora uns 2 minutos. Compreendes agora onde quis chegar com o que escrevi no último comentário?
Que lampada usas-te? LED ou incandescente (etc…)? Se usaste a ultima, que relé escolheste?
Olá.
Podes usar um LED ou uma lâmpada normal incandescente. O que realmente importa é a tensão de activação do relé, que é 5 Volts. Um relé pode ser dividido em duas partes: a bobine de activação (5V) e a parte de alta tensão (220V).
Quando aplicas 5 Volts na bobine de activação é estabelecido o contacto na parte de alta tensão e, claro a lâmpada acende.
No caso de pretenderes acender um LED, que não faz muito sentido, não podes usar os 220V na parte de alta tensão, mas sim usar uma fonte de 5V com uma resistência 1K em série com o LED.
Ficam aqui dois relés que costumamos usar:
RTB74005
V23092
Cumprimentos
Filipe, espero que continues a criar posts como este.
Parabéns!
Sim que continue! que eu tenho o arduino e uma das coisas que eu gostava de fazer era controlar as luzes de minha casa!
Fico à espera de mais artigos!
Não seria mais correto usar :
boolean luzOn = false;
em vez de:
int luzon = 0;
boolean é um int por isso é igual.
Igual não é, podias dizer equivalente mas mesmo assim estavas errado, int ocupa 2 bytes, gostava de te ver a ligar/desligar um interruptor com 65536 posições diferentes no mundo real. Já variáveis de tipo boolean são para este tipo de coisa on/off ocupando 1 byte(metade da memoria). A ocupar 1 byte temos também variáveis de tipo byte com 256 possibilidades mas continuas a ser preferível usar boolean tendo outra regalias oferecidas pelo tipo. Neste caso especifico nunca experimentei mas em algumas linguagem em vez de escrever if(luzon == 0)pode se escrever if(luzOn) ou if(!luzOn).
Não estou a dizer que esta errado, funciona à mesma, mas é mais indicado usar recursos específicos para a tarefa em mão.
boas..
o int por si só ocupa 4 bytes o char é que ocupa 1 bytes…não sei como esta definido e varia de linguagem para linguagem, mas o booblean como o nome diz tudo só deveria ocupar 1 bite, mas talvez ocupe 1 byte não sei.
No entanto devido aos 32 bites d endereçamento….um char=4byte=1 int…possivelmente 1 boolean=4bytes…no entanto existem opções de compilação que obrigam o compilador a fazer as coisas correctamente…embora depois os acessos as vars demorem mais tempo, mas ocupam menos mem…não se pode ter tudo…
cmps
Boas, zéquinha, continua.. lol. Aquele Abraço
Boas tardes.
Sou de S.Miguel, Açores.
Tenho curiosidade em experimentar o Arduino, mas pelas minhas pesquisas, não vendem cá.
Pode indicar-me onde comprar em Lisboa o Arduino?
Obrigado
Tiago, sugiro que compre nas varias lojas que existem on-line. Eu pessoalmente costumo comprar na espanhola cooking-hacks (www.cooking-hacks.com/) no entanto existem varias empresas de venda on-line no nosso país, deixo dois link’s:
http://www.ptrobotics.com
http://www.lusorobotica.com
Obrigado pela atenção Filipe.
Um abraço a todos, a partir dos Açores.
🙂
Vou deixar aqui uma ideia para um artigo futuro, um projecto para contagem de pessoas, numa porta um sensor para contar quem entra, noutra para contar sem sai. Podendo dar estatísticas tipo, a que horas se encontra mais gente no local, média de pessoas no local, etc.
É perfeitamente exequível aquilo que sugere, basta usar o Arduino, com um foto-transístor e um emissor led.
Na aplicação do PC para registar a entrada deve guardar a hora a que recebeu o pacote do Arduino.
Estou a pensar desenvolver um projecto deste calibre com acesso aos dados via Web para controlar uma porta entradas/ saídas, alguém tem mais Ideias/dicas de material, esquemas, software, etc?
Cumprimentos,
ApacheDraco
Alguém sabe se esta técnica pode ser utilizada para ligar um PC através de um a chama para um determinado numero de telefone?
Por exemplo, utilizar uma das linhas Voip dos routers da meo para ligar um PC a distancia.
Podia dar um artigo interessante aqui no pplware.
PS: Desktop
Penso que sera possivel ligar qualquer coisa com uma chamada telefonica se o Arduino possuir um Shield GPRS.
Ficaria algo como:
[telefone/SMS]->[[sh.GPRS]->[Arduino]]->[Relé]->[PC]
Com VOIP e com os routers da Meo… não faço ideia :-/
Outra sugestão:
Ligar o Arduino via rede.
Arduino Ethernet Shield – http://arduino.cc/en/Main/ArduinoEthernetShield
Obrigado pela dica,
mas tinha pensado numa coisa mais artesanal, do tipo utilizar um telefone antigo.
ligar para um numero que só o próprio sabe, é accionada a campainha do telefone (ligar os fios da campainha no arduino), este era accionado, ou estar ligado ao botão power do pc fazia a passagem de crente ligando assim o PC.
Não sei e se funciona….
Olá famont,
funcionar funciona, mas não aconselho a efectuar ligações directas com o Arduino. É preciso verificar que tensões e correntes é que estão envolvidas nas ligações (poderá ser necessário ligar componentes extra entre as ligações campainha Arduino, Arduino PC). É um bom projecto para quem está iniciar a utilização no Arduino, e quer algo útil. :p
Na realidade, essa ideia é possível sem usar o Arduino. Basta usar um relé (http://pt.wikipedia.org/wiki/Rel%C3%A9). Mas mais uma vez é preciso verificar as tensões e correntes envolvidas, para arranjar um relé adaptado à situação.
Outra ideia (mais arrojada) é ligar o Arduino à linha telefónica. Toda a gestão da chamada e sinais envolvidos seria processado pelo Arduino.
E ligar ou desligar o pc fazendo uso de DTMF (http://pt.wikipedia.org/wiki/DTMF), ou por sms ou qualquer outra ideia. 😀
Uma ideia que acrescento, neste caso para ligar o pc, é fazer uso de Wake-on-Lan.
Bons projetos,
Nimboos
Obrigado pela ajuda, vou investigar melhor.
Bem Filipe, o que tu sabes… Uau. Esta tecnologia do Arduíno é fantástica e tem inúmeras aplicações. Muito bem. Abraço desde há um bocado. Agora vou ver o teste do Huawei.
Excelente artigo!
Deixo uma sugestão de software para criar melhores ilustrações para os próximos artigos:
Fritzing – http://fritzing.org/
Abraço,
Nimboos
os links estao broken
Alguém pode partilhar novamente os ficheiros para download?
Boa tarde José,
pode fazer dowload do ficheiro .rar onde pode encontrar logo na raiz o ficheiro do código para o Arduino, e uma pasta referente ao projecto do Visial Studio.
link:http://www.sal.ipg.pt/user/7142/interruptor.rar
Muito obrigado Filipe
olá Filipe,
estou a desenvolver uma aplicação em WPF e preciso de colocar um botão a ter o mesmo comportamento que tu tens, ou seja quando se carrega sobre o botão ele muda de imagem e quando se volta a carregar ele muda para a inicial. Sabes como posso fazer isto em WPF ?
Desde já obrigado.
Amigo, teria como atualizar os links, estão OFF. Obrigado e Parabéns…
Procurei bastante isso, ou quase isso, eu quero controlar pela internet, nem sempre estou em casa, tenho um nano e não achei nada que dê pra fazer com ele, é tão inútil assim? Mas tenho um UNO R3, um ETHERNET também, entre outros… me ajudem por favor com alguma idéia. Obrigado!
Os links para downloads estão com erro… tem como consertá-los?
Qual outro transistor posso utilizar?
Obrigado desde já
Cumprimentos
sou novo nesta area e ja adequiri um
arduino uno para tentar fazer algums
projetos.entretanto encontrei esta
aplicação para poder ligar uma lampada
pela computador e achei ela muito interesante
ja a realizei e funciona muito bem.
mas preciso saber se e possivel usar mais
k um botao para acender outras lampadas?
e como fazer?obrigado,cumprs para todos.