Pantalla remota Wifi Oled y terminal Web Serial en el navegador ESP8266 Wemos D1 Mini NodeMCU




Vamos a armar un letrero con texto en movimiento usando una pequeña pantalla OLED usando la red local Wifi una tarjeta basada en esp8266 y el navegador. Para este caso he optado por usar la placa Wemos D1 mini debido a su reducido tamaño. 

Recuerden que el programa es compatible con las diferentes tarjetas de desarrollo basadas en esp8266, aquí les dejo un tutorial de como programarlas con el Arduino IDE: https://youtu.be/L1dfXQkyBp4 

El montaje es muy simple y les dejo las imágenes con el esquemático del circuito dentro de la carpeta del proyecto. La alimentación la tomamos de un power bank usando el conector microusb. 

Aquí les dejo la carpeta del proyecto: http://hinafinea.com/3Pj 

Este código es la aplicación de varias librerías para el manejo de la pantalla, los gráficos para el escalado del texto y cambio de fuente. 

La librería WebSerial nos permite integrar de forma fácil a nuestros ESP una terminal web, que funciona de manera similar a la terminal serial de Arduino, con la diferencia de que podemos acceder a través de la red local inalambrica al dispositivo. Nuestra tarjeta opera como cliente Wifi recuerden cambiar el nombre de su red y la clave en el código. 

Materiales: 
Display OLED 128x64 I2C SSD1306 
Wemos D1 mini o cualquier otra tarjeta esp8266 
Power bank y cable microusb Cables y protoboard

Código:

/*
Ejemplo basico de texto en movimiento para la pantalla OLED 128x64 I2C con el driver SSD1306
Los datos del display se envian a travez del navegador de cualquier dispositivo que se encuentre
conectado a la misma red Wifi. Esp8266 a 80Mhz. 

Este ejemplo es de dominio publico hagan lo que quieran con el :D
Autor: Sergio A. Yañez M.
Año: 2020
Tutorial para el canal AQUILES VAESA 
youtube.com/aqulesvaesa

***** CONEXIONES *****

DISPLAY - ESP8266
    GND = GND
    VCC = 3.3V
    SCL = D1 (GPIO5)
    SDA = D2 (GPIO4)

Importante!!! necesitas instalar estas librerias:

https://github.com/me-no-dev/ESPAsyncWebServer
https://github.com/me-no-dev/ESPAsyncTCP
https://github.com/ayushsharma82/WebSerial
https://github.com/adafruit/Adafruit-GFX-Library
https://github.com/adafruit/Adafruit_SSD1306
*/

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <WebSerial.h>

#include <Adafruit_SSD1306.h>  // incluye la libreria de adafruit para el driver del display OLED
#include <Fonts/FreeSansBold12pt7b.h>
Adafruit_SSD1306 display(128, 32);  // declara la resolucion del display 128x32 pixeles

String d = "";
AsyncWebServer server(80);
const char* ssid = "wifiCASA"; // Your WiFi SSID
const char* password = "AQUILESVaEsA_1234"; // Your WiFi Password


//funcion para mostrar el texto en movimiento

void marquesina(String texto){
  
  int longitud =  texto.length();
  for(int i=0;i<((14*longitud)+128);i++){ 
  display.clearDisplay();  
  display.setCursor(128-i, 22);  
  display.print(texto); 
  display.display(); 
  }

}

//eco del mensaje recibido 
//con esto podemos ver que nuestro mensaje 
//ha llegado correctamente al esp866

void recvMsg(uint8_t *data, size_t len){
  WebSerial.println("Datos recibidos...");
  d = "";
  for(int i=0; i < len; i++){
    d += char(data[i]);
  }
  WebSerial.println(d);
}


