Arduino – Acender/Apagar mais de um Led [Parte 1]

Atualizado: 06/01/2013

Caso não tenha lido o post anterior sobre Acender/Apagar led com ethernet shield é recomendado antes de continuar lendo este post.
Ufa! Até que enfim né, depois de tantas promessas ta ae o post, desculpa pessoal, mas é falta de tempo mesmo porque o artigo já estava praticamente pronto.
Bom este artigo é uma resposta a dúvida do Rodrigo Pellegrini sobre como acender mais de um led com o Arduino UNO + Ethernet Shield.
A lógica é praticamente a mesma, como aumenta o número de leds a serem acionados é obvio que algo iria alterar no código. O artigo eu fiz utilizando três leds:
1 led vermelho
1 led verde
1 led amarelo

O esquemático:

Uma breve explicação, mas que esta de fácil compreensão, colocar os três leds em uma protoboard deixar os catodos na mesma trilha e o anodo de cada led em trilhas separadas para podermos acionar cada um separadamente, assim podemos ver que o led vermelho esta na porta 7, o led amarelo esta na porta 8 e o led verde esta na porta 9 e o GND (-) dos leds na porta GND, ok?

O código:

Comparado ao anterior foi acrescentando algumas estruturas condicionais para tomar as decisões para acionar os leds corretamente, como vimos no post de Como Acender/Apagar led a lógica para o Arduino é a mesma pois ele se baseia na url, no post anterior usamos ?led=on e ?led=off tinhamos duas estruturas condicionais (if e else) e dependendo do parâmetro passado acendia ou apagava o led ae todo mundo fez, funcionou, timão levou a Libertadores e todo mundo ficou feliz hehe , mas ae surgiu a questão do Rodrigo para lidar com mais de um led e depois de testar essa foi a mais simples e pratica que eu consegui, no lugar de usarmos ?led=on|off, será ?led=000, ?led=100, ?led=010 e ?led=001 e a seguinte lógica foi usada:

“Começa com ?led=000 assim tudo desligado (nível 0, LOW), caso o operador clique no primeiro botão LED1 DESLIGADO a url passar a conter ?led=100 e o primeiro led acende levando para (nível 1, HIGH) a porta 7, e vou explicar detalhado só o primeiro led porque é igual para os demais, com isso o botão LED! passar a conter ?led=000, LED2 passa a ser ?led=010 e o LED3 passar a ser ?led=001, isso na condição de que o LED1 esteja ligado ou ?led=100, ou seja, se o operador clicar no LED1 ele vai ficar ?led=000 e desligado, se o operador clicar em LED2 ele vai ser ?led=010 e passa a ir no outro if e fazer a mesma checagem, assim apenas um led será ligado e desligado, ok? Vamos ao código.”

#include "ETHER_28J60.h"
#include "etherShield.h"

int PinoLed1 = 7;
int PinoLed2 = 8;
int PinoLed3 = 9;

static uint8_t mac[6] = {0x54, 0x55, 0x4f, 0x11, 0x0f, 0x2b};
static uint8_t ip[4] = {192, 168, 2, 111};
static uint16_t port = 80;

ETHER_28J60 server;

void setup(){
  server.setup(mac, ip, port);
  pinMode(PinoLed1, OUTPUT);
  pinMode(PinoLed2, OUTPUT);
  pinMode(PinoLed3, OUTPUT);
}

