Menu
CoddyTech

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().

challenge icon

Desafío

Difícil

Añ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
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Proyectos

Practica por tu cuenta: Playground de Arduino