Menu
CoddyTech

Horloge NeoPixel : mélanger les aiguilles

Fait partie de la section Projets du Journey Arduino de Coddy. Leçon 23 sur 24.

L’aiguille des heures est rouge. Un cadran affiche 12 heures, donc l’heure est (now / 3600) % 12 : de 0 à 11, où 0 correspond à 12 heures. C’est déjà un numéro de pixel.

Maintenant, les aiguilles peuvent se rejoindre. À 10:24:52, l’aiguille des secondes est sur le pixel 10, par-dessus l’aiguille des heures. Dessinée l’une après l’autre, la seconde recouvre la première et une aiguille disparaît.

La lumière peut plutôt se mélanger. Attribue à chaque aiguille sa propre composante de couleur (rouge pour les heures, vert pour les minutes, bleu pour les secondes) et compose chaque pixel à partir des aiguilles qui s’y trouvent :

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

Là où les aiguilles se rejoignent, les composantes s’additionnent : le rouge et le bleu donnent du magenta, le vert et le bleu du cyan, le rouge et le vert du jaune. Chaque pixel est défini à chaque passage, donc la boucle remplace aussi ring.clear().

challenge icon

Défi

Difficile

Ajoute l’aiguille des heures et mélange les aiguilles :

  • l’heure est (now / 3600) % 12, dessinée sur ce pixel
  • construis chaque pixel dans une boucle for : rouge à 255 si l’aiguille des heures est là, vert à 255 pour l’aiguille des minutes, bleu à 255 pour l’aiguille des secondes

Appuie sur Exécuter : l’horloge démarre à 10:24:50 avec les aiguilles des secondes et des heures mélangées. Puis appuie sur Vérifier.

Essayez vous-même

#include <Adafruit_NeoPixel.h>

const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);

// L'heure de départ de l'horloge, en secondes depuis minuit : 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'heure de la journée, en secondes
  int seconds = now % 60;
  int minutes = (now / 60) % 60;

  ring.clear();
  ring.setPixelColor(seconds / 5, ring.Color(0, 0, 255));  // aiguille des secondes : bleue
  ring.setPixelColor(minutes / 5, ring.Color(0, 255, 0));  // aiguille des minutes : verte
  ring.show();
  delay(100);  // redessiner dix fois par seconde
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Projets

Entraînez-vous par vous-même : Playground Arduino