Capteur de luminosité
Le projet
Le projet consiste à créer un motif lumineux sur la grille de DEL de la carte micro:bit. La nature du motif et l’intensité des DEL dépendra de la lumière ambiante: l’affichage sera plus lumineux si l’environnement est sombre.
Prise en main du capteur
Pour ce projet, le panneau de DEL peut être utilisé en capteur de luminosité basique en inversant la polarisation des DEL.
Celles-ci sont alors utilisées comme capteur de lumière.
Le capteur de lumière de la micro:bit mesure la lumière dans une gamme allant de 0 (très sombre) à 255 (très lumineuse).
La mesure du niveau de luminosité passe par la commande ci-dessous.
from microbit import *
display.read_light_level()
On peut stocker cette valeur dans une variable, par exemple:
from microbit import *
lumi = display.read_light_level()
Il est possible d’afficher la valeur mesurée. En respectant une pause entre 2 valeurs mesurées cela donne:
from microbit import *
while True:
lumi = display.read_light_level()
display.scroll(lumi)
sleep(100)
Version 1 du projet: Seuil de lumière
Ajouter des branchements sur la variable
lumi
dans le programme pour actionner un smiley qui depend de la mesure (clarté/obscurité).
-
Il faudra prévoir un seuil de luminosité pour basculer d’un smiley à un autre smiley.
-
Et mettre l’ensemble dans une boucle
while True:
, comme par exemple:
# script 1
from microbit import *
while True:
lumi = display.read_light_level()
if lumi ... ...:
...
else:
...
La surface de DEL alterne alors entre mesure d’intensité et affichage. D’où le clignottement.
Question a: Programmez la premiere version de ce projet, appelée *script 1. Recopier le script sur votre feuille.
Version 2 du projet: afficher une forme personnalisée
On peut fabriquer nos propres images à partir de chaine de caractère utilisant des chiffres de 0 à 9.
Le script suivant donne un carré de plus forte intensité:
from microbit import *
motif = '99999:90009:90009:90009:99999:'
img = Image(motif)
display.show(img)
Le script suivant donne un carré de plus faible intensité:
from microbit import *
motif = '11111:10001:10001:10001:11111:'
img = Image(motif)
display.show(img)
Adapter le script 1 pour afficher un carré très lumineux lorsqu’il fait sombre, ou faiblement lumineux lorsqu’il fait clair. Appeler ce nouveau script: script 2
Question b: Concevoir et tester le script 2. Recopier le script sur votre feuille.
Version 3: Affichage d’intensité variable
L’intensité lumineuse du motif affiché dépend de la valeur attribuée à chaque pixel:
- ‘99999:90009:90009:90009:99999:': motif d’intensité forte
- ‘33333:30003:30003:30003:33333:’ motif d’intensité intermédiaire
- ‘11111:10001:10001:10001:11111:': motif d’intensité faible
On peut créer une chaine de caractères en fonction d’une variable I
qui varie de 0 à 9 et qui dessine un motif carré. Les 2 premieres lignes du motif sont construites à partir de:
motif = str(I + I + I + I + I + ":" + I + "000" + I + ":")
La valeur de I
sera calculée d’après la variable lumi
selon la loi:
I = int((255 - lumi)/255*9)
Le programme principal du script 3 (à compléter) sera alors:
while True:
lumi = display.read_light_level()
I = ...
motif = ...
img = Image(...)
display.show(img)
Afficher avec le script 3 un carré dont l’intensité lumineuse varie entre 0 et 9 selon l’intensité lumineuse mesurée. Tester et mettre au point le programme.
Question c: Recopier sur votre feuille le script 3.
Prolongement 1: utiliser des fonctions
Le script 3 peut être amélioré en utilisant des fonctions. Le programme principal:
while True:
lumi = display.read_light_level()
I = intensite(lumi)
motif = carre(I)
img = Image(motif)
display.show(img)
Ajouter les definitions des fonctions
intensite
etcarre
au script 3. Appeler ce nouveau script: le script 4.
Aides:
- La fonction
intensite
retourne une valeur de 0 à 9 selon la variablelumi
en argument:
def intensite(lumi):
"""retourne une valeur de 0 a 9
9 <=> lumi = 0
0 <=> lumi = 255
Exemples:
>>> I = intensite(255)
>>> print(I)
0
>>> I = intensite(0)
>>> print(I)
9
"""
return int((255 - lumi)/255*9)
- La fonction
carre
qui prendra en paramètre la valeurI
, retourne une chaine de caractères dans le bon format pour dessiner les contours d’un carré vide en son centre.
def carre(I):
"""
>>> carre(9)
'99999:90009:90009:90009:99999:'
>>> carre(1)
'11111:10001:10001:10001:11111:'
>>> carre(5)
'55555:50005:50005:50005:55555:'
"""
return ... ... ...
Question d: Programmez et testez le script 4. Recopiez le sur votre feuille.
Prolongement 2: motif animé
On pourra remplacer l’image fixe par une animation. Il faudra alterner avec 3 images successives, et attendre un delai de 100ms entre chaque. Utiliser pour cela la fonction sleep(100)
entre chaque affichage.
Et ajuster l’intensité lumineuse du motif affiché selon l’éclairage mesuré (voir script 4).
Documentation
- TP inspiré du document de Formation_Microbit_Lycee