Sense Hat Fireworks

C’est le 5 novembre, tout le monde se dirige vers les feux d’artifice et joue avec les cierges magiques, mais cette année, nous avons imaginé faire notre propre petite vitrine.

Le Raspberry Pi Sense HAT possède une magnifique gamme de 8 x 8 LED qui constituent la plate-forme idéale pour construire notre propre écran de feu d’artifice.

blank

Configuration de notre script

Pour commencer, nous devons importer la bibliothèque Sense HAT. Et parce que nous allons devoir retarder nos feux d’artifice, nous devons également importer le sommeil.

from sense_hat import SenseHat
from time import sleep

Maintenant, nous avons quelques bibliothèques pour commencer, nous voulons également initialiser notre Sense HAT, donc juste en dessous, nous devons ajouter:

sense = SenseHat()

Faire des feux d’artifice

Nous avons donc un Sense HAT à utiliser, la première étape consiste à construire un feu d’artifice qui explosera sur notre écran. Le meilleur bit de chaque feu d’artifice est le bit d’explosion une fois la fusée lancée, alors commençons par ça.

Les LED sont numérotées de 0 à 7 en commençant et le coin supérieur gauche est (0, 0) et le coin inférieur droit est (7, 7). Pour tester notre feu d’artifice, nous devrions commencer à peu près au milieu à (3, 3)

La fonction ci-dessous allumera la LED à partir de (3,3), puis se déplacera vers le haut, le bas, la gauche et la droite pour (3, 3) allumer et éteindre les LED pendant son déplacement. Nos feux d’artifice seront rouges car nous avons choisi (255, 0, 0):

def firework_head():
for x in range(4):
sense.set_pixel(3-x, 3, 255, 0, 0)
sense.set_pixel(3, 3-x, 255, 0, 0)
sense.set_pixel(3+x, 3, 255, 0, 0)
sense.set_pixel(3, 3+x, 255, 0, 0)
sleep(0.5)
sense.clear()

while True:
firework_head()

Ensuite, nous avons besoin des flammes de la fusée qui sortent du sol! Il s’agit d’une autre routine qui commence à (7,3) qui est à peu près au milieu et se déplace vers le milieu avant de s’arrêter. Le feu des fusées est un peu orange, alors allons-y (255, 100, 0) comme couleur de pixel. Et le feu laisse une trace dans le ciel, nous pouvons donc laisser notre LED allumée après chaque étape.

def firework_tail():
for x in range(4):
sense.set_pixel(3, 7-x, 255, 100, 0)
sleep(0.5)

while True:
firework_tail()
sense.clear()

Alors maintenant, nous avons une queue et une tête, nous pouvons combiner ces deux fonctions pour créer une fonction de feu d’artifice.

def firework():
firework_tail()
firework_head()
sense.clear()
sleep(0.5)

while True:
firework_tail()
firework_head()
sense.clear()
sleep(0.5)

Placement aléatoire de feux d’artifice

À moins que vous ne soyez à un affichage planifié super professionnel avec beaucoup de feux d’artifice, ils ne se retrouvent pas toujours dans le même ciel, donc même si nos feux d’artifice sont sympas, ce serait bien s’ils étaient un peu plus aléatoires. Permet donc de mettre un peu de hasard dans nos feux d’artifice.

Nous avons besoin d’un peu de code supplémentaire à ajouter à l’instruction d’importation pour nous permettre d’utiliser des nombres aléatoires:

from random import randint

Et maintenant, nous allons modifier nos fonctions firework, firework_head et firework_tail pour inclure un positionnement aléatoire.

def firework_head(i, j):
for x in range(4):
sense.set_pixel(i-x, j, 255, 0, 0)
sense.set_pixel(i, j-x, 255, 0, 0)
sense.set_pixel(i+x, j, 255, 0, 0)
sense.set_pixel(i, j+x, 255, 0, 0)
sleep(0.5)
sense.clear()

def firework_tail(i, j):
for x in range (7, j, -1):
sense.set_pixel(i, x, r, g, b)
sleep(0.5)

def firework():
i = randint(0, 7)
j = randint(0, 4) # Explode our fireworks in the sky, we'd hate to hit the crowd between 5-7.
firework_tail(i, j)
firework_head(i, j)
sleep(0.5)

while True:
firework()
sense.clear()
sleep(0.5)

Si nous exécutons ce script pendant un petit moment, cela pourrait bien fonctionner, mais tout d’un coup, nous obtiendrons une erreur du Pi et tout s’arrêtera.

ValueError('Y position must be between 0 and 7')

Nos feux d’artifice ne peuvent pas exploser au-delà de l’endroit où la foule peut voir les feux d’artifice, nous devons donc nous assurer de vérifier que notre explosion se trouve dans notre réseau de LED chaque fois que nous allons exploser. Chacune des commandes sense.set_pixel dans firework_head a besoin d’une instruction if pour vérifier que nous demandons un bon emplacement d’explosion.

def firework_head(i, j):
for x in range(4):
if(i-x >= 0): sense.set_pixel(i-x, j, 255, 0, 0)
if(j-x >= 0): sense.set_pixel(i, j-x, 255, 0, 0)
if(i+x <= 7): sense.set_pixel(i+x, j, 255, 0, 0)
if(j+x <= 7): sense.set_pixel(i, j+x, 255, 0, 0)
sleep(0.5)
sense.clear()

