Menu
CoddyTech

Reloj NeoPixel: ajusta la hora

Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 24 de 24.

El reloj siempre empieza a las 10:24:50, que es la hora correcta una vez al día. Dos botones lo ajustan: el rojo en el pin 2 adelanta el reloj una hora, el verde en el pin 3, 5 minutos, un píxel de la aguja de los minutos.

La hora es un solo número, así que ajustarla consiste en sumar segundos. Guarda lo que añaden los botones en una variable e inclúyelo en la suma:

unsigned long adjust = 0;   // segundos añadidos mediante los botones

unsigned long now = startTime + adjust + millis() / 1000;

Una hora son 3600 segundos y 5 minutos son 300. Cuenta cada pulsación una vez, cuando se pulsa el botón: LOW ahora y HIGH la última vez. Sumar en cada pasada mientras se mantiene pulsado haría que el reloj diera vueltas. Estos botones no rebotan.

int hourState = digitalRead(hourButton);
if (hourState == LOW && lastHour == HIGH) {
  adjust = adjust + 3600;
}
lastHour = hourState;

Cada aguja se calcula a partir de now, así que todas se mueven al unísono, y los restos hacen que las horas vuelvan a empezar después del 11 y los minutos después del 55.

challenge icon

Desafío

Intermedio

Haz que se pueda ajustar la hora:

  • los pines 2 y 3 son INPUT_PULLUP
  • una pulsación en el pin 2 añade 3600 segundos, una pulsación en el pin 3 añade 300; cada una se cuenta una sola vez cuando se pulsa el botón
  • suma esos segundos a now

Pulsa Run y ajusta el reloj a tu hora; 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 comienza 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;
  int hours = (now / 3600) % 12;

  int secondPixel = seconds / 5;
  int minutePixel = minutes / 5;
  int hourPixel = hours;

  // Cada píxel recibe el rojo de la manecilla de las horas y el verde de la manecilla de los minutos
  // y el azul de la manecilla de los segundos, de modo que los colores se mezclan cuando las manecillas coinciden en un píxel.
  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));
  }
  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