Reloj NeoPixel: combinando las manecillas
Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 23 de 24.
La manecilla de las horas es roja. La esfera de un reloj muestra 12 horas, así que la hora es (now / 3600) % 12: de 0 a 11, donde 0 son las 12 en punto. Eso ya es un número de píxel.
Ahora las manecillas pueden coincidir. A las 10:24:52, la manecilla de los segundos está en el píxel 10, encima de la manecilla de las horas. Si se dibujan una después de la otra, la segunda cubre la primera y una manecilla desaparece.
En su lugar, se puede mezclar la luz. Dale a cada manecilla su propio componente de color (rojo para las horas, verde para los minutos, azul para los segundos) y crea cada píxel a partir de las manecillas que están en él:
for (int i = 0; i < pixelCount; i++) {
int r = 0;
int g = 0;
int b = 0;
if (i == hourPixel) {
r = 255;
}
if (i == minutePixel) {
g = 255;
}
if (i == secondPixel) {
b = 255;
}
ring.setPixelColor(i, ring.Color(r, g, b));
}Cuando las manecillas coinciden, los componentes se suman: el rojo y el azul dan magenta, el verde y el azul dan cian, y el rojo y el verde dan amarillo. Cada píxel se establece en cada pasada, así que el bucle también sustituye a ring.clear().
Desafío
DifícilAñade la manecilla de las horas y mezcla las manecillas:
- la hora es
(now / 3600) % 12, dibujada en ese píxel - construye cada píxel en un bucle
for: rojo 255 si está ahí la manecilla de las horas, verde 255 para la manecilla de los minutos, azul 255 para la manecilla de los segundos
Pulsa Run: el reloj empieza a las 10:24:50 con las manecillas de los segundos y de las horas mezcladas. Después, pulsa Check.
Pruébalo tú mismo
#include <Adafruit_NeoPixel.h>
const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);
// La hora a la que empieza el reloj, en segundos desde la medianoche: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;
void setup() {
ring.begin();
}
void loop() {
unsigned long now = startTime + millis() / 1000; // la hora del día, en segundos
int seconds = now % 60;
int minutes = (now / 60) % 60;
ring.clear();
ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255)); // aguja de los segundos: azul
ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0)); // aguja de los minutos: verde
ring.show();
delay(100); // redibujar diez veces por segundo
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Proyectos
3Sensor de estacionamiento
Sensor de estacionamiento: distanciaSensor de estacionamiento: lucesSensor de estacionamiento: pitidosSensor de estacionamiento: pantalla6Reloj NeoPixel
Reloj NeoPixel: segundosReloj NeoPixel: minutosReloj NeoPixel: combinando las manecillasReloj NeoPixel: ajusta la horaPractica por tu cuenta: Playground de Arduino