Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Rendi 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
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Progetti

Esercitati da solo: Playground Arduino