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:
Postar um comentário