Maintenant, si nous exécutons notre script, nous obtenons un bel ensemble de feux d’artifice rouge partout dans le ciel.

Feux d’artifice de couleur aléatoire

Les feux d’artifice que nous allons tous ont beaucoup de feux d’artifice de couleurs différentes, alors faisons aussi de nos feux d’artifice une couleur aléatoire. Nous pouvons ajouter des générateurs de nombres aléatoires à chacune des couleurs firework_head entrant dans sense.set_pixel:

def firework_head(i, j, r, g, b):
for x in range(4):
if(i-x >= 0): sense.set_pixel(i-x, j, 255, 0, 0)
if(j-x >= 0): sense.set_pixel(i, j-x, 255, 0, 0)
if(i+x <= 7): sense.set_pixel(i+x, j, 255, 0, 0)
if(j+x <= 7): sense.set_pixel(i, j+x, 255, 0, 0)
sleep(0.5)
sense.clear()

def firework_tail(i, j):
for x in range (7, j, -1):
sense.set_pixel(i, x, 255, 100, 0)
sleep(0.5)

def firework():
i = randint(0, 7)
j = randint(0, 4) # Explode our fireworks in the sky, we'd hate to hit the crowd between 5-7.
r = randint(1, 255) # 0 is off so we don't want blank fireworks, lets start at 1.
g = randint(1, 255)
b = randint(1, 255)
firework_tail(i, j)
firework_head(i, j, r, g, b)
sleep(0.5)

while True:
firework()
sense.clear()
sleep(0.5)

Fin de notre affichage

La dernière chose à faire est d’obtenir que notre écran lance plus d’un feu d’artifice à la fois. Pour cela, nous allons utiliser le filetage.

En ce moment, nous déclenchons un feu d’artifice et attendons que notre feu d’artifice explose et disparaisse avant de déclencher le prochain feu d’artifice. C’est ok, mais normalement les feux d’artifice se déclenchent tous à des moments différents, ou en bouquets pour remplir le ciel de jolies couleurs.

Le filetage nous permet de déclencher un feu d’artifice dans un fil et de déclencher immédiatement un autre feu d’artifice dans un autre fil avant d’attendre la fin du premier. Pour cela, nous avons besoin d’une autre bibliothèque. Ajoutez donc à l’instruction d’importation en haut du fichier:

import threading

Et maintenant, nous ne pouvons plus utiliser sense.clear () dans nos boucles firework_head, firework_tail et main while car cela effacera tous les feux d’artifice qui explosent pendant que nous en déclenchons un autre. Nous devons donc ajouter quelques routines bien rangées supplémentaires à notre script, ce qui vient juste ranger le feu d’artifice qui est déclenché dans notre fil.

def firework_head(i, j, r, g, b):
for x in range(4):
if(i-x >= 0): sense.set_pixel(i-x, j, 255, 0, 0)
if(j-x >= 0): sense.set_pixel(i, j-x, 255, 0, 0)
if(i+x <= 7): sense.set_pixel(i+x, j, 255, 0, 0)
if(j+x <= 7): sense.set_pixel(i, j+x, 255, 0, 0)
sleep(0.5)
tidy_head(i, j, x)

def firework_tail(i, j):
for x in range (7, j, -1):
sense.set_pixel(i, x, 255, 100, 0)
sleep(0.5)
tidy_tail(i, j)

def tidy_tail(i, j):
for x in range(7, j, -1):
sense.set_pixel(i, x, 0, 0, 0)

def tidy_head(i, j, x):
if(i-x >= 0): sense.set_pixel(i-x, j, 0, 0, 0)
if(j-x >= 0): sense.set_pixel(i, j-x, 0, 0, 0)
if(i+x <= 7): sense.set_pixel(i+x, j, 0, 0, 0)
if(j+x <= 7): sense.set_pixel(i, j+x, 0, 0, 0)

def firework():
i = randint(0, 7)
j = randint(0, 4) # Explode our fireworks in the sky, we'd hate to hit the crowd between 5-7.
r = randint(1, 255) # 0 is off so we don't want blank fireworks, lets start at 1.
g = randint(1, 255)
b = randint(1, 255)
firework_tail(i, j)
firework_head(i, j, r, g, b)
sleep(0.5)

while True:
thread = threading.Thread(target=firework)
thread.start()
sleep(2)

Le dernier bit à l’intérieur de la boucle while est le bit important. Maintenant, nous avons un fil qui est dit “faites-moi un feu d’artifice s’il vous plaît”, il y a une pause et puis un autre fil est démarré avec un autre feu d’artifice.

Vous devriez pouvoir voir 3 ou 4 feux d’artifice se déclencher parfois en même temps! Réduire le sommeil de 2 secondes à la fin de la boucle True fera faire apparaître plus de feux d’artifice dans le ciel!

Suppléments

Nous avons un script complet sur notre GitHub avec quelques éléments supplémentaires tels que la décoloration des couleurs pour les feux d’artifice, les contrôles de vitesse pour l’affichage et des commandes de bibliothèque supplémentaires pour exécuter cela sur l’émulateur Sense Hat.

J’espère que vous avez tous une fabuleuse nuit de feu de joie, restez en sécurité si vous sortez sur un grand écran et dites-nous si vous construisez des feux d’artifice électroniques intérieurs comme le nôtre!

Articles similaires

Bouton retour en haut de la page
Fermer