This shows you the differences between two versions of the page.
sde2:laboratoare:02_microbit_fr [2021/03/17 11:13] alexandra.state2607 [Input devises ou butons] |
sde2:laboratoare:02_microbit_fr [2021/03/24 10:43] (current) ioana_maria.culic [TP 3 - Set up BBC micro:bit] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== TP 3 - Set up BBC micro:bit ====== | + | ====== TP 03 - Set up BBC micro:bit ====== |
==== Support pour TP ==== | ==== Support pour TP ==== | ||
Line 46: | Line 46: | ||
</code> | </code> | ||
- | Pour accéder le simulateur si vous utilisez Linux ou MacOS, tapez la commande: | + | Pour accéder le simulateur ouvrir un browser et ouvrez: ''http://localhost:8000/editor.html'' |
- | <code> | + | |
- | $ firefox editor.html | + | |
- | </code> | + | |
- | Si vous utilisez Windows, vous pouvez soit utiliser la commande précédente, soit aller dans le dossier "PythonEditor" et cliquer sur "editor.html". | ||
Pour simuler le code, cliquez sur "Sim". Testez l '** Exemple 1 ** du section suivante. | Pour simuler le code, cliquez sur "Sim". Testez l '** Exemple 1 ** du section suivante. | ||
Line 112: | Line 108: | ||
{{ :sde2:laboratoare:flash.png?250 | }} | {{ :sde2:laboratoare:flash.png?250 | }} | ||
- | <hidden> | + | <note> |
- | =====Input devises ou butons ===== | + | Pour visualiser les messages imprimés dans la console, nous devons sélectionner l'option '' Open Serial '', qui va ouvrir le terminal avec l'interpréteur du Python. |
- | Dans le schéma du microcontrôleur présenté ci-dessus, on peut voir que le [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_fr?&#le_microphone_et_le_speaker|micro:bit]] a trois boutons. | + | </note> |
- | Le bouton au dos est pour **reset**. Si, ce bouton est appuie pour cinq secondes, le microcontrôleur arrêtera d’exécuter le programme chargé. En même temps, si le bouton de reset est pressé brièvement, le programme qui fait flash sur la carte sera réinitialisé. | + | ===== Programmes en Python ===== |
+ | <note warning> | ||
+ | La plupart des langages de programmation tels que C,C++,Java, utilisent les accolades {} pour définir les blocs de code. Contrairement à cette convention, Python utilise **l'indentation** pour séparer les différentes séquences. | ||
- | Sur le devant du dispositif il y a deux butons A et B, qui peut-être accéder dans le code avec //buton_a// et //button_b//. Ces boutons ont une méthode is_pressed(), qui va retourne //True// si le bouton est appuyé, si non la méthode va retourne //False//. | + | Un bloc de code (corps d'une fonction, contenu d'une boucle) commence avec la première ligne indentée et se finit lorsqu'on arrive à la première ligne qui ne respecte plus l'indentation. L'indentation doit etre consistente à l'intérieur d'un certain bloc. |
- | Dans cet exemple on va utilise le conditionnel "if". | + | Il faut tenir compte aussi du fait que si on a une ligne qui se termine par **:**, il est absolument nécessaire que la suivante soit indentée. |
+ | |||
+ | En général, on préfère un TAB pour l'indentation: | ||
<code python> | <code python> | ||
- | # Simple decision | + | for i in range(1,11): |
+ | print(i) | ||
+ | if i == 5: | ||
+ | break | ||
+ | </code> | ||
+ | |||
+ | </note> | ||
+ | |||
+ | ===== Variables ===== | ||
+ | Contrairement aux autres langages de programmation, en Python il ne faut pas déclarer les variables ou leur type avant de les utiliser. De ce point de vue, Python fait partie de la catégorie des langages de programmation dynamiquement typés, où le type des variables n'est interpété qu'au moment de l'exécution. | ||
+ | |||
+ | === Variables numériques === | ||
+ | |||
+ | Python supporte 2 types numériques: entiers et réels. | ||
+ | |||
+ | <code python> | ||
+ | # Syntaxe pour déclarer un numéro entier: | ||
+ | myInt = 7 | ||
+ | |||
+ | # Syntaxe pour déclarer un numéro réel: | ||
+ | myFloat = 7.0 | ||
+ | myFloat = float(7) | ||
+ | </code> | ||
+ | |||
+ | === Variables pour des chaînes de caractères === | ||
+ | |||
+ | <code python> | ||
+ | myString = 'hello' | ||
+ | myString = "hello" | ||
+ | </code> | ||
+ | |||
+ | On peut réaliser l'attribution des valeurs aux plusieurs variables simultanément, mais sans mélanger les valeurs numériques avec les strings: | ||
+ | |||
+ | <code python> | ||
+ | # Instructions valides | ||
+ | a, b = 1, 2 | ||
+ | suma = a + b | ||
+ | </code> | ||
+ | |||
+ | <code python> | ||
+ | # Instructions valides | ||
+ | hello = "hello" | ||
+ | world = "world" | ||
+ | message = hello + " " + world | ||
+ | </code> | ||
+ | |||
+ | <code python> | ||
+ | # Cela ne va pas fonctionner | ||
+ | |||
+ | one = 1 | ||
+ | two = 2 | ||
+ | three = 3 | ||
+ | hello = "hello" | ||
+ | |||
+ | print (one + two + three + hello) | ||
+ | </code> | ||
+ | |||
+ | <note important> | ||
+ | Pour pouvoir afficher le résultat de la concaténation précédente, on peut utiliser la fonction //str//, qui réalise la conversion des variables numériques dans des variables de type string: | ||
+ | |||
+ | <code python> | ||
+ | one = 1 | ||
+ | two = 2 | ||
+ | three = 3 | ||
+ | hello = "hello" | ||
+ | |||
+ | print ( str(one) + str(two) + str(three) + hello ) | ||
+ | </code> | ||
+ | |||
+ | </note> | ||
+ | |||
+ | ===== Structures de données ===== | ||
+ | |||
+ | === Listes === | ||
+ | |||
+ | Les listes sont similaires aux array. Elles peuvent contenire n'importe quel type de variables et le nombre des éléments n'est pas limité. | ||
+ | |||
+ | <note warning> | ||
+ | Même si Python permettre d' ajouter des éléments de différents types dans la même liste, c'est recommandé de ne faire pas cela, car il peut arriver plusieurs erreurs dans votre programme. | ||
+ | </note> | ||
+ | |||
+ | Pour créer une liste qui contient des éléments de type entier on va utilise la suivante ligne de code: | ||
+ | |||
+ | <code python> | ||
+ | myList = [1,2,3,4,5] | ||
+ | </code> | ||
+ | |||
+ | On peut créer une liste vide, auquel on va ajouter des éléments: | ||
+ | |||
+ | <code python> | ||
+ | # Déclaration de la liste | ||
+ | |||
+ | mylist = [] | ||
+ | |||
+ | # Insertion des éléments | ||
+ | |||
+ | mylist.append(1) | ||
+ | mylist.append(2) | ||
+ | mylist.append(3) | ||
+ | </code> | ||
+ | |||
+ | En extraire un élément d'une liste on va utiliser une construction de type ''liste[indice]'': | ||
+ | |||
+ | <code python> | ||
+ | mylist = [1,2,3] | ||
+ | |||
+ | # On affiche chaque élément | ||
+ | |||
+ | print( mylist[0] ) | ||
+ | print( mylist[1] ) | ||
+ | print( mylist[2] ) | ||
+ | |||
+ | # Output | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | </code> | ||
+ | |||
+ | <note> | ||
+ | Comme dans tous les autres langages de programmation, les éléments d'une liste sont indexés en commençant par 0. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | == Function range == | ||
+ | |||
+ | <note warning> | ||
+ | Les informations du cette section peut être applique seulement pour l'utilisation du Python pour micro:bit. | ||
+ | </note> | ||
+ | |||
+ | Pour créer une liste avec des éléments entiers, on va utiliser la fonction ''range'', qui va retourne une liste avec toutes les numéros entiers d'un certain intervalle. La fonction a la suivante définition: ''range(start, stop, pas)'', où start est la première valeur dans la liste, ''stop'' est la valeur d'arrêter (la valeur n'est pas incluse), ''pas'' est le pas d' incrémentation et est un paramétré optionnel (la valeur défauts est 1). | ||
+ | |||
+ | **Exemple** | ||
+ | |||
+ | Pour créer une liste avec des valeurs paires de 2 a 12, on va avoir la suivante ligne de code: | ||
+ | |||
+ | <code python> | ||
+ | mylist = range (2, 13, 2) | ||
+ | </code> | ||
+ | |||
+ | == Fonctions prédéfinies pour la gestion des listes == | ||
+ | * [[https://www.tutorialspoint.com/python/list_cmp.htm|cmp( listName1, listName2)]] -> comparer les éléments des 2 listes | ||
+ | * [[https://www.tutorialspoint.com/python/list_len.htm|len( listName ) ]] -> numéro des éléments de la liste | ||
+ | * [[https://www.tutorialspoint.com/python/list_max.htm|max( listName )]] -> l'élément ayant la valeur maximale | ||
+ | * [[https://www.tutorialspoint.com/python/list_min.htm|min( listName )]] -> l'élément ayant la valeur minimale | ||
+ | |||
+ | == Méthodes prédéfinies pour la gestion des listes == | ||
+ | * [[https://www.tutorialspoint.com/python/list_append.htm|listName.append( element )]] -> insérer un élément a la fin de la liste | ||
+ | * [[https://www.tutorialspoint.com/python/list_count.htm|listName.count( element )]] -> nombre d'occurrences de l'élément dans la liste | ||
+ | * [[https://www.tutorialspoint.com/python/list_index.htm|listName.index( element )]] -> index de la première occurrence de l'élément dans la liste | ||
+ | * [[https://www.tutorialspoint.com/python/list_insert.htm|listName.insert( index, element )]] -> insertion de l'élément à l'index indiqué dans la liste | ||
+ | * [[https://www.tutorialspoint.com/python/list_pop.htm|listName.pop()]] -> supprime et renvoie le dernier élément de la liste | ||
+ | * [[https://www.tutorialspoint.com/python/list_remove.htm|listName.remove( element )]] -> supprime le dernier élément de la liste | ||
+ | * [[https://www.tutorialspoint.com/python/list_reverse.htm|listName.reverse()]] -> inverser l'ordre des éléments dans la liste | ||
+ | * [[https://www.tutorialspoint.com/python/list_sort.htm|listName.sort( [function] )]] -> trier les éléments de la liste selon la fonction indiquée | ||
+ | |||
+ | === Dictionnaires === | ||
+ | Un dictionnaire est une structure de données, similaire aux vecteurs ou aux listes, mais fonctionne avec des valeurs et des clés au lieu des indices. Chaque valeur stockée dans un dictionnaire peut être accessible à l'aide d'une clé, représentée par n'importe quel type d'objet (une chaîne, un nombre, une liste, etc.), au lieu d'utiliser un index pour l'adresser. | ||
+ | |||
+ | Par exemple, les dictionnaires peuvent être utiles pour implémenter des bases de données. Supposons que nous ayons une base de données d'étudiants et que nous devons retenir la spécialisation pour laquelle chacun d'entre eux a opté. | ||
+ | |||
+ | **Déclarer un dictionnaire** | ||
+ | |||
+ | <code python> | ||
+ | specialisation = {} | ||
+ | |||
+ | specialisation["Ana"] = "Informatique" | ||
+ | specialisation["Radu"] = "Electronique" | ||
+ | </code> | ||
+ | |||
+ | Ou bien | ||
+ | <code python> | ||
+ | specialisation = { | ||
+ | "Ana": "Informatique", | ||
+ | "Radu": "Electronique" | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | **Parcourir les éléments d'un dictionnaire** | ||
+ | |||
+ | <code python> | ||
+ | for nom, spec in specialisation.iteritems(): | ||
+ | print ("Le nom de l'optionel ou {} a été répartisé est: {}".format(nom, spec)) | ||
+ | </code> | ||
+ | |||
+ | ** Eliminer des valeurs d'un dictionnaire** | ||
+ | |||
+ | <code python> | ||
+ | del optionalRepartizare["Ana"] | ||
+ | |||
+ | # ou | ||
+ | |||
+ | optionalRepartizare.pop("Ana") | ||
+ | </code> | ||
+ | |||
+ | ** Propriétés des clés dans un dictionnaire ** | ||
+ | |||
+ | Dans un dictionnaire, on n'a pas de restrictions pour les valeurs, mais les clés doivent etre uniques. Au cas ou on ne respecte pas cette propriété et on a 2 entrées ayant la meme clé, seulement le dernier enregistrement va rester valide. | ||
+ | Par exemple, pour la suivante séquence de code: | ||
+ | |||
+ | <code python> | ||
+ | age = { | ||
+ | "Ana" : 14, | ||
+ | "Ioana" : 13, | ||
+ | "Ana" : 16, | ||
+ | "Ioana" : 22, | ||
+ | "Ana" : 11 | ||
+ | } | ||
+ | |||
+ | print ("Ana a {} années et Ioana a {} années.".format(age["Ana"], age["Ioana"])) | ||
+ | |||
+ | </code> | ||
+ | |||
+ | On va afficher le message suivant: "Ana a 11 années et Ioana a 22 années." | ||
+ | |||
+ | == Fonctions utiles pour les dictionnaires == | ||
+ | |||
+ | * [[https://www.tutorialspoint.com/python/dictionary_cmp.htm|cmp(dictionarUnu, dictionarDoi)]] -> comparer les éléments des 2 dictionnaires | ||
+ | * [[https://www.tutorialspoint.com/python/dictionary_len.htm|len(numeDictionar)]] -> numéro des éléments d'un dictionnaire | ||
+ | * [[https://www.tutorialspoint.com/python/dictionary_str.htm|str(numeDictionar)]] -> génère une version facile a afficher du dictionnaire | ||
+ | |||
+ | == Méthodes utiles pour les dictionnaires == | ||
+ | |||
+ | *[[https://www.tutorialspoint.com/python/dictionary_clear.htm|numeDictionar.clear()]] -> éliminer toutes les éléments du dictionnaire | ||
+ | * [[https://www.tutorialspoint.com/python/dictionary_copy.htm|numeDictionar.copy()]] -> retourne une copie du dictionnaire | ||
+ | * [[https://www.tutorialspoint.com/python/dictionary_get.htm|numeDictionar.get(key, default=None)]] -> la valeur contenue dans le dictionnaire pour la cle "key", ou la valeur "default" sinon | ||
+ | * [[https://www.tutorialspoint.com/python/dictionary_has_key.htm|numeDictionar.has_key(key)]] -> "true" s'il y a un enregistrement avec la clé indiquée et "false" sinon | ||
+ | * [[https://www.tutorialspoint.com/python/dictionary_items.htm|numeDictionar.items()]] -> une liste avec toutes les paires du type (clé, valeur) qui se trouvent dans le dictionnaire | ||
+ | * [[https://www.tutorialspoint.com/python/dictionary_keys.htm|numeDictionar.keys()]] -> liste des clés | ||
+ | * [[https://www.tutorialspoint.com/python/dictionary_update.htm|dictionar1.update(dictionar2)]] -> ajoute le contenu du dictionnaire //dictionar2// dans le dictionnaire //dictionar1// | ||
+ | * [[https://www.tutorialspoint.com/python/dictionary_values.htm|numeDictionar.values()]] -> liste avec toutes les valeurs stockées dans le dictionnaire | ||
+ | |||
+ | ===== La structure de décision "if" ====== | ||
+ | |||
+ | <code python> | ||
+ | # Décision simple | ||
a = 33 | a = 33 | ||
b = 200 | b = 200 | ||
Line 132: | Line 367: | ||
<code python> | <code python> | ||
- | # Use "elif" to add an additional condition | + | # Utiliser elif pour ajouter une condition supplémentaire |
a = 33 | a = 33 | ||
b = 33 | b = 33 | ||
Line 142: | Line 378: | ||
<code python> | <code python> | ||
- | # The "else" keyword takes anything that has not been included before | + | # Le mot clé else prend tout ce qui n'a pas été inclus avant |
a = 200 | a = 200 | ||
b = 33 | b = 33 | ||
Line 154: | Line 391: | ||
<code python> | <code python> | ||
- | # Else without elif | + | # Else sans elif |
a = 200 | a = 200 | ||
b = 33 | b = 33 | ||
Line 161: | Line 399: | ||
else: | else: | ||
print("b is not greater than a") | print("b is not greater than a") | ||
- | </code> | + | </code> |
+ | ===== Les structures répétitives ===== | ||
- | ===Exemple 2=== | + | === La boucle "for" === |
- | Le programme suivant va afficher sur l'écran du micro:bit la lettre "A" si le bouton A etre appuie, repsectivment la lettre "B" si le buton B va atre appuye. Si aucun button va etre appuye, sur l'ecran on va avoir une image avec un émoticône confuse. | + | Contrairement aux autres langages, qui ont la forme standard **for(...) { code }** pour la boucle //for//, Python élimine les parantheses qui marquent l'itération d'une liste et utilise les **:** pour indiquer le début du bloc de code qui sera exécuté a l'intérieur de la boucle, comme dans l'exemple suivant: |
+ | <code python> | ||
+ | listaDeNume = ["Ana", "Maria", "Ioana", "Irina", "Andreea", "Cristina"] | ||
+ | |||
+ | for nume in listaDeNume: | ||
+ | print (nume) | ||
+ | </code> | ||
- | Le programme suivant va afficher sur l'écran du micro:bit la lettre "A" si le bouton A été appuyé, respectivement la lettre "B" si le bouton B été appuyé. Si aucun bouton sera appuyé, sur l'écran on va avoir une image avec une émoticône confuse. | + | En Python, l'indice du pas ou l'on se trouve a chaque moment lorsqu'on parcourt une séquence n'est pas visible. Cependant, il y a une méthode pour compter les pas: la fonction **enumerate**: |
<code python> | <code python> | ||
- | from microbit import display, button_a, button_b, Image | + | cours= [ "Analyse", "SdE", "ALF"] |
+ | |||
- | while True: #infinite looop | + | for index, hobby in enumerate(cours): |
- | if button_a.is_pressed(): #check if the button A is pressed | + | print (index, hobby) |
- | display.scroll("A") | + | |
- | elif button_b.is_pressed(): #check if the button B is pressed | + | # Output: |
- | display.scroll("B") | + | 0 Analyse |
+ | 1 SdE | ||
+ | 2 ALF | ||
+ | </code> | ||
+ | |||
+ | Une autre fonctionnalité est l'utilitaire **zip**, qui permet de parcourir 2 listes simultanément: | ||
+ | |||
+ | <code python> | ||
+ | lista1 = [ 3, 9, 17, 15, 19] | ||
+ | lista2 = [ 2, 4, 30, 24, 3] | ||
+ | |||
+ | for a, b in zip( lista1, lista2 ): | ||
+ | if a > b: | ||
+ | print (a) | ||
else: | else: | ||
- | display.show(Image.CONFUSED) | + | print (b) |
+ | |||
+ | # Output: | ||
+ | |||
+ | 3 | ||
+ | 9 | ||
+ | 30 | ||
+ | 24 | ||
+ | 19 | ||
</code> | </code> | ||
- | </hidden> | ||
- | =====L'accéléromètre. Des gestes ===== | ||
- | Micro:bit est capable de reconnaître des gestes comme l'inclination ou la secousse. Au dos du microcontrôleur, en bas, il a un chip petit, qui représenter l'accéléromètre, il s' appelle [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_fr?&#le_microphone_et_le_speaker|"Compass and Accelerometer”]]. Cela peut mesurer l'accélération dans toutes les trois dimensions, comme l'accélération gauche-droite, l'accélération avant-arrière et l'accélération haut-bas. | + | Une autre particularité du langage Python est le fait qu'on peut appliquer la condition //"else"// aussi pour la boucle //"for"//. Dans ce cas, la branche "else" sera executée après la boucle "for", si et seulement si à l'intérieur de "for" on n'a pas une déclaration de type "break". |
+ | Par exemple: | ||
- | Qu'est-ce qu'un accéléromètre? Un accéléromètre a le but de mesurer et analyser des accélérations linaires et angulaires, par exemple, les voitures modernes utilisent un accéléromètre qui détecte un accident pour déployer des airbags. | + | <code python> |
+ | listeAnimaux = [ "loup", "lapin", "lion", "ours" ] | ||
- | ===Exemple 3=== | + | for i in listeAnimaux: |
+ | print (i) | ||
+ | if i == "lapin" | ||
+ | print ("Le lapin n'est pas sauvage") | ||
+ | break | ||
+ | else: | ||
+ | print ("Tous les animaux!") | ||
+ | |||
+ | # Output | ||
+ | loup | ||
+ | lapin | ||
+ | Le lapin n est pas sauvage | ||
- | Dans cet exemple on va utilise l'accéléromètre en affichant sur l'écran du micro:bit une carre s’il est incline vers gauche, un triangle s’il est incline vers droite et un diamant s’il | + | #Si on execute la sequence suivante: |
- | il est mis face haut. | + | for i in listeAnimaux: |
+ | print (i) | ||
+ | if i == "lapin" | ||
+ | print ("Le lapin n'est pas sauvage") | ||
+ | else: | ||
+ | print ("Tous les animaux!") | ||
+ | |||
+ | # Output | ||
+ | loup | ||
+ | lapin | ||
+ | Le lapin n est pas sauvage | ||
+ | lion | ||
+ | ours | ||
+ | Tous les animaux! | ||
+ | </code> | ||
+ | |||
+ | === La boucle "while" === | ||
<code python> | <code python> | ||
- | from microbit import display, accelerometer, Image | + | #Afficher les chiffres de 0 a 9 |
+ | count = 0 | ||
+ | |||
+ | while count < 10: | ||
+ | print (count) | ||
+ | count = count + 1 | ||
+ | </code> | ||
+ | |||
+ | Comme pour la boucle "for" on a aussi la possiblité d'appliquer la condition "else" a la boucle "while". La différence est que le bloc "else" sera exécuté chaque fois que la condition de la structure répétitive sera évaluée comme fausse: | ||
+ | |||
+ | <code python> | ||
+ | print ("Dévinez de numéro de l'intervalle [ 1, 10 ]") | ||
+ | |||
+ | monNr = 7 | ||
+ | votreNr = 0 | ||
+ | |||
+ | while votreNr!= monNr: | ||
+ | votreNr = int( input("Choisissez. ") ) | ||
+ | else: | ||
+ | print ("Félicitations!") | ||
+ | </code> | ||
+ | |||
+ | === Déclarations "break" et "continue" === | ||
+ | |||
+ | L'instruction //"break"// est utilisée pour sortir d'une structure répétitive, en étant une alternative pour la condition de sortie. Par exemple, on peut afficher les numéros de 0 a 9 de la facon suivante: | ||
+ | |||
+ | <code python> | ||
+ | count = 0 | ||
+ | |||
while True: | while True: | ||
- | if accelerometer.current_gesture() == "left": | + | print (count) |
- | display.show(Image.SQUARE) | + | count = count + 1 |
- | elif accelerometer.current_gesture() == "right": | + | if count > 10: |
- | display.show(Image.TRIANGLE) | + | break |
- | elif accelerometer.current_gesture() == "face up": | + | |
- | display.show(Image.DIAMOND) | + | |
- | else: | + | |
- | display.clear() | + | |
</code> | </code> | ||
- | =====Les direction. La boussole ===== | + | La déclaration //"continue"// est utilisée pour ignorer un bloc d'instructions. Par exemple, on peut l'utiliser pour afficher les nombres pairs de 0 a 20: |
- | Le capteur pour [[https://www.youtube.com/watch?v=a3P6LWwPBqM&feature=emb_logo| la boussole]] détecte les champs magnétiques de la Terre et est mis, aussi, au dos du micro:bit, comme l’accéléromètre. Cela est utilise pour détecter si un aimant est autotour de dispositif ou pour navigation, il peut montre les directions Nord, Sud, Est et Ouest. | + | <code python> |
+ | number = 0 | ||
+ | |||
+ | while number < 21: | ||
+ | if number % 2 == 1 | ||
+ | continue | ||
+ | print (number) | ||
+ | </code> | ||
+ | |||
+ | ===== Fonctions ===== | ||
- | ===Exemple 4=== | + | === Déclaration === |
- | Dans cet exemple on va voir comme le micro:bit peut-être utilise comme une boussole. __Attention__: Immédiatement après ont eu chargé le code sur le dispositif, vous devez attendre un peu jusqu’à sur l’écran il va apparaitre le texte suivant “TITLING FILL”. Puis, une LED sera affichée à son tour, vous devez incliner le micro:bit jusqu’à l’écran se va allume complétement. | + | |
<code python> | <code python> | ||
- | from microbit import display, compass | + | def myFunction(): |
- | compass.calibrate() | + | print ("Welcome") |
+ | |||
+ | # ou | ||
- | while True: | + | def simpleSum( a, b ): |
- | degrees = compass.heading() | + | return a + b |
- | if degrees < 45 or degrees > 315: | + | |
- | display.show('N') | + | |
- | elif degrees < 135: | + | |
- | display.show("E") | + | |
- | elif degrees < 225: | + | |
- | display.show("S") | + | |
- | elif degrees < 315: | + | |
- | display.show("W") | + | |
- | else: | + | |
- | display.show(' ') | + | |
</code> | </code> | ||
- | =====Le Microphone et le Speaker ===== | + | === Appel === |
+ | <code python> | ||
+ | myFunction() | ||
- | BBC micro:bit V2 a le microphone fixé à l'arrière et à la face, vous pouvez voir l'indicateur, qui s'allume lors de lui accès. Cela peut mesurer le niveau du son autotour de dispositif et il peut détecter les son haut ou plus bas. Aussi à l'arrière il y a sur [[https://www.allaboutcircuits.com/technical-articles/what-is-a-printed-circuit-board-pcb/|PCB]] un un haut-parleur(speaker) magnétique d’où provient le son comme output. | + | # ou |
- | ===Exemple 5=== | + | first = 1 |
- | Cet exemple va simule une bougie. Après l’importation des bibliothèques, est déclaré un compteur nommé //lit//, qui a initialement la valeur //True//. Après, on vérifie s’il y a été enregistré un son fort en utilisant la méthode//was_event()//, qui efface également l’historique des événements sonores avant de retour. Si la méthode va retourne //True// on va change la valeur du compteur //lut//. Dans le cas où la bougie est allumée une image simulant une bougie apparaîtra sur l’écran et qui va faire la flamme scintille à une position aléatoire de 1 à 3. | + | second = 1 |
+ | sum = simpleSum( first, second ) | ||
+ | print (sum) | ||
- | Pour créer une **image** il y a nécessaire de donner des valeurs pour chaque pixel de l'écran. La valeur 0 signifie que la LED est éteindre. Les valeurs 1 et 9(la valeur maximum) montre le niveau de luminosité du pixel. Pour représenter une ligne les valeurs sont entre "" et elle se finit avec //:// . Dans cet exemple , on peut voir que chaque ligne du //Image()// représente la position des LED sur l'écran physique du micro:bit. Par conséquent, en analysant la première ligne, qui suggère la flamme, toutes les LED sont éteintes sauf celle en position 3, qui a le pixel réglé sur la luminosité maximale. Les autres lignes sont similaires pour former le reste de la bougie, les positions 1 et 5, le pixel est réglé sur 0 et le reste sur 9. | + | print (simpleSum( first, second )) |
+ | </code> | ||
- | Pour créer le ** effet scintillement ** on utilise la méthode //set_pixel()//, qui a comme paramètres la ligne, la colonne et la valeur du pixel. | + | ===== Classes et Objets ===== |
+ | |||
+ | On appelle **objet** une encapsulation de variables et fonctions dans une seule entité, tandis qu'une **classe** représente un modèle pour la création des objets. Donc, in objet prend ses données d'une classe. | ||
<code python> | <code python> | ||
- | from microbit import display, microphone, SoundEvent, Image, sleep | + | # Classe simple |
- | import random | + | |
- | lit = True | + | class MaClasse: |
+ | variable = "Bonjour" | ||
+ | |||
+ | def maFonction(self): | ||
+ | print ("Bonjour de l'autre part!") | ||
- | while True: | + | |
- | if microphone.was_event(SoundEvent.LOUD): #check if a loud sound was | + | # Association classe objet |
- | lit = not lit | + | monObjet = MaClasse() |
- | sleep(500) | + | |
- | if lit: | + | |
- | display.show(Image( #candle image | + | # Afficher le contenu de la variable de MaClasse |
- | "00900:" | + | print (monObjet.variable) |
- | "09990:" | + | |
- | "09990:" | + | # Appeler la fonction maFonction, qui va afficher sur l'écran le message "Bonjour de l'autre part!" |
- | "09990:" | + | monObjet.maFonction() |
- | "09990")) | + | |
- | sleep(150) | + | |
- | flicker = random.randint(1, 3) | + | |
- | if flicker != 2: | + | |
- | display.set_pixel(2,0,0) | + | |
- | display.set_pixel(flicker,0,9) | + | |
- | sleep(150) | + | |
- | else: | + | |
- | display.clear() | + | |
</code> | </code> | ||
- | =====Capteur tactile ===== | + | <note important> |
+ | En Python **self** représente l'instance d'une classe, en étant identique a **this** de Java. En utilisant le mot-clé **self**, on peut accéder aux attributs et aux méthodes définis dans la classe. | ||
+ | </note> | ||
- | Micro:bit a un capteur tactile mis sur [[https://www.youtube.com/watch?v=spFD3SxxxHQ&feature=emb_logo|logo]], qui est utilise comme input. Il peut interagir avec l'utilisateur comme en utilisant bouton. | + | Le nombre d'objets qu'on peut créer a partir d'une classe n'est pas limité, tous les objets en héritant touts les particularités de la classe (variables et fonctions). Cependant, chaque objet contient des copies indépendantes des variables définies a l'interieur de la classe. Donc, si on crée un nouvel objet de la classe mere, on peut modifier son contenu sans affecter la definition initiale de la classe: |
- | ==== Exemple 6 ==== | + | <code python> |
- | Dans cet exemple on vérifie si le senseur est touche, dans ce cas on va afficher le message "Hello", si non, l’écran ne s’allumera pas. | + | |
+ | class MaClasse: | ||
+ | variable = "Bonjour" | ||
+ | |||
+ | def maFonction(self): | ||
+ | print ("Bonjour de l'autre part!") | ||
+ | |||
+ | monObjet1 = MaClasse() | ||
+ | monObjet2 = MaClasse() | ||
+ | |||
+ | monObjet2.variable = "au revoir" | ||
+ | |||
+ | print (monObjet1.variable) | ||
+ | print (monObjet2.variable) | ||
+ | |||
+ | #Output | ||
+ | bonjour | ||
+ | au revoir | ||
+ | </code> | ||
+ | |||
+ | ====== Fonctions mathématiques ===== | ||
+ | |||
+ | Pour pouvoir utiliser des fonctions qui exécutent des opérations mathématiques en Python, il faut importer et utiliser le module **math**. | ||
<code python> | <code python> | ||
- | from microbit import display, pin_logo | + | import math |
+ | </code> | ||
- | while True: | + | |
- | if pin_logo.is_touched(): | + | <note tip> |
- | display.scroll("Hello") | + | Chaque fonction de la bibliotheque math sera appelée de la façon suivante: |
- | else: | + | |
- | display.clear() #display stays empty | + | <code python> |
+ | math.functionName( params ) | ||
</code> | </code> | ||
- | ===== Capteur de température et de lumière ===== | + | Quelques fonctions élémentaires de ce type sont: **floor**, **ceil**, **pow**, **sqrt**. |
+ | </note> | ||
- | Le capteur de [[https://youtu.be/mrHn8eZ9eqg | température]] enregistre avec une approximation la température autour de micro:bit. Le capteur de [[https://youtu.be/ii0U_FMr-Z4|lumière]] peut enregistrer le niveau de lumière par les LED | + | <note tip> |
+ | Il y a aussi des fonctions prédéfinies qui ne doivent pas être importées d'un module auxiliaire. Elles sont appelées comme il suit: | ||
- | ==== Exemple 7 ==== | + | <code python> |
+ | functionName( params ) | ||
+ | </code> | ||
- | Dans l'exemple suivant on va afficher la température si le bouton A été appuyé. Si le micro:bit va enregistre la lumière fort sur l'écran va apparaitre une image de soleil. Pour tester le capteur de lumière, dans cet exemple vous pouvez prendre votre portable, allume la lampe de poche et mettre sa lumière vers le dispositif. | + | Quelques exemple de cette catégires sont: **abs**, **round**, **sum**. |
+ | </note> | ||
+ | |||
+ | <note important> | ||
+ | Une liste complète des fonctions mathématiques de Python peut être trouvée [[https://docs.python.org/2/library/math.html|ici]]. | ||
+ | </note> | ||
+ | |||
+ | ===== Lecture du clavier ===== | ||
+ | Comme l'entrée des données peut provenir du clavier en nombreuses situations, Python 3 fournit la fonction **input()**. Cette fonction peut recevoir aussi un parametre supplémentaire, qui sera le string affiché dans la ligne de commande au moment de la lecture des données nécessaires: | ||
<code python> | <code python> | ||
- | from microbit import display, button_a, Image, temperature | + | name = input("Quel est votre nom? ") |
+ | print("Bienvenue, " + name + "!") | ||
+ | </code> | ||
+ | <code bash> | ||
+ | # Output dans la ligne de commande | ||
+ | Quel est votre nom? "Ana" | ||
+ | Bienvenue, Ana! | ||
+ | </code> | ||
+ | |||
+ | <note important> | ||
+ | Exécuter l'exemple ci-dessus sur BBC micro:bit. Connectez la plaque et ouvrir l'éditeur du code. Connecter le micro:bit et puis appuyez //Flash//. Après quelques secondes vous devez ouvrir //Open Serial// clique sur l'icône. Vous avez avoir un output similaire avec celui ci-dessous. Maintenait, vous devez taper l'input. Pour revenir au vôtre code appuyez //Close Serial//. | ||
+ | |||
+ | {{ :sde2:laboratoare:open_serial.png?450 |}} | ||
+ | </note> | ||
+ | |||
+ | ===== Exceptions en Python ===== | ||
+ | |||
+ | En Python, on a 2 types d'erreurs: //erreurs de syntaxe// et //exceptions//. | ||
+ | |||
+ | Les **erreurs de syntaxe**, connues aussi sur le nom d'erreurs d'analyse (parsing error) sont les plus communes: | ||
+ | |||
+ | <code python> | ||
+ | >>> while True print('Hello world') | ||
+ | File "<stdin>", line 1 | ||
+ | while True print('Hello world') | ||
+ | ^ | ||
+ | SyntaxError: invalid syntax | ||
+ | </code> | ||
+ | |||
+ | Les **exceptions** sont détectées au moment de l'exécution: | ||
+ | |||
+ | <code python> | ||
+ | >>> 10 * (1/0) | ||
+ | Traceback (most recent call last): | ||
+ | File "<stdin>", line 1, in <module> | ||
+ | ZeroDivisionError: division by zero | ||
+ | </code> | ||
+ | |||
+ | === Gestion des exceptions === | ||
+ | |||
+ | Pour gérer les exceptions en Python, on utilise le bloc **try - except**, comme dans l'exemple suivant: | ||
+ | |||
+ | <code python> | ||
while True: | while True: | ||
- | if button_a.was_pressed(): | + | try: |
- | display.scroll(temperature()) #displat the temperature | + | x = int(input("Please enter a number: ")) |
- | elif display.read_light_level() > 100: #check the light level | + | break |
- | display.show(Image( #sun image | + | except ValueError: |
- | "90909:" | + | print("Oops! That was no valid number. Try again...") |
- | "09990:" | + | |
- | "99999:" | + | |
- | "09990:" | + | |
- | "90909")) | + | |
- | else: | + | |
- | display.clear() | + | |
</code> | </code> | ||
+ | |||
===== Exercices ===== | ===== Exercices ===== | ||
- | - Écrivez un programme qui en appuyant simultanément les boutons A et B, va afficher une image qui représente "OUI". Si pas de boutons est appuyé sur l'écran va affiche une image qui représente "NON" "NON". Voir les image sur [[https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/images.html|documentation]]. | + | - Créez 3 variables de types différents, comme il suit: **(0.5p)** |
- | -Modifier l’exercice antérieur tel que en appuyant le bouton A va afficher sur l’écran la lettre "A" et en appuyant le bouton B va afficher sur l’écran la lettre "B". | + | - une variable "int", qui va recevoir la valeur 80 |
- | -Écrivez un programme qui affiche le nombre actuel de secousses sur l’écran. Lorsque le micro-bit enregistre 9 secousses, une image apparaît sur l’affichage. | + | - une variable "float", ayant la valeur 20.2 |
- | -Créez un programme qui enregistre le nombre des inclinaisons à gauche et à droite. Chaque fois que le micro: bit est pointé dans l’un des deux côtés, il doit afficher sur l’écran le nombre actuel d’inclinaisons de ce côté. //Hint//: utilisez la méthode [[https://microbit-micropython.readthedocs.io/en/v1.0.1/microbit.html#microbit.sleep|sleep]] | + | - une variable "string", qui va retenir la chaîne "python" |
- | -Écrivez un programme qui en atteignant le logo (le capteur tactile) va faire toggle entre une image avec un diamant et une image avec un petit diamant. | + | - En utilisant la fonction [[https://docs.python.org/2/library/functions.html#type|type]], déterminez le types des variables suivantes: **(0.5p)** |
- | -Écrivez un programme qui, lors de l’enregistrement d’un son, affichera une image sur l’écran et parlera avec la parole "ON". Si aucun son n’est pas enregistré, l’affichage reste vide. Affichez le niveau sonore pour une action a votre choix (appui sur un bouton, logo tactile, inclinaison, etc.) | + | - var1 = 80 |
- | -Changer le code de [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_ro?&#senzorul_de_temperatura_si_de_lumina|exemple 7]] pour que le micro:bit détecte la lumière pour utiliser le haut-parleur pour lire de la musique JUMP_UP, et lorsque la lumière est éteinte pour lire de la musique JUMP_DOWN. Pour accéder à la bibliothèque "musique", voir la [[https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/music.html|documentation]]. | + | - var2 = 20.2 |
+ | - var3 = "microbit" | ||
+ | - Ecrivez un programme qui recoit comme parametres de la ligne de commande 4 nombres (a,b,c,d) et affiche sur l'écran le résultat de l'opération **a+b*c+d**. **(1p)** | ||
+ | - Créez une liste avec les noms des camarades de classe. Les noms peuvent ne pas etre distincts. Résolvez les demandes suivantes: **(2p)** | ||
+ | - Copier la liste intaille dans une autre liste appelle copyList et trier lui dans l ordre alphabétique. | ||
+ | - Déterminez le numéro d'occurrences du chaque nom en utilisant une liste auxiliaire, qui contient des éléments distincts. | ||
+ | - Déterminez le nom, qui a le numéro maxime d'occurrences dans la liste initiale et le nom avec le numéro minime d'occurrence (s’il y a plusieurs éléments qui respect la condition toutes vont être affichées). | ||
+ | - Inversez la liste de copyList et supprimez le dernier élément de la liste initiale. | ||
+ | - Créez une base de données d'un magasin avec des appareils électroménagers à l'aide du dictionnaire. Ajoutez des fonctionnalités: lorsqu'un produit est lu à partir du clavier, son prix soit affiché. Une erreur s'affichera si le produit n'existe pas "Erreur" et les produits seront recherchés jusqu'à ce que le texte "stop" soit entré. | ||
+ | - Ecrivez un programme qui affichera le résultat retourne par la fonction // digitize (n) //. Cette fonction va recevoir un int comme paramètre et va retourner une liste de chiffres du nombre dans l'ordre inverse. ** (1p) ** Exemple: 348597 => [7,9,5,8,4,3] | ||
+ | - Créez une classe Capteurs utilisée pour stocker les valeurs des capteurs suivants: température, lumière, humidité. Pour chaque capteur, vous pouvez lire et modifier les valeurs par des appels de fonction. ** (1p) ** | ||
+ | - Créez un programme qui, en utilisant la classe définie ci-dessus, stocker des valeurs provenant du différent ensembles de capteurs pour les suivantes chambres d'une maison et les affiche à l'écran: la cuisine, le hall, la chambre a couché, la salle a mangé. Le programme effectue les opérations en recevant les commandes de la console comme suit: ** (2p) ** | ||
+ | * ''insert <chambre> <capteru> <valeur>'' - où ''<chambre>'' , ''<capteur>'' et ''<valeur>'' vont être remplacés avec un de les 3 capteurs et une valeur - insérer une nouvelle valeur pour le capteur respectif | ||
+ | * ''delete <chambre> <chambre> <capteru> <valeur>'' - supprimer la valeur de ce capteur, la valeur après suppression sera 0 | ||
+ | * ''print <chambre><sensor>'' - afficher la valeur pour le capteur de la chambre précise | ||
+ | * ''print <chambre>'' - afficher tous capteurs el les valerus correspondantes pour la chambre spécifiée | ||
+ | * ''add_room <chambre>'' - ajoute un nouvel ensemble de capteurs pour une nouvelle chambre | ||
+ | * ''del_room <chambre>'' - efface l'ensmeble de capteurs pour une chambre | ||
+ | S’il va être introduit une autre commande, le programme lèvera une exception. | ||
+ | |||
+ | == Bonus == | ||
+ | - Modifiez les programmes précédents pour afficher les valeurs sur micro: bit, pas sur la console. | ||
+ | - Créez un programme qui allume tour à tour chaque LED du micro:bit. | ||
+ | - Créez un programme qui lit la température ambiante à l'aide du capteur existant sur micro:bit et l'affiche à l'aide des LED. | ||
+ | |||
+ | |||
+ | ==== ==== | ||
+ | |||
+ | [[https://github.com/UPB-FILS-SdE2/Solutions/tree/main/TP3|Solutions]] | ||
+ | |||
+ | |||
+ | |||
+ |