Orologio NeoPixel: impostare l'ora
Fa parte della sezione Progetti del percorso Arduino di Coddy. Lezione 24 di 24.
L'orologio parte sempre dalle 10:24:50, che è l'ora giusta una volta al giorno. Due pulsanti correggono l'ora: quello rosso sul pin 2 fa avanzare l'orologio di un'ora, quello verde sul pin 3 di 5 minuti, cioè di un pixel della lancetta dei minuti.
L'ora è un unico numero, quindi impostarla significa aggiungere secondi. Memorizza in una variabile ciò che i pulsanti hanno aggiunto e includilo nella somma:
unsigned long adjust = 0; // secondi aggiunti dai pulsanti
unsigned long now = startTime + adjust + millis() / 1000;Un'ora equivale a 3600 secondi e 5 minuti a 300. Conta ogni pressione una sola volta, quando il pulsante viene premuto: LOW ora e HIGH l'ultima volta. Aggiungere a ogni passaggio mentre il pulsante è tenuto premuto farebbe girare l'orologio in tondo. Questi pulsanti non rimbalzano.
int hourState = digitalRead(hourButton);
if (hourState == LOW && lastHour == HIGH) {
adjust = adjust + 3600;
}
lastHour = hourState;Tutte le lancette derivano da now, quindi si muovono insieme, e i resti fanno ripartire le ore dopo le 11 e i minuti dopo i 55.
Sfida
MedioRendi l'ora impostabile:
- i pin 2 e 3 sono
INPUT_PULLUP - una pressione sul pin 2 aggiunge 3600 secondi, una pressione sul pin 3 aggiunge 300, ciascuna conteggiata una sola volta quando il pulsante viene premuto
- aggiungi quei secondi a
now
Premi Run e imposta l'orologio sulla tua ora, poi Check.
Provalo tu
#include <Adafruit_NeoPixel.h>
const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);
// L'ora da cui parte l'orologio, in secondi dalla mezzanotte: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;
void setup() {
ring.begin();
}
void loop() {
unsigned long now = startTime + millis() / 1000; // l'ora del giorno, in secondi
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;
// Ogni pixel riceve il rosso dalla lancetta delle ore, il verde dalla lancetta dei minuti
// e il blu dalla lancetta dei secondi, quindi i colori delle lancette sullo stesso pixel si mescolano.
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); // ridisegna dieci volte al secondo
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Progetti
3Sensore di parcheggio
Sensore di parcheggio: distanzaSensore di parcheggio: luciSensore di parcheggio: segnali acusticiSensore di parcheggio: display6Orologio NeoPixel
Orologio NeoPixel: i secondiOrologio NeoPixel: i minutiOrologio NeoPixel: combinare le lancetteOrologio NeoPixel: impostare l'oraEsercitati da solo: Playground Arduino