quarta-feira, setembro 28, 2016

Sinalizador - Parte 4

Vamos agora estudar como colocar um ESP8266 dentro do sinalizador, permitindo controlá-lo sem fios. Como ainda não providenciei um novo sinalizador, vou usar quatro LEDs.


Do ponto de vista de hardware, o nosso problema é apenas ligar quatro LEDs ao ESP8266. Cada pino de GPIO do  ESP é capaz de gerar correntes de até 12mA e absorver correntes de até 20 mA. Algo mais que suficiente para um teste, portanto basta colocar um resistor em série com o LED. Se quisermos usar um LED com uma corrente maior, podemos colocar um transistor (ou usar um driver integrado como o ULN2803).

A coisa é mais interessante do ponto de vista de software. Como queremos comandar via WiFi, é necessário configurar o ESSID e senha da rede. Uma solução elegante é o WiFi Manager. De forma resumida, ao inciar ele tenta se reconectar à última rede utilizada. Se não conseguir, o ESP se comporta como um ponto de acesso (com ESSID e senha que você definiu) mais um mini servidor web; basta você conectar um PC ou o seu celular nele e usar o browser para configurar a rede à qual você quer se conectar.

Conectado à rede WiFi, o meu programa espera uma conexão TCP na porta 23 (telnet). Ao receber a conexão ele espera sequências de letras R, G, Y, B finalizadas por LF. Estas sequências indicam quais LEDs (Vermelho, Verde, Amarelo e Azul, respectivamente) devem ser acesos. Rudimentar, mas permite fazer um teste rápido com um cliente telnet.

O software fica assim, lembrando que você precisa de uma versão atual da IDE do Arduino com a placa ESP8266 e a biblioteca WiFi Manager instaladas:
/*
 * Sinalizador WiFi
 * DQ - 27/09/16
 * 
 */

#include <ESP8266WiFi.h>          //ESP8266 Core WiFi Library

#include <DNSServer.h>            //Local DNS Server used for redirecting all requests to the configuration portal
#include <ESP8266WebServer.h>     //Local WebServer used to serve the configuration portal
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager WiFi Configuration Magic


// Conexão dos LEDs
static const int ledY = D8;
static const int ledR = D7;
static const int ledB = D6;
static const int ledG = D5;

// Servidor TCP na porta 23
WiFiServer server(23);
static bool conectado = false;
static char cmd[10];
static int iCmd = 0;

void setup() {
  // Inicia as saídas ligadas aos leds
  pinMode(ledY, OUTPUT);
  pinMode(ledR, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(ledG, OUTPUT);

  // Executa a conexão à rede WiFi
  // Se não conseguir conectar à rede anterior, cria
  // um ponto de acesso para configuração
  WiFiManager wifiManager;
  wifiManager.autoConnect("ESP8266-DQ", "abcdefgh");

  // Inicia nosso servidor TCP
  server.begin();
}

void loop() {
  // Verifica se tem um cliente conectado
  WiFiClient client = server.available();
  if (client == NULL) {
    return;
  }

  // Trata a conexão
  client.println ("Sinalizador pronto");
  iCmd = 0;
  while (client.connected()) {

    // Recebe próximo byte
    if (client.available() > 0) {
      char c = client.read();

      // ^D encerra
      if (c == 0x04) {
        client.stop();
        continue;
      }

      // Coloca no buffer
      if (iCmd < sizeof(cmd)) {
        cmd[iCmd++] = c;
      }

      // Testa fim de linha
      if (c == '\n') {
        // Recebeu um comando
        digitalWrite (ledY, LOW);
        digitalWrite (ledR, LOW);
        digitalWrite (ledB, LOW);
        digitalWrite (ledG, LOW);
        for (int i = 0; i < iCmd; i++) {
          switch (cmd[i]) {
            case 'y': case 'Y':
              digitalWrite (ledY, HIGH);
              break;
            case 'r': case 'R':
              digitalWrite (ledR, HIGH);
              break;
            case 'b': case 'B':
              digitalWrite (ledB, HIGH);
              break;
            case 'g': case 'G':
              digitalWrite (ledG, HIGH);
              break;
          }
        }
        iCmd = 0;
      }
    }
  }
}

No código acima, atenção que a senha usada em autoConnect precisa ter pelo menos oito caracteres (conforme indicado na documentação).

Nenhum comentário: