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.
Desafío
IntermedioHaz 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
}
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