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