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

Finalmente está ae o post continuação do Arduino Ethernet Shield – Acender/Apagar mais de um Led [Parte 1] que vimos como acender mais de um led, porém alguns leitores não ficaram satisfeito e com razão, pois na Parte 1 poderíamos acender vários Leds ou dispositivos remotamente porem um de cada vez e não simultaneamente, agora na Parte 2 veremos como acionar um, dois, três ou quantos dispositivos no nosso caso Leds tiverem configurados, a idéia, circuito é a mesma, o que mudou foi a lógica do código no Arduino com Ethernet Shield.

O esquemático:

É o mesmo do anterior como podemos ver.

O código:

É aqui que ocorre toda a mudança. A lógica toda esta na string “?led=100“, na Parte 1 esta lógica podeira ter 4 estados:

STRING DEFINIÇÃO SAIDA
?led=000 Todos os leds apagados (Led1=0, Led2=0, Led3=0)
?led=100 Apenas o led1 ligado (Led1=1, Led2=0, Led3=0)
?led=010 Apenas o led2 ligado (Led1=0, Led2=1, Led3=0)
?led=001 Apenas o led3 ligado (Led1=0, Led2=0, Led3=1)

Isso porque usamos três leds, ou três quaisquer dispositivos acionado pelas portas do Arduino. Ok, beleza e agora pra acionar o primeiro e terceiro led ao mesmo tempo, sem ligar o segundo led? Teremos que fazer mais umas lógicas e aumentar as estruturas condicionais (if, else e/ou else if), vamos aos novos estados que vamos usar e entender cada um deles:

STRING DEFINIÇÃO SAIDA
?led=000 Todos os leds apagados (Led1=0, Led2=0, Led3=0)
?led=100 Apenas o led1 ligado (Led1=1, Led2=0, Led3=0)
?led=010 Apenas o led2 ligado (Led1=0, Led2=1, Led3=0)
?led=001 Apenas o led3 ligado (Led1=0, Led2=0, Led3=1)
?led=110 led1 e led2 ligado (Led1=1, Led2=1, Led3=0)
?led=101 led1 e led3 ligado (Led1=1, Led2=0, Led3=1)
?led=011 led2 e led3 ligado (Led1=0, Led2=1, Led3=1)
?led=111 Todos os leds ligados (Led1=1, Led2=1, Led3=1)

Então agora temos todas as possibilidades, todos leds ligados, todos apagados, apenas cada um ligado e as combinações de led1, led2 e led3 alternando.

