8x32 PI : interface web, matrice verticale, compatibilité Raspbian 11

- Interface web (serveur_web.py, Flask, gabarits dans web/) : dépôt de GIF,
  PNG animés et séquences de PNG, aperçus animés, ordre de lecture,
  activer / désactiver, corbeille, « jouer maintenant » et « suivante ».
  Service systemd vitrine-web, activé par installer.sh.
- Lecteur : réagit aux demandes de la page web (post-it dans
  /run/vitrine-pixels), écrit l'animation en cours, éteint la matrice
  proprement sur SIGTERM.
- Matrice posée debout : réglage ROTATION (90 = image 8 × 32) dans
  matrice.py ; images couchées tournées automatiquement ; exemples,
  animations codées, aperçus et page web adaptés au format vertical.
- Compatibilité Raspbian 11 Bullseye : partition /boot, Pillow 8.1, Flask 1.1.
- Doc : nouveau guide INTERFACE_WEB.md ; README, GUIDE_KRITA, MODE_VITRINE,
  CODER_EN_PYTHON mis à jour (format 8 × 32, adresses Wi-Fi / câble du Pi).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bach
2026-10-08 16:08:18 +02:00
co-authored by Claude Opus 5.5
parent 98fca33142
commit 2d4b0d5a5f
63 changed files with 1592 additions and 156 deletions
+32 -20
View File
@@ -67,8 +67,8 @@ def anim_arc_en_ciel():
for temps in range(256):
for x in range(LARGEUR):
for y in range(HAUTEUR):
# La teinte dépend de la colonne et du temps qui passe.
pixel(x, y, teinte(x * 8 + temps * 2))
# La teinte dépend de la position et du temps qui passe.
pixel(x, y, teinte((x + y) * 8 + temps * 2))
montrer()
attendre(20)
@@ -95,16 +95,16 @@ def anim_pluie():
# --- Animation 3 : un dessin en pixel art qui défile ---
# Une lettre par pixel, « . » = éteint. 8 lignes de même longueur.
# Une lettre par pixel, « . » = éteint. Toutes les lignes de même longueur,
# pas plus de 8 pixels de large ni de haut (le petit côté de la matrice).
DESSIN = [
"..RR.RR..",
".RBRRRRR.",
".RRRRRRR.",
".RRRRRRR.",
"..RRRRR..",
"...RRR...",
"....R....",
".........",
".RR..RR.",
"RBBRRRRR",
"RBRRRRRR",
"RRRRRRRR",
".RRRRRR.",
"..RRRR..",
"...RR...",
]
# Un « dictionnaire » associe chaque lettre à une couleur.
@@ -114,20 +114,32 @@ COULEUR_DE_LETTRE = {
}
def dessiner_dessin(depart_x):
def dessiner_dessin(depart_x, depart_y):
for y, ligne in enumerate(DESSIN): # enumerate donne le numéro ET la ligne
for x, lettre in enumerate(ligne):
if lettre in COULEUR_DE_LETTRE:
pixel(depart_x + x, y, COULEUR_DE_LETTRE[lettre])
pixel(depart_x + x, depart_y + y, COULEUR_DE_LETTRE[lettre])
def anim_dessin_qui_defile():
largeur_dessin = len(DESSIN[0]) # len = longueur de la ligne
for x in range(LARGEUR, -largeur_dessin - 1, -1):
effacer()
dessiner_dessin(x)
montrer()
attendre(70)
hauteur_dessin = len(DESSIN) # = nombre de lignes
if HAUTEUR > LARGEUR:
# Matrice DEBOUT : le dessin monte du bas vers le haut.
x = (LARGEUR - largeur_dessin) // 2 # centré
for y in range(HAUTEUR, -hauteur_dessin - 1, -1):
effacer()
dessiner_dessin(x, y)
montrer()
attendre(70)
else:
# Matrice COUCHÉE : le dessin passe de droite à gauche.
y = (HAUTEUR - hauteur_dessin) // 2
for x in range(LARGEUR, -largeur_dessin - 1, -1):
effacer()
dessiner_dessin(x, y)
montrer()
attendre(70)
# --- Animation 4 : étincelles ---
@@ -144,8 +156,8 @@ def anim_etincelles():
def anim_ma_premiere():
for x in range(LARGEUR):
effacer()
pixel(x, 3, JAUNE)
pixel(x, 4, JAUNE)
pixel(x, HAUTEUR // 2 - 1, JAUNE) # deux points au milieu de la hauteur
pixel(x, HAUTEUR // 2, JAUNE)
montrer()
attendre(50)