Menu
CoddyTech

Orologio NeoPixel: combinare le lancette

Fa parte della sezione Progetti del percorso Arduino di Coddy. Lezione 23 di 24.

La lancetta delle ore è rossa. Il quadrante mostra 12 ore, quindi l'ora è (now / 3600) % 12: da 0 a 11, dove 0 corrisponde alle 12. È già un numero di pixel.

Ora le lancette possono incontrarsi. Alle 10:24:52 la lancetta dei secondi è sul pixel 10, sopra quella delle ore. Se le disegni una dopo l'altra, la seconda copre la prima e una lancetta scompare.

Invece, i colori possono mescolarsi. Assegna a ogni lancetta una componente di colore (rosso per le ore, verde per i minuti, blu per i secondi) e componi ogni pixel in base alle lancette che si trovano su di esso:

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));
}

Nei punti in cui le lancette si incontrano, le componenti si sommano: rosso e blu danno magenta, verde e blu ciano, rosso e verde giallo. Ogni pixel viene impostato a ogni passaggio, quindi il ciclo sostituisce anche ring.clear().

challenge icon

Sfida

Difficile

Aggiungi la lancetta delle ore e mescola le lancette:

  • l’ora è (now / 3600) % 12, disegnata su quel pixel
  • crea ogni pixel in un ciclo for: rosso 255 se c’è la lancetta delle ore, verde 255 per la lancetta dei minuti, blu 255 per la lancetta dei secondi

Premi Run: l’orologio parte da 10:24:50 con le lancette dei secondi e delle ore sovrapposte. Poi premi 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;

  ring.clear();
  ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255));  // lancetta dei secondi: blu
  ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0));  // lancetta dei minuti: verde
  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