void loop(){
  char* params;

  if (params = server.serviceRequest()){
    server.print("<html><title>Arduino Web 2.0</title><body>");
    server.print("<h1><a href='?led=000'>Servidor Web Embarcado</a></h1>");

  // LED1 ACENDE
  if (strcmp(params, "?led=100") == 0){
    digitalWrite(PinoLed1, HIGH);
    digitalWrite(PinoLed2, LOW);
    digitalWrite(PinoLed3, LOW);
    server.print("<a href='?led=000'><button style='border: 2px solid #00CD00;' type='button'><b>LED1 LIGADO</b></button></a>");
    server.print("<a href='?led=010'><button style='border: 2px solid #990000;' type='button'>LED2 DESLIGADO</button></a>");
    server.print("<a href='?led=001'><button style='border: 2px solid #990000;' type='button'>LED3 DESLIGADO</button></a>");
  }
  // LED2 ACENDE
  else if(strcmp(params, "?led=010") == 0){
    server.print("<a href='?led=100'><button style='border: 2px solid #990000;' type='button'>LED1 DESLIGADO</button></a>");
    server.print("<a href='?led=000'><button style='border: 2px solid #00CD00;' type='button'><b>LED2 LIGADO</b></button></a>");
    server.print("<a href='?led=001'><button style='border: 2px solid #990000;' type='button'>LED3 DESLIGADO</button></a>");
    digitalWrite(PinoLed1, LOW);
    digitalWrite(PinoLed2, HIGH);
    digitalWrite(PinoLed3, LOW);
  }
  // LED3 ACENDE
  else if(strcmp(params, "?led=001") == 0){
    digitalWrite(PinoLed1, LOW);
    digitalWrite(PinoLed2, LOW);
    digitalWrite(PinoLed3, HIGH);
    server.print("<a href='?led=100'><button style='border: 2px solid #990000;' type='button'>LED1 DESLIGADO</button></a>");
    server.print("<a href='?led=010'><button style='border: 2px solid #990000;' type='button'>LED2 DESLIGADO</button></a>");
    server.print("<a href='?led=000'><button style='border: 2px solid #00CD00;' type='button'><b>LED3 LIGADO</b></button></a>");
  }
  // APAGAR TODOS OS LEDS
  else if(strcmp(params, "?led=000") == 0){
    digitalWrite(PinoLed1, LOW);
    digitalWrite(PinoLed2, LOW);
    digitalWrite(PinoLed3, LOW);
    server.print("<a href='?led=100'><button style='border: 2px solid #990000;' type='button'>LED1 DESLIGADO</button></a>");
    server.print("<a href='?led=010'><button style='border: 2px solid #990000;' type='button'>LED2 DESLIGADO</button></a>");
    server.print("<a href='?led=001'><button style='border: 2px solid #990000;' type='button'>LED3 DESLIGADO</button></a>");
  }
  server.print("</body></html>");
  server.respond();
  }
}

Vale lembrar que dentro de cada server.print(“”) são sintaxes html, então personalize do jeito que você quiser, ou caso não tenha muito conhecimento deixe assim que irá funcionar. Problemas com biblioteca do Ethernet Shield, cliquei aqui!
Fiz os testes no meu Arduino + Ethernet Shield e enviei para um amigo pra ver se iria me reportar algum problema ou duvida, como ele conseguiu achei que estava em ponto de publicar o artigo.

Na prática:


Acessando, agora clique sobre Servidor Web Embarcado.

Clicando no primeiro botão:

Clicando no segundo botão:

Clicando no terceiro botão:


Implementei com três leds porque é o que eu tinha no momento, mas o exemplo se aplica a 4,5,6 ou quantos leds precisar agora desta vez acrescentando mais uma estrutura else if e setando os devidos status dos pinos corretamente, e é claro led é apenas um exemplo podemos substituir os leds por relês e acionar varias coisas em AC por exemplo.
As fotos que tirei o código funcionando, não tirei dentro da caverno do Batman não é que estou sem meu celular oficial e esse quebrou um galho hehe.
Alguém tiver uma duvida ou enfrente algum problema comente que o mais breve possível respondo.

Neste post foi mostrado como acender mais de um led no caso três, de maneira separado, ou seja ligo um de cada vez, para acender um, dois ou os três ao mesmo tempo segue o link da parte 2 do post Arduino Ethernet Shield – Acender/Apagar mais de um Led [Parte 2], clique aqui.

Até a próxima!

Share Button

CC BY-NC-SA 4.0 Arduino – Acender/Apagar mais de um Led [Parte 1] by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.