Menu
CoddyTech

Horloge NeoPixel : régler l’heure

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

L’horloge démarre toujours à 10:24:50, ce qui est juste une fois par jour. Deux boutons corrigent cela : le rouge sur la broche 2 avance l’horloge d’une heure, le vert sur la broche 3 de 5 minutes, soit un pixel de l’aiguille des minutes.

L’heure est un seul nombre, donc la régler revient à ajouter des secondes. Conservez dans une variable ce que les boutons ont ajouté et incluez-le dans la somme :

unsigned long adjust = 0;   // secondes ajoutées par les boutons

unsigned long now = startTime + adjust + millis() / 1000;

Une heure correspond à 3600 secondes et 5 minutes à 300. Comptabilisez chaque pression une seule fois, au moment où le bouton est enfoncé : LOW maintenant et HIGH la dernière fois. Ajouter à chaque passage tant que le bouton est maintenu ferait tourner l’horloge à toute vitesse. Ces boutons ne rebondissent pas.

int hourState = digitalRead(hourButton);
if (hourState == LOW && lastHour == HIGH) {
  adjust = adjust + 3600;
}
lastHour = hourState;

Chaque aiguille est calculée à partir de now, elles suivent donc toutes le réglage, et les restes font revenir les heures après 11 et les minutes après 55.

challenge icon

Défi

Moyen

Permettez de régler l’heure :

  • les broches 2 et 3 sont configurées en INPUT_PULLUP
  • un appui sur la broche 2 ajoute 3600 secondes, un appui sur la broche 3 en ajoute 300, chaque appui étant compté une seule fois lorsque le bouton est enfoncé
  • ajoutez ces secondes à now

Appuyez sur Run et réglez l’horloge à l’heure voulue, puis appuyez sur Check.

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;
  int hours = (now / 3600) % 12;

  int secondPixel = seconds / 5;
  int minutePixel = minutes / 5;
  int hourPixel = hours;

  // Chaque pixel reçoit le rouge de l’aiguille des heures et le vert de l’aiguille des minutes
  // et le bleu de l’aiguille des secondes, de sorte que les couleurs des aiguilles se mélangent sur un même pixel.
  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);  // 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