1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
| # Importer les bibliothèques nécessaires
import time
import datetime
import subprocess
import neopixel as ws
from gpiozero import Button
# Définir les constantes
LED_COUNT = 114 # Nombre de leds
LED_PIN = 18 # Pin GPIO connecté aux leds
LED_FREQ_HZ = 800000 # Fréquence du signal LED en hertz
LED_DMA = 10 # Canal DMA à utiliser pour générer le signal
LED_BRIGHTNESS = 255 # Luminosité des leds (0 à 255)
LED_INVERT = False # Inverser le signal LED (True/False)
LED_CHANNEL = 0 # Canal PWM à utiliser (0 ou 1)
LED_STRIP = ws.WS2812B # Type de bande LED
BUTTON_1_PIN = 17 # Pin GPIO connecté au bouton 1
BUTTON_2_PIN = 22 # Pin GPIO connecté au bouton 2
BUTTON_3_PIN = 24 # Pin GPIO connecté au bouton 3
BUTTON_HOLD_TIME = 2 # Temps en secondes pour détecter un appui long
COLORS = [(255, 255, 255), (255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (0, 255, 255), (255, 0, 255)] # Lis$
DEFAULT_COLOR = (255, 255, 255) # Couleur par défaut
DEFAULT_BRIGHTNESS = 255 # Luminosité par défaut
WIFI_SSID = "WordClock" # Nom du point d'accès wifi
WIFI_PASS = "12345678" # Mot de passe du point d'accès wifi
# Définir le tableau des lettres
LETTERS = [
"ILNESTODEUX",
"QUATRETROIS",
"NEUFUNESEPT",
"HUITSIXCINQ",
"MIDIXMINUIT",
"ONZERHEURES",
"MOINSOLEDIX",
"ETRQUARTPMD",
"TRENTEOURXT",
"VINGT-CINQU"
]
# Définir les indices des leds correspondant aux mots
WORDS = {
"IL": [0, 1],
"EST": [3, 4, 5],
"UNE": [22, 23, 24],
"DEUX": [7, 8, 9 ,10],
"TROIS": [11 ,12 ,13 ,14 ,15],
"QUATRE": [16 ,17 ,18 ,19 ,20 ,21],
"CINQ": [33 ,34 ,35 ,36],
"SIX": [28 ,29 ,30],
"SEPT": [25 ,26 ,27 ,28],
"HUIT": [31 ,32 ,33 ,34],
"NEUF": [18 ,19 ,20 ,21],
"DIX": [39 ,40 ,41],
"ONZE": [42 ,43 ,44 ,45],
"MIDI": [35 ,36 ,37 ,38],
"MINUIT": [41 ,42 ,43 ,44 ,45],
"HEURES": [46 ,47 ,48 ,49 ,50],
"MOINS": [51 ,52 ,53 ,54],
"LE": [55, 56],
"DIX": [57, 58, 59],
"ET": [60, 61],
"QUART": [62, 63, 64, 65, 66],
"VINGT": [79, 80, 81, 82, 83],
"TRENTE": [67, 68, 69, 70, 71],
}
# Définir les indices des leds correspondant aux points
POINTS = [109, 110, 111, 112]
# Définir la classe WordClock
class WordClock:
def __init__(self):
# Initialiser les leds
self.leds = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA,
LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL,
LED_STRIP)
self.leds.begin()
# Initialiser les boutons
self.button_1 = Button(BUTTON_1_PIN)
self.button_2 = Button(BUTTON_2_PIN)
self.button_3 = Button(BUTTON_3_PIN)
# Initialiser les attributs
self.color = DEFAULT_COLOR # Couleur actuelle des leds
self.brightness = DEFAULT_BRIGHTNESS # Luminosité actuelle des leds
self.color_index = 0 # Indice de la couleur actuelle dans la liste des couleurs
self.wifi_on = False # Indicateur du point d'accès wifi
# Associer les actions aux boutons
self.button_1.when_pressed = self.change_color # Changer la couleur en appuyant sur le bouton 1
self.button_1.when_held = self.reset_color # Réinitialiser la couleur en maintenant le bouton 1
self.button_2.when_pressed = self.change_brightness # Changer la luminosité en appuyant sur le bouton 2
self.button_2.when_held = self.reset_brightness # Réinitialiser la luminosité en maintenant le bouton 2
self.button_3.when_pressed = self.toggle_leds # Allumer ou éteindre les leds en appuyant sur le bouton 3
self.button_3.when_held = self.toggle_wifi # Activer ou désactiver le point d'accès wifi en maintenant le bo$
def change_color(self):
# Changer la couleur des leds en choisissant la couleur suivante dans la liste des couleurs
self.color_index = (self.color_index + 1) % len(COLORS) # Incrémenter l'indice de la couleur et revenir au d$
self.color = COLORS[self.color_index] # Choisir la couleur correspondante
print("Changing color to {}".format(self.color)) # Afficher un message de confirmation
self.show_time() # Afficher l'heure avec la nouvelle couleur
def reset_color(self):
# Réinitialiser la couleur des leds à la couleur par défaut
self.color = DEFAULT_COLOR # Choisir la couleur par défaut
print("Resetting color to {}".format(self.color)) # Afficher un message de confirmation
self.show_time() # Afficher l'heure avec la nouvelle couleur
def change_brightness(self):
# Changer la luminosité des leds en diminuant ou augmentant de 10% à chaque appui
if self.brightness > 25: # Si la luminosité est supérieure à 25%
self.brightness -= 25 # La diminuer de 10%
else: # Sinon
self.brightness = 255 # La remettre à 100%
print("Changing brightness to {}".format(self.brightness)) # Afficher un message de confirmation
self.leds.setBrightness(self.brightness) # Régler la luminosité des leds
self.leds.show() # Afficher les leds
def reset_brightness(self):
# Réinitialiser la luminosité des leds à la luminosité par défaut
self.brightness = DEFAULT_BRIGHTNESS # Choisir la luminosité par défaut
print("Resetting brightness to {}".format(self.brightness)) # Afficher un message de confirmation
self.leds.setBrightness(self.brightness) # Régler la luminosité des leds
self.leds.show() # Afficher les leds
def toggle_leds(self):
# Allumer ou éteindre les leds en inversant la luminosité
if self.brightness > 0: # Si les leds sont allumées
self.brightness = 0 # Les éteindre
else: # Sinon
self.brightness = DEFAULT_BRIGHTNESS # Les allumer
print("Toggling leds to {}".format(self.brightness)) # Afficher un message de confirmation
self.leds.setBrightness(self.brightness) # Régler la luminosité des leds
self.leds.show() # Afficher les leds
def toggle_wifi(self):
# Activer ou désactiver le point d'accès wifi en utilisant la commande nmcli
if self.wifi_on: # Si le point d'accès wifi est activé
subprocess.run(["nmcli", "connection", "down", WIFI_SSID]) # Le désactiver
self.wifi_on = False # Mettre à jour l'indicateur
print("Turning off wifi hotspot") # Afficher un message de confirmation
else: # Sinon
subprocess.run(["nmcli", "connection", "up", WIFI_SSID]) # L'activer
self.wifi_on = True # Mettre à jour l'indicateur
print("Turning on wifi hotspot") # Afficher un message de confirmation
def show_time(self):
# Afficher l'heure sur les leds en fonction du tableau des lettres et des mots
now = datetime.datetime.now() # Obtenir l'heure actuelle
hour = now.hour % 12 or 12 # Obtenir l'heure au format 12h (1 à 12)
minute = now.minute - (now.minute % 5) # Arrondir les minutes au multiple de 5 le plus proche (0, 5, 10, ...)
self.clear_leds() # Effacer les leds
self.set_word("IL") # Allumer le mot IL
self.set_word("EST") # Allumer le mot EST
if hour == 1 and minute == 0: # Si il est une heure pile
self.set_word("UNE") # Allumer le mot UNE
else: # Sinon
self.set_word(WORDS[hour]) # Allumer le mot correspondant à l'heure
if minute == 0: # Si il est pile heure
if hour in [1, 11]: # Si il est une heure ou onze heures
self.set_word("HEURE") # Allumer le mot HEURE au singulier
else: # Sinon
self.set_word("HEURES") # Allumer le mot HEURES au pluriel
if hour in [0, 12]: # Si il est minuit ou midi
self.set_word(WORDS[hour]) # Allumer le mot correspondant à minuit ou midi
elif minute == 15: # Si il est quart d'heure
self.set_word("ET") # Allumer le mot ET
self.set_word("QUART") # Allumer le mot QUART
elif minute == 30: # Si il est demi-heure
self.set_word("ET") # Allumer le mot ET
self.set_word("DEMI") # Allumer le mot DEMI
elif minute == 45: # Si il est trois quarts d'heure
hour = (hour + 1) % 12 or 12 # Passer à l'heure suivante pour indiquer moins le quart
self.set_word("MOINS") # Allumer le mot MOINS
self.set_word("LE")# Allumer le mot LE
self.set_word("QUART") # Allumer le mot QUART
else: # Sinon
self.set_word("MOINS") # Allumer le mot MOINS
if minute == 5: # Si il est moins cinq
self.set_word("CINQ") # Allumer le mot CINQ
elif minute == 10: # Si il est moins dix
self.set_word("DIX") # Allumer le mot DIX
elif minute == 20: # Si il est moins vingt
self.set_word("VINGT") # Allumer le mot VINGT
elif minute == 25: # Si il est moins vingt-cinq
self.set_word("VINGT") # Allumer le mot VINGT
self.set_word("ET") # Allumer le mot ET
self.set_word("CINQ") # Allumer le mot CINQ
elif minute == 35: # Si il est moins trente-cinq
hour = (hour + 1) % 12 or 12 # Passer à l'heure suivante pour indiquer vingt-cinq minutes après
self.set_word("VINGT") # Allumer le mot VINGT
self.set_word("CINQ") # Allumer le mot CINQ
elif minute == 40: # Si il est moins quarante
hour = (hour + 1) % 12 or 12 # Passer à l'heure suivante pour indiquer vingt minutes après
self.set_word("VINGT") # Allumer le mot VINGT
elif minute == 50: # Si il est moins cinquante
hour = (hour + 1) % 12 or 12 # Passer à l'heure suivante pour indiquer dix minutes après
self.set_word("DIX") # Allumer le mot DIX
elif minute == 55: # Si il est moins cinquante-cinq
hour = (hour + 1) % 12 or 12 # Passer à l'heure suivante pour indiquer cinq minutes après
self.set_word("CINQ") # Allumer le mot CINQ
self.show_points(now.minute % 5) # Afficher les points correspondant aux minutes restantes
self.leds.show() # Afficher les leds
def set_word(self, word):
# Allumer les leds correspondant à un mot donné en fonction du tableau des lettres et des indices des leds
for i in WORDS[word]: # Pour chaque indice de led dans le mot
self.leds.setPixelColor(i, Color(*self.color)) # Allumer la led avec la couleur actuelle
def show_points(self, n):
# Afficher les points correspondant aux minutes restantes (0 à 4)
for i in range(n): # Pour chaque point à afficher
self.leds.setPixelColor(POINTS[i], Color(*self.color)) # Allumer la led avec la couleur actuelle
def clear_leds(self):
# Éteindre toutes les leds
for i in range(LED_COUNT): # Pour chaque led
self.leds.setPixelColor(i, Color(0, 0, 0)) # Éteindre la led
# Créer une instance de la classe WordClock
wc = WordClock()
# Afficher l'heure en boucle infinie
while True:
wc.show_time() # Afficher l'heure sur les leds
time.sleep(5) # Attendre 5 secondes avant de répéter |
Partager