Reloj de Pared RGB Animado – Arduino Nano y Control Bluetooth
Componentes y materiales
| Arduino Nano R3 | 1 |
| Módulo Bluetooth HC-06 | 1 |
| Módulo RTC DS3231 (Maxim Integrated) | 1 |
| Tira LED RGB | 1 |
| Piezas imprimibles en 3D | 1 |
Herramientas y máquinas necesarias
- Soldador (genérico)
- Impresora 3D (genérica)
Descripción del proyecto
Si recuerda, presentamos diseños de relojes como INFINITY MIRROR CLOCK y 7-SEGMENT DIGITAL CLOCK en secciones anteriores. Ahora volvemos con una pieza diferente, especial y muy bonita.
Sin duda le encantará este reloj de pared. Usamos again tira LED RGB. Y la impresora 3D es fundamental. Diseñamos e imprimimos varias piezas necesarias. No es solo un reloj: también incluye diferentes ANIMACIONES. Puede usarlo solo como animación si lo desea.
¿Cómo controla el reloj y las animaciones? Muy sencillo: desarrollamos una app simple para usted. Descárguela en el enlace.
Arduino es indispensable. Usamos Arduino Nano para ahorrar espacio. Nuestro proyecto RELOJ RGB DE PARED, con electrónica compacta, no le decepcionará. ¡Le invitamos a ver el vídeo a continuación!
Funcionamiento
- Muestra la hora mediante LEDs de colores: hora (rojo), minutos (verde), segundos (azul) en anillo de 60 LEDs.
- Anillo interno de 12 LEDs para horas (formato 12h).
- Control por Bluetooth (HC-06) desde app Android: ajuste de hora/minuto, cambio de colores por componente (R/G/B) para hora/minuto/segundo, modo animación (arcoíris, theater chase, color wipe, etc.).
- Animaciones:
colorWipe(rojo/verde/azul),theaterChase(blanco/rojo/azul),rainbow,rainbowCycle,theaterChaseRainbow.
Código
Código Arduino Nano
Código de hora y animaciones en archivos:
#include <DS3231.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6
#define PIN2 7
#define NUMPIXELS 60
DS3231 rtc(SDA, SCL);
Time t;
int hr, mnt, sc;
char data, color_select;
int h_red=255, h_green=0, h_blue=0;
int m_red=0, m_green=255, m_blue=0;
int s_red=255, s_green=255, s_blue=0;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(12, PIN2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(12, PIN2, NEO_GRB + NEO_KHZ800);
int delayval = 10;
void setup() {
Serial.begin(9600);
rtc.begin();
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
pixels.begin(); pixels2.begin();
strip.begin(); strip.show();
strip2.begin(); strip2.show();
}
void loop() {
while(Serial.available() > 0) {
delay(10);
char c = Serial.read(); data = c;
if(data=='m') { // Ajuste hora
data=' '; t=rtc.getTime(); hr=t.hour; mnt=t.min; sc=t.sec;
while(data!='m') {
data=Serial.read();
if(data=='+') hr++;
if(data=='-') hr--;
for(int i=0;i<12;i++) pixels2.setPixelColor(i, pixels2.Color(0,255,10));
pixels2.show();
if(hr>=12) hr-=12;
if(hr<0) hr+=12;
pixels2.setPixelColor(hr, pixels2.Color(255,0,0));
pixels2.show(); delay(100);
pixels2.setPixelColor(hr, pixels2.Color(0,0,0));
pixels2.show(); delay(100);
}
rtc.setTime(hr,mnt,sc);
if(data=='m') { // Ajuste minutos
data=' '; t=rtc.getTime(); hr=t.hour; mnt=t.min; sc=t.sec;
while(data!='m') {
data=Serial.read();
if(data=='+') { mnt++; if(mnt==60) mnt=0; }
if(data=='-') { if(mnt==0) mnt=60; mnt--; }
for(int k=0;k<60;k++) pixels.setPixelColor(k, pixels.Color(0,0,0));
for(int k=0;k<60;k++) { pixels.setPixelColor(k, pixels.Color(25,25,255)); k+=4; }
pixels.setPixelColor(mnt, pixels.Color(0,250,0));
pixels.show(); delay(100);
pixels.setPixelColor(mnt, pixels.Color(0,0,0));
pixels.show(); delay(100);
}
}
rtc.setTime(hr,mnt,sc); data=' ';
}
// Selección de color para H/M/S
if(data=='H') color_select=data;
if(data=='M') color_select=data;
if(data=='S') color_select=data;
// Modo animación
if(data=='A') {
data=' ';
colorWipe(strip.Color(255,0,0), 50);
colorWipe(strip.Color(0,255,0), 50);
colorWipe(strip.Color(0,0,255), 50);
theaterChase(strip.Color(127,127,127), 50);
theaterChase(strip.Color(127,0,0), 50);
theaterChase(strip.Color(0,0,127), 50);
rainbow(20);
rainbowCycle(20);
theaterChaseRainbow(50);
}
// Ajuste componentes RGB según selección (H/M/S)
if(data=='r' && color_select=='H') { h_red=Serial.parseInt(); pixels2.setPixelColor(hr, pixels2.Color(h_red,h_green,h_blue)); pixels2.show(); }
if(data=='g' && color_select=='H') { h_green=Serial.parseInt(); pixels2.setPixelColor(hr, pixels2.Color(h_red,h_green,h_blue)); pixels2.show(); }
if(data=='b' && color_select=='H') { h_blue=Serial.parseInt(); pixels2.setPixelColor(hr, pixels2.Color(h_red,h_green,h_blue)); pixels2.show(); }
if(data=='r' && color_select=='M') { m_red=Serial.parseInt(); pixels.setPixelColor(mnt, pixels.Color(m_red,m_green,m_blue)); pixels.show(); }
if(data=='g' && color_select=='M') { m_green=Serial.parseInt(); pixels.setPixelColor(mnt, pixels.Color(m_red,m_green,m_blue)); pixels.show(); }
if(data=='b' && color_select=='M') { m_blue=Serial.parseInt(); pixels.setPixelColor(mnt, pixels.Color(m_red,m_green,m_blue)); pixels.show(); }
if(data=='r' && color_select=='S') { s_red=Serial.parseInt(); pixels.setPixelColor(sc, pixels.Color(s_red,s_green,s_blue)); pixels.show(); }
if(data=='g' && color_select=='S') { s_green=Serial.parseInt(); pixels.setPixelColor(sc, pixels.Color(s_red,s_green,s_blue)); pixels.show(); }
if(data=='b' && color_select=='S') { s_blue=Serial.parseInt(); pixels.setPixelColor(sc, pixels.Color(s_red,s_green,s_blue)); pixels.show(); }
}
// Bucle principal: actualiza display cada 10ms
t = rtc.getTime(); hr=t.hour; mnt=t.min; sc=t.sec;
pixels.setPixelColor(sc, pixels.Color(s_red,s_green,s_blue));
pixels.setPixelColor(mnt, pixels.Color(m_red,m_green,m_blue));
pixels.show();
for(int i=0;i<12;i++) {
if(i==hr) i++;
pixels2.setPixelColor(i, pixels2.Color(0,255,0));
}
pixels2.show();
if(hr>=12) hr-=12;
pixels2.setPixelColor(hr, pixels2.Color(h_red,h_green,h_blue));
pixels2.show(); delay(10);
pixels.setPixelColor(sc, pixels.Color(0,0,0));
for(int k=0;k<60;k++) pixels.setPixelColor(k, pixels.Color(0,0,0));
for(int k=0;k<60;k++) { pixels.setPixelColor(k, pixels.Color(25,25,255)); k+=4; }
pixels.setPixelColor(mnt, pixels.Color(0,0,0));
pixels.show();
}
// Funciones de animación: colorWipe, rainbow, rainbowCycle, theaterChase, theaterChaseRainbow, Wheel
// ... (incluidas en el código completo)
Esquemáticos
Esquema de conexiones y control por smartphone.
clockconnect__Ieit1qA91l.apk (App Android para control)
Proceso de manufactura
- Reloj de cuco: historia, artesanía y evolución moderna
- Reloj POV con Arduino: Construye una pantalla LED de persistencia de visión
- Construye un Reloj de Pared Elegante con Anillo Neopixel 60 LEDs Adafruit y Arduino
- Reloj de Palabras DIY con Arduino: Construye una Pantalla Elegante en Tiempo Real
- Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
- Reloj 3D RGB Arduclock – Bluetooth, LED NeoPixel y RTC
- Reloj de Palabras en Italiano con Arduino Nano, NeoPixel, LCD y RTC
- Generador de Ondas JX – Oscilador DDS Compatible con Arduino con Pantalla OLED
- Construye un Reloj Berlín con Arduino UNO – Reloj de Matriz LED DIY
- Reloj Preciso de 7 Segmentos con Arduino Pro Mini y RTC DS1302
- Reloj Espejo Infinito: Elegancia infinita y hora precisa