void setup(){    
  Serial.begin(115200);
  delay(100); // se da una espera de 100ms para que el display inicie correctamente           
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // inicia la comunicacion I2C con el display que tiene la direccion 0x3C
  display.setRotation(0);  // selecciona la orientacion del display puede ser 0, 1, 2 o 3
  display.setTextColor(WHITE);  // el texto que se va a desplegar es en color blanco 
  display.dim(true); //dejamos el brillo en minimo 
  display.setTextSize(1); // selecciona el tamaño de la letra puede ser u entre 1 y 10
  display.setCursor(0, 0);  // (x,y) pone el cursor en el origen del display


  display.clearDisplay();  //limpia el buffer del display
  display.setTextSize(1); // selecciona el tamaño de la letra puede ser u entre 1 y 10
  display.setCursor(0, 0);  // (x,y) pone el cursor en el origen del display
 

  //esto solo es visible al iniciar el programa:

  // primera pantalla de presentacion 
  display.clearDisplay();  
  display.setTextSize(1); // selecciona el tamaño de la letra puede ser u entre 1 y 10
  display.setCursor(0, 0);  // (x,y) pone el cursor en el origen del display
  display.println("CANAL AQUILES VAESA"); 
  display.println("youtube.com/aquilesvaesa");
  display.println(">  Suscribete  <");
  display.display(); 
  delay(5000); //pausa de 5 segundos o 5000 milisegundos

  //configura el esp8266 en modo estacion y lo conecta a nuestra red
  WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.printf("WiFi no conectado!\n");
        
        return;
    }
    Serial.print("IP: ");
    Serial.print(WiFi.localIP());
    Serial.println("/webserial"); // muesta el acceso a travez del puerto serial fisico
    //inicia el servidor y la funcion de eco
    WebSerial.begin(&server);
    WebSerial.msgCallback(recvMsg);
    server.begin();
  //despliega el acceso en el display  
  display.clearDisplay();  
  display.setTextSize(1); // selecciona el tamaño de la letra puede ser u entre 1 y 10
  display.setCursor(0, 0);  // (x,y) pone el cursor en el origen del display
  display.print(WiFi.localIP()); //despliega la ip del esp8266
  display.print("/webserial"); 
  display.display(); 
  delay(5000); //pausa de 5 segundos o 5000 milisegundos
  display.setTextWrap(false); // desactiva el desborde de texto
  display.setFont(&FreeSansBold12pt7b);
  display.setTextSize(1);  // cambia tamaño de letra a 2 
} 

void loop(){
  if(d!=""){ //si el String tiene algun texto entonces...
  marquesina(d); //...llamamos la funcion de texto en movimiento y ponemos la cadena String recibida
  }
}  // Final de la funcion principal, salta al inicio del "void loop"

Publicar un comentario

4 Comentarios

  1. Hola Sergio, muy buen canal y blog, buscando unas cosas y encontrando otras di con este canal en el cual tienes proyectos muy interesantes que me gustaría implementar. Espero no molestarte ni importunarte al acercarme a ti para ver si me puedes apoyar con una duda, en particular con la librería WebSerial de Ayush Sharma.

    He tratado de implementarla y a pesar de parecer muy sencilla de implementar, me ha dado dolores de cabeza como no tienes idea, y realmente casi no hay información al respecto y por lo que veo, ya la dominas. Básicamente, estoy mezclando esta librería con otra que gestiona los mDNS, para que, en vez de tener que colocar IP/webserial puedas colocar proyecto.host/webserial (por citar un ejemplo). El detalle con el uso de los mDNS radica en que solo puedes utilizarlos en PC e IOS, pero no en android, por lo que he tratado de implementar es que en dicho WebSerial muestre la IP a la cual debemos conectarnos, con resultados insatisfactorios.

    Saludos desde México, excelente trabajo.

    ResponderEliminar
    Respuestas
    1. Hola Luis, si entiendo lo que quieres hacer y hace mucho tiempo tuve ese problema pero en otra aplicación. Sin embargo puedes solucionarlo de una manera fácil en caso de que no necesites tener conexión a Internet en el esp8266, puedes poner a trabajar en modo AP y te conectas a su red wifi, el esp siempre asume por defecto la direccion 192.168.4.1. Ese método lo utilice en un carro a control remoto usando el esp y un teléfono android...

      Eliminar
    2. Que tal Sergio, gracias por tu respuesta, de hecho por eso quería consultar lo de la IP en el WebSerial para ver si habías tenido éxito, ya que el circuito si estará conectado a Internet, por lo menos para una parte del control mediante Telegram, y el WebSerial lo vi como algo ideal para evitar que el usuario descargue una app adicional para conocer la IP dinámica

      Eliminar
    3. Próximamente voy a hacer un video sobre eso, pero te puedo adelantar, que puedes usar IFTTT para conectar tu esp a la nube y tus dispositivos. Así no necesitaras nunca saber la IP.

      Eliminar