#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, 0, 222};
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("Arduino Web 2.0");
    server.print("</pre>
      <h1><a href="?led=000">Servidor Web Embarcado</a></h1>
      <pre>
    ");

  // LED1 ACENDE
  if (strcmp(params, "?led=100") == 0){
    server.print("<a href="?led=000"><b>LED1 LIGADO</b> |</a>");
    server.print("<a href="?led=110"> LED2 DESLIGADO |</a>");
    server.print("<a href="?led=101"> LED3 DESLIGADO</a>");
    digitalWrite(PinoLed1, HIGH);
    digitalWrite(PinoLed2, LOW);
    digitalWrite(PinoLed3, LOW);
  }
  // LED2 ACENDE
  else if(strcmp(params, "?led=010") == 0){
    server.print("<a href="?led=110">LED1 DESLIGADO |</a>");
    server.print("<a href="?led=000"> <b>LED2 LIGADO</b> |</a>");
    server.print("<a href="?led=011"> LED3 DESLIGADO</a>");
    digitalWrite(PinoLed1, LOW);
    digitalWrite(PinoLed2, HIGH);
    digitalWrite(PinoLed3, LOW);
  }
  // LED3 ACENDE
  else if(strcmp(params, "?led=001") == 0){
    server.print("<a href="?led=101">LED1 DESLIGADO |</a>");
    server.print("<a href="?led=011"> LED2 DESLIGADO |</a>");
    server.print("<a href="?led=000"> <b>LED3 LIGADO</b></a>");
    digitalWrite(PinoLed1, LOW);
    digitalWrite(PinoLed2, LOW);
    digitalWrite(PinoLed3, HIGH);
  }

  /* ################################ */

  // LED1 e LED2 ACENDE
  else if(strcmp(params, "?led=110") == 0){
    server.print("<a href="?led=010"><b>LED1 LIGADO</b> |</a>");
    server.print("<a href="?led=100"> <b>LED2 LIGADO</b> |</a>");
    server.print("<a href="?led=111"> LED3 DESLIGADO</a>");
    digitalWrite(PinoLed1, HIGH);
    digitalWrite(PinoLed2, HIGH);
    digitalWrite(PinoLed3, LOW);
  }
  // LED2 e LED3 ACENDE
  else if(strcmp(params, "?led=011") == 0){
    server.print("<a href="?led=111">LED1 DESLIGADO |</a>");
    server.print("<a href="?led=001"> <b>LED2 LIGADO</b> |</a>");
    server.print("<a href="?led=010"> <b>LED3 LIGADO</b></a>");
    digitalWrite(PinoLed1, LOW);
    digitalWrite(PinoLed2, HIGH);
    digitalWrite(PinoLed3, HIGH);
  }
  // LED1 e LED3 ACENDE
  else if(strcmp(params, "?led=101") == 0){
    server.print("<a href="?led=001"><b>LED1 LIGADO</b> |</a>");
    server.print("<a href="?led=111"> LED2 DESLIGADO |</a>");
    server.print("<a href="?led=100"> <b>LED3 LIGADO</b></a>");
    digitalWrite(PinoLed1, HIGH);
    digitalWrite(PinoLed2, LOW);
    digitalWrite(PinoLed3, HIGH);
  }
  // APAGAR TODOS OS LEDS
  else if(strcmp(params, "?led=000") == 0){
    server.print("<a href="?led=100">LED1 DESLIGADO |</a>");
    server.print("<a href="?led=010"> LED2 DESLIGADO |</a>");
    server.print("<a href="?led=001"> LED3 DESLIGADO</a>");
    digitalWrite(PinoLed1, LOW);
    digitalWrite(PinoLed2, LOW);
    digitalWrite(PinoLed3, LOW);
  }
  // ACENDE TODOS OS LEDS
  else if (strcmp(params, "?led=111") == 0){
    server.print("<a href="?led=011"><b>LED1 LIGADO</b> |</a>");
    server.print("<a href="?led=101"> <b>LED2 LIGADO</b> |</a>");
    server.print("<a href="?led=110"> <b>LED3 LIGADO</b></a>");
    digitalWrite(PinoLed1, HIGH);
    digitalWrite(PinoLed2, HIGH);
    digitalWrite(PinoLed3, HIGH);
  }

  server.print("");
  server.respond();
  }
}

O código acima foi compilado e gravado usando a IDE Arduino 1.0.1 e Arduino 1.0.3 ambas compilaram e gravaram com sucesso.

A biblioteca que usei foi a que esta no link abaixo:
http://www.4shared.com/zip/nkrw9SZE/ENC28J60.html

Agora usando o IP para o Ethernet Shield que está no código no meu caso 192.168.0.222, abra o navegador e digite este IP em seguida pressione enter, e a pagina web que esta no Arduino será carregada, abaixo segue duas imagens do teste do acesso dos botões e ações no Arduino:

NavegadorTesteLed1eLed3

No caso acionei dois leds via web, o led1 e o led3 e abaixo o print da ação do Arduino:

S

Fiz um vídeo também mostrando as ações aleatórios de ligar e desligar um ou mais de um led via web e o Arduino correspondendo.

Bom este foi um post que tive a obrigação de resolver, recebi vários comentários e até e-mails com duvidas sobre como fazer e esta ae, código e imagens, no fim é simples não? E este é o ultimo usando o Arduino UNO com Ethernet Shield sendo web server, pois ficamos limitados a enviar recursos devida a limitação.
Um post que verá em breve será usando o Arduino com o Ethernet Shield mas desta vez o web server será em um computador, sendo assim temos um leque maior que possibilidades e recursos como o uso de PHP, Python, Banco de Dados, CSS e scripts.

Para ir preparando o território recomendo a visualização dos dois posts sobre instalação de um Servidor web que postei recentemente, segue os links abaixo:

Instalando e configurando um servidor web para o Arduino – Parte1
Instalando e configurando um servidor web para o Arduino – Parte2

Espero que tenham gostado do post e que tire as duvidas de quem estava precisando.
Até a próxima!

Share Button

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