Reloj IoT RGB HexMatrix – Pantalla LED Hexagonal Dinámica
Componentes y suministros
| Componente | Cantidad |
|---|---|
| Arduino UNO | 1 |
| NodeMCU ESP8266 Breakout Board | 1 |
| LEDs NeoPixel WS2811 (96 unidades) | 1 tira |
| Fuente conmutada 5V 2.5A | 1 |
Herramientas y máquinas necesarias
- Soldador y estaño (sin plomo)
- Flux para soldar
- Cortacables (143 mm)
- Impresora 3D (para las piezas)
Aplicaciones y servicios en línea
- Arduino IDE
Sobre este proyecto


HexMatrix es una matriz LED formada por píxeles triangulares; seis píxeles forman un hexágono. Permite mostrar animaciones variadas (librería FastLED) y dígitos del 0 al 9 usando 10 segmentos por dígito, funcionando como reloj IoT.
Suministros
- ESP8266 o Arduino (Uno/Nano)
- LEDs WS2811 (96 LEDs)
- Fuente 5V/2A
- Impresión 3D
Paso 1: Impresión 3D





- Imprime en 3D todos los modelos STL: Archivos STL y códigos
- Imprime la capa difusora (pantalla) en PLA blanco.
Paso 2: Conexiones del circuito


- Conecta según el diagrama.
- GND → -Ve | Vin → 5V → +Ve
- Data In → Pin 2 (Arduino/ESP8266)
- Extiende los cables de alimentación al final de la tira LED para evitar caída de tensión.
Paso 3: Nota importante
- Si usas Arduino: solo podrás mostrar animaciones (sin hora).
- Si usas ESP8266: podrás mostrar la hora (NTP) y animaciones.
Paso 4: Montaje
- Coloca los 96 LEDs en orden "serpiente" (snake).
- Ensambla toda la estructura impresa.
- Suela el conector al microcontrolador (el conector va al final de la cadena de LEDs).








Paso 5: Programación
- Códigos disponibles: HexMatrix.ino, clock1.ino, clock2.ino
- HexMatrix.ino: Solo animaciones (funciona en cualquier microcontrolador).
- clock1.ino y clock2.ino: Reloj IoT + animaciones (solo ESP8266).
HexMatrix.ino (animaciones):
- Abre en Arduino IDE.
- Instala librería FastLED.
- Selecciona placa, puerto y sube.



Clock1 y Clock2 (reloj IoT):
- Abre en Arduino IDE.
- Personaliza colores dígitos y fondo:
// Color dígitos (RGB)
int r = 255, g = 255, b = 255;
// Color fondo (RGB)
int br = 0, bg = 20, bb = 10;
- Configura Wi-Fi y zona horaria:
const char* ssid = "Tu_WiFi";
const char* password = "Tu_Password";
// Zona horaria (ej. India UTC+5:30 = 5.5 * 3600)
int timezone = -5.5 * 3600; // Ajusta a tu zona (negativo = oeste de UTC)
- Selecciona placa ESP8266, puerto y sube.


