La Wemos D1 es una placa de desarrollo similar a las de Arduino con la ventaja que en vez de usar un microcontrolador ATmega usa el módulo WiFi ESP8266 como microcontrolador y como módulo de conexión inalámbrica.
Y es que este módulo WiFi cuenta con un microcontrolador de 32bits a 80/160Mhz y 4MB de memoria flash, características técnicas muy superiores a la mayoría de Arduinos, y si a eso le sumas su bajo precio al final terminaron saliendo placas de desarrollo que no solo permiten conectarse a internet si no también que les carguemos nuestro código y nos ahorremos el Arduino.
En este caso la Wemos D1 cuenta con las siguientes conexiones:
Pin | Función | ESP8266 Pin |
TX | TXD | TXD |
RX | RXD | RXD |
A0 | Analog input, max 3.3V input | A0 |
D0 | IO | GPIO16 |
D1 | IO, SCL | GPIO5 |
D2 | IO, SDA | GPIO4 |
D3 | IO, 10k Pull-up | GPIO0 |
D4 | IO, 10k Pull-up, BUILTIN_LED | GPIO2 |
D5 | IO, SCK | GPIO14 |
D6 | IO, MISO | GPIO12 |
D7 | IO, MOSI | GPIO13 |
D8 | IO, 10k Pull-down, SS | GPIO15 |
G | Ground | GND |
5V | 5V | – |
3V3 | 3.3V | 3.3V |
RST | Reset | RST |
Para la mayoría de las cosas tendremos mas que suficiente, aunque eso si hay que recordar que todos los pines de entrada y salida funcionan con una tensión de 3.3V y no los 5V que se usan en la mayoría de placas de Arduino.
La placa se programa desde el propio IDE de Arduino, pero antes de ello hay que cargar el nuevo tipo de placa al IDE como se explica aquí. Después de eso podremos programarla como con un Arduino, por ejemplo el siguiente código ejecuta un blick:
1 2 3 4 5 6 7 8 9 10 |
void setup() { pinMode(BUILTIN_LED, OUTPUT); } void loop() { digitalWrite(BUILTIN_LED, !digitalRead(BUILTIN_LED)); delay(1000); } |
Y este otro, que es para lo que he creado esta entrada, permite visualizar en una pantalla LCD I2C la fecha y hora sacada previamente de Internet, en mi caso no un servidor NTP si no un fichero PHP que devuelve esa información de forma limpia y lista para leer desde Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
#include <ESP8266WiFi.h> #include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> // Addr, En, Rw, Rs, d4, d5, d6, d7, backlighpin, polarity LiquidCrystal_I2C lcd( 0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE ); #define SSID "wificasa" #define PASSWORD "Zup7nQDBCuv8" #define SERVERNAME "giltesa.com" #define STARTDATA "::" WiFiClientSecure client; int num; void setup() { pinMode(BUILTIN_LED, OUTPUT); lcd.begin(16,2); lcd.backlight(); delay(1000); WiFi.begin(SSID, PASSWORD); lcd.setCursor(0,0); lcd.print("Connecting"); lcd.setCursor(0,1); while( WiFi.status() != WL_CONNECTED ) { delay(500); lcd.print("."); } lcd.clear(); lcd.setCursor(0,0); lcd.printf("WiFi: %s", SSID); lcd.setCursor(0,1); lcd.print("IP: "); lcd.print(WiFi.localIP()); delay(3000); lcd.clear(); } void loop() { digitalWrite(BUILTIN_LED, !digitalRead(BUILTIN_LED)); doSendGET(); delay(5000); } void doSendGET() { if( !client.connect(SERVERNAME, 443) ) { lcd.clear(); lcd.setCursor(0,0); lcd.print(F("Connection fail")); } else { client.print("GET /ard/ntp.php"); client.printf("?start=%s", STARTDATA); client.println(" HTTP/1.1"); client.printf("Host: %s", SERVERNAME); client.println(); client.println("Connection: close"); client.println(); } while( client.connected() && !client.available() ) delay(5); if( (client.connected() || client.available()) && client.find(STARTDATA) ) { lcd.setCursor(3,0); //Year lcd.print( client.parseInt() ); lcd.print("/"); //Month num = client.parseInt(); lcd.print( num < 10 ? "0" : "" ); lcd.print( num ); lcd.print("/"); //Day num = client.parseInt(); lcd.print( num < 10 ? "0" : "" ); lcd.print( num ); lcd.print(" "); lcd.setCursor(4,1); //Hour num = client.parseInt(); lcd.print( num < 10 ? "0" : "" ); lcd.print( num ); lcd.print(":"); //Minutes num = client.parseInt(); lcd.print( num < 10 ? "0" : "" ); lcd.print( num ); lcd.print(":"); //Seconds num = client.parseInt(); lcd.print( num < 10 ? "0" : "" ); lcd.print( num ); } client.stop(); } |
El código refresca los datos cada 5 segundos, he probado ha disminuir el tiempo a 1 segundo pero lo mas que permite es 2 segundos ya que por tareas o por el tiempo que le cuesta recuperar los datos no es capaz de hacerlo mas rápido.
En realidad seria mas útil que la propia placa contara con un reloj como el DS1307 o DS3231 y que se pusiese en hora al encender la placa.
Buenas tardes, Alberto.
Quiero conectar un Arduino pro micro con una WEMOS D1 mini, por el puerto serie de cada uno. Uno es de 5V y el otro de 3.3V. ¿Puedo conectarlos directamente o necesito un conversor de tensiones?
Muchisimas gracias
Hola Alberto,
No puedes conectarlo directamente, podrías quemar el ESP8266, necesitas un conversor de tensiones como bien dices o un divisor de tensión con unas resistencias.
Saludos.