Horloge LED

“Voici une horloge fille de mars 1968.

l’horloge avant transformation



Elle a été mise à jour avec des LED WS2811 afin d’indiquer les secondes.
Les LED sont connectées à un ESP32 qui les allume une à une de rouge à vert. Le tour du cadran est fait en 58,5 secondes comme les horloges CFF.
Une impulsion 24V est envoyée toutes les minutes depuis une horloge mère.
Cette impulsion est une fois positive et une fois négative. Cela permet de faire avancer les minutes d’un réseau d’horloges, comme dans une gare ou une école.

Les LED attendent une impulsion pour démarrer un cycle de 58,5 secondes.
58,5 secondes est le même temps que met une trotteuse sur une horloge CFF.
Cela lui permet de faire une pause.
Dans mon cas, je fais clignoter les LED en bleu.

J’utilise un ESP32 pour commander les LED.
L’ESP32 est connecté à un relais qui reçoit l’impulsion toutes les 60 secondes.
Cela permet de donner le top départ de la trotteuse LED.
De ce fait, je suis certain que les secondes sont toujours synchronisées avec les minutes.

  • Le matériel:
  • Une horloge fille
  • Un ES32
  • Un relais 24V
  • Une alimentation 5V
  • Des LED WS2811

La voici en fonction:

Vidéo courte
Vidéo de 1min

Derrière:

Le dos de l’horloge avec dans la boite carrée l’ESP32 et le relais

Voici l’horloge mère qui pilote les horloges filles de l’atelier.

Horloge mère
La partie horloge mère est la carte sur la droite. Les batteries permettent un fonctionnement en cas de coupure d’électricité
Les boutons permettant d’arrêter les horloges et de les mettre à l’heure

Le code:

#include <FastLED.h>

#define LED_PIN     5
#define NUM_LEDS    60
#define BUTTON_PIN  18

CRGB leds[NUM_LEDS];

void setup() {
  FastLED.addLeds<WS2811, LED_PIN, GRB>(leds, NUM_LEDS);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop() {
  // Wait for button press
  while (digitalRead(BUTTON_PIN) == HIGH) {
    // Clear LEDs
    fill_solid(leds, NUM_LEDS, CRGB::Green);
    FastLED.show();
    delay(100);
  }
  
  // Clear LEDs and start LED cycle
  fill_solid(leds, NUM_LEDS, CRGB::Green);
  for (int i = 0; i < NUM_LEDS; i++) {
    // Blend green and red color
    nblend(leds[i], CRGB::Red, 128);
    FastLED.setBrightness(255); // Set full brightness
    FastLED.show();
    delay(975);
  }
  
  // All LEDs on
  fill_solid(leds, NUM_LEDS, CRGB::Red);
  FastLED.setBrightness(255); // Set full brightness
  FastLED.show();
  
  // Blink LEDs in blue
  for (int i = 0; i < 2; i++) {
    fill_solid(leds, NUM_LEDS, CRGB::Blue);
    FastLED.setBrightness(128); // Set half brightness
    FastLED.show();
    delay(100);
    fill_solid(leds, NUM_LEDS, CRGB::Black);
    FastLED.setBrightness(128); // Set half brightness
    FastLED.show();
    delay(100);
  }
  
  // Reduce brightness of LEDs
  FastLED.setBrightness(32); // Set low brightness
  FastLED.show();
  
  // Wait for button release
  while (digitalRead(BUTTON_PIN) == LOW) {
    delay(100);
  }
}