Además, FastLED incluye muchos ejemplos de animaciones adicionales.
Código
clock1.ino (reloj con fondo estático)
#include <ESP8266WiFi.h>
#include <time.h>
#include <FastLED.h>
#define LED_PIN 2
#define NUM_LEDS 96
#define BRIGHTNESS 255
#define LED_TYPE WS2811
#define COLOR_ORDER RGB
CRGB leds[NUM_LEDS];
// Color dígitos
int r = 255, g = 255, b = 255;
// Color fondo
int br = 0, bg = 20, bb = 10;
const char* ESP_HOST_NAME = "esp-" + ESP.getFlashChipId();
const char* ssid = "Wifi_Name";
const char* password = "Password";
int timezone = -5.5 * 3600;
int dst = 0;
WiFiClient wifiClient;
void connectWifi() {
WiFi.begin(ssid, password);
Serial.print("Connecting to "); Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println(); Serial.println("WiFi connected!");
Serial.println(WiFi.localIP()); Serial.println();
}
void setup() {
Serial.begin(115200);
delay(500);
connectWifi();
configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.printf("Date & Time: %02d/%02d/%04d %02d:%02d:%02d\n",
p_tm->tm_mday, p_tm->tm_mon + 1, p_tm->tm_year + 1900,
p_tm->tm_hour % 12 ?: 12, p_tm->tm_min, p_tm->tm_sec);
int hour = p_tm->tm_hour;
int minute = p_tm->tm_min;
if (hour > 12) hour -= 12;
background(); // Fondo
// Horas (funciones hour0()...hour11())
switch (hour) {
case 0: case 12: hour12(); break;
case 1: hour1(); break;
case 2: hour2(); break;
case 3: hour3(); break;
case 4: hour4(); break;
case 5: hour5(); break;
case 6: hour6(); break;
case 7: hour7(); break;
case 8: hour8(); break;
case 9: hour9(); break;
case 10: hour10(); break;
case 11: hour11(); break;
}
// Minutos (funciones min0()...min59())
switch (minute) {
case 0: min0(); break; case 1: min1(); break; case 2: min2(); break;
case 3: min3(); break; case 4: min4(); break; case 5: min5(); break;
case 6: min6(); break; case 7: min7(); break; case 8: min8(); break;
case 9: min9(); break; case 10: min10(); break; case 11: min11(); break;
case 12: min12(); break; case 13: min13(); break; case 14: min14(); break;
case 15: min15(); break; case 16: min16(); break; case 17: min17(); break;
case 18: min18(); break; case 19: min19(); break; case 20: min20(); break;
case 21: min21(); break; case 22: min22(); break; case 23: min23(); break;
case 24: min24(); break; case 25: min25(); break; case 26: min26(); break;
case 27: min27(); break; case 28: min28(); break; case 29: min29(); break;
case 30: min30(); break; case 31: min31(); break; case 32: min32(); break;
case 33: min33(); break; case 34: min34(); break; case 35: min35(); break;
case 36: min36(); break; case 37: min37(); break; case 38: min38(); break;
case 39: min39(); break; case 40: min40(); break; case 41: min41(); break;
case 42: min42(); break; case 43: min43(); break; case 44: min44(); break;
case 45: min45(); break; case 46: min46(); break; case 47: min47(); break;
case 48: min48(); break; case 49: min49(); break; case 50: min50(); break;
case 51: min51(); break; case 52: min52(); break; case 53: min53(); break;
case 54: min54(); break; case 55: min55(); break; case 56: min56(); break;
case 57: min57(); break; case 58: min58(); break; case 59: min59(); break;
case 60: min60(); break;
}
FastLED.show();
FastLED.clear();
FastLED.show();
}
void background() {
for (int i = 0; i < NUM_LEDS; i++) leds[i] = CRGB(br, bg, bb);
}
/* Funciones hourX() y minX() definen qué LEDs encender para cada dígito.
Cada una asigna CRGB(r,g,b) a índices específicos del array leds[].
El código completo incluye 12 funciones hour y 61 funciones min. */
clock2.ino (reloj con fondo animado "pride")
#include <ESP8266WiFi.h>
#include <time.h>
#include <FastLED.h>
#if FASTLED_VERSION < 3001000
#error "Requiere FastLED 3.1 o posterior"
#endif
#define DATA_PIN 2
#define LED_TYPE WS2811
#define COLOR_ORDER RGB
#define NUM_LEDS 96
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];
int r = 255, g = 255, b = 255;
const char* ESP_HOST_NAME = "esp-" + ESP.getFlashChipId();
const char* ssid = "Wifi_Name";
const char* password = "Password";
int timezone = -5.5 * 3600;
int dst = 0;
WiFiClient wifiClient;
void connectWifi() { /* igual que clock1 */ }
void setup() {
Serial.begin(115200);
delay(500);
connectWifi();
configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS)
.setCorrection(TypicalLEDStrip).setDither(BRIGHTNESS < 255);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
int hour = p_tm->tm_hour;
int minute = p_tm->tm_min;
if (hour > 12) hour -= 12;
pride(); // Fondo animado arcoíris
// Mismo switch-case para hourX() y minX() que clock1
// ...
FastLED.show();
FastLED.clear();
FastLED.show();
}
void pride() {
static uint16_t sPseudotime = 0, sLastMillis = 0, sHue16 = 0;
uint8_t sat8 = beatsin88(87, 220, 250);
uint8_t brightdepth = beatsin88(341, 96, 224);
uint16_t brightnessthetainc16 = beatsin88(203, 25*256, 40*256);
uint8_t msmultiplier = beatsin88(147, 23, 60);
uint16_t hue16 = sHue16;
uint16_t hueinc16 = beatsin88(113, 1, 3000);
uint16_t ms = millis();
uint16_t deltams = ms - sLastMillis;
sLastMillis = ms;
sPseudotime += deltams * msmultiplier;
sHue16 += deltams * beatsin88(400, 5, 9);
uint16_t brightnesstheta16 = sPseudotime;
for (uint16_t i = 0; i < NUM_LEDS; i++) {
hue16 += hueinc16;
uint8_t hue8 = hue16 / 256;
brightnesstheta16 += brightnessthetainc16;
uint16_t b16 = sin16(brightnesstheta16) + 32768;
uint16_t bri16 = (uint32_t)b16 * b16 / 65536;
uint8_t bri8 = (uint32_t)bri16 * brightdepth / 65536;
bri8 += (255 - brightdepth);
CRGB newcolor = CHSV(hue8, sat8, bri8);
uint16_t pixelnumber = (NUM_LEDS - 1) - i;
nblend(leds[pixelnumber], newcolor, 64);
}
}
/* Funciones hourX() y minX() idénticas a clock1 */
Esquemáticos


Proceso de manufactura
- Prevención de uniones de soldadura en frío: Garantizando electrónica industrial fiable mediante calor adecuado
- Reloj de cuco: historia, artesanía y evolución moderna
- Botón IoT AWS Controlado por Movimiento con Raspberry Pi, Sensor PIR y MQTT
- Extensión de GoPiGo v2 en Windows 10 IoT Core para Raspberry Pi 3
- Reloj POV con Arduino: Construye una pantalla LED de persistencia de visión
- Planta Inteligente IoT: Construye un Invernadero Conectado con Arduino y Azure
- Reloj Espejo Infinito: Elegancia infinita y hora precisa
- Guía Profesional del Proceso de Soldadura Blanda (Soldering): Técnica, Materiales y Pasos
- Soldadura Blanda (Soldadura con Estaño) Explicada: Tipos, Técnicas y Guía Paso a Paso
- Guía Experta: Solución de Problemas de Soldadura por Onda en PCB
- Dominando la soldadura en PCB: Tipos, técnicas y recursos clave