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