Autor: Oscar Gonzalez
Tiempo de lectura: 6 minutos
Reloj LED con display de 7 segmentos basado en ESP8266 Wifi actualizado por NTP y con función Pomodoro
El código se basa principalmente en el ejemplo de la sincronización NTP. Lo que hace es conectarse a un servidor de tiempo y mediante la librería NTPClient, actualizar la hora en el display.´
En la función Setup() se intenta una conexión a la red Wifi configurada mediante las constantes ssid y password y aprovechamos la ocasión para recuperar la hora actual según la noza horaria. Eso evita que tengamos que poner el reloj en hora.
El resto del código es muy sencillo (y probablemente poco optimizado) y consiste en el control del pulsador para iniciar una cuenta atrás Pomodoro. El display ofrece pocas opciones para mostrar información más que los propios números, por lo que si te despistas un poco, puedes perder la noción de si estás en modo hora o modo Pomodoro, aunque si el reloj corre al revés, es obvio. Muy probablemente se puede mejorar o incluso añadir más funciones, pero eso lo dejo a tu criterio!
Código experimental
Ten en cuenta que éste código fuente no pretende ser un sistema Pomodoro completo, solo una guía para hacer funcionar el reloj. ¡Te animo a que intentes extenderlo y mejorarlo!
//
// FILE: demo_displayTime.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.2.0
// PURPOSE: demo
// URL: http://www.adafruit.com/products/1002
// URL: https://github.com/RobTillaart/HT16K33
// sketch will work correctly up to 99:99
#include < NTPClient.h >
#include < ESP8266WiFi.h >
#include < WiFiUdp.h >
#include "HT16K33.h"
#define BUTTON D3
const char* ssid = "MY_SSID";
const char* password = "MYPASSWORD";
const long utcOffsetInSeconds = 3600;
HT16K33 seg(0x70);
static uint32_t last = 0;
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
bool pomodoro_mode = false;
int pomodoro_minutes = 25;
int pomodoro_seconds = 0;
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
// Display init
seg.begin();
seg.brightness(7);
Wire.setClock(100000);
seg.displayOn();
seg.setDigits(4);
seg.displayClear();
// Try to connect to Wifi network...
WiFi.begin(ssid, password);
int i=0;
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
seg.blink(i);
Serial.print ( "." );
if (i > 3) { i=0; }
}
Serial.println ( "Connected!" );
seg.displayClear();
timeClient.begin();
timeClient.update();
// First time update
seg.displayColon(true);
seg.displayTime(timeClient.getHours(), timeClient.getMinutes());
last = millis();
pinMode(BUTTON, INPUT_PULLUP);
}
void loop()
{
if (digitalRead(BUTTON) == LOW) { Serial.println("CLICK!"); pomodoro_mode = true; delay(100); }
if ((millis()-last) > (100*1)) // Every minute
{
if (pomodoro_mode == true)
{
seg.displayTime(pomodoro_minutes, pomodoro_seconds);
if (pomodoro_seconds == 0)
{
if (pomodoro_minutes > 0) { pomodoro_minutes--; pomodoro_seconds = 59; }
else { pomodoro_mode = false; pomodoro_minutes=25; /* POMODORO END! */ }
}
else { pomodoro_seconds--; }
}
else
{
//timeClient.update();
//Serial.print(daysOfTheWeek[timeClient.getDay()]);
Serial.print(", ");
Serial.print(timeClient.getHours());
Serial.print(":");
Serial.print(timeClient.getMinutes());
Serial.print(":");
Serial.println(timeClient.getSeconds());
//Serial.println(timeClient.getFormattedTime());
seg.displayColon(true);
delay(500);
seg.displayTime(timeClient.getHours(), timeClient.getMinutes());
}
last = millis();
}
}
Recuerda que pada poder cargar el programa desde el IDE de Arduino, es necesario tener instalados los cores de ESP8266, así como la propia librería ESP8266, WifiUDP y HT16K33. Eso lo puedes hacer muy fácilmente desde el gestor de librerías.
Si no sabes cómo añadir nuevas placas al IDE de Arduino, te recomendamos seguiro primer éste tutorial:
Si has visto nuestro vídeo ya lo sabes y si bien no es un proyecto completo, te puede dar una idea de cómo enfocar el método Pomodoro y cómo implementarlo en un dispositivo físico que puedes construir tu mismo.
En cualquier caso es un proyecto muy sencillo de realizar donde siempre puedes aprender algo nuevo. Al fin y al cabo, es una placa NodeMCU con un display I2C y eso puede valer para muchas otras aplicaciones.