[Débutants] Exemple de simplification de code (+ exemple poo)

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 13 août 2019 10:40

J’ai bien sur mis tout ça dans un fichier led.py que je pourrais utiliser dans tous les programmes qui utiliseront des leds en faisant un simple import.
un petit test en console pour voir si mon objet fonctionne :
poo#2.png
poo#2.png (20.26 Kio) Vu 5274 fois
Ca marche \o/ :D ...

Prochain épisode l'objet bargraphe ;) .
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 13 août 2019 11:45

Le bargraph, c’est plutôt simple en soit. Ce sont juste des leds que l’on veut allumer ou en fonction d’un niveau de seuil. Ok, mais pourquoi des leds ? Cela pourrait tout aussi bien etre des éléments graphique d’une GUI ou meme de simple liste d’état pour d’autres besoin ou tout un tas d'autre chose. Pour ne pas se retrouver enfermer avec des leds je vais prévoir tout de suite que mon objet bargraph pourrait me servir a plein de chose. Je vais donc commencer à définir des Barrettes (qui pourront etre n’importe quel type d’objet) et le bargraph qui va les utiliser.
poo#3.png
poo#3.png (17.19 Kio) Vu 5268 fois
L’objet Barrette est juste déclaratif. Il définit l’objet qui sera visé et un niveau de seuil. Il va aussi nous permettre d'utiliser du code explicite et nous évitera les truc[0] truc[1] que l'on a vu avec les tuples. Le bargraph lui a pour rôle de contenir une liste d’objet Barrette et d’attribuer une valeur true ou false à la propriété état de l’objet barre qui compose Barrette en fonction de son niveau seuil. Pour arriver à ça je fais appel de l’héritage de class. Barrette est la class parente et Bargraph est la class enfant qui va hériter des propriétés de Barrette. Dans la fonction write de Bargraph, la variable d’itération x représente une Barrette et l’heritage me permet d’initialiser directement la propriété etat de son objet barre. Désormais, tout objet qui aura une propriété booléenne etat pourra etre considéré comme une Barrette de mon bargraph.
Modifié en dernier par Bud Spencer le mar. 13 août 2019 14:33, modifié 1 fois.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 13 août 2019 12:43

J’ai codé tout ça sur un PC qui n’a malheureusement pas de gpio pour tester mon bargraph. Pas de probleme, je vais créer un petit objet de test qui va me permettre de tester en console. Cet objet a juste besoin d’une propriété booléenne etat et je vais lui faire ecrire un ‘|’ pour True et un ‘_’ pour False. Je créer ensuite 5 instances de Barrette qui contiennent un BarreTestet qui a l'etat False par défaut et un niveau de seuil et je passe en tout ca en paramètre à un nouvel objet bargraph. Je n’ai plus qu’à tester en utilisant des valeurs bidon
poo#4.png
poo#4.png (56.89 Kio) Vu 5253 fois
ps pour les tout débutants : range (10,110,5) veut dire que la valeur de x va commencer a 10, qu’elle va s’incrémenter au pas de 5 jusqu’à 110. Notez aussi le ,end= ‘ ‘ à la fin du print. C’est la méthode python3 pour empêcher le retour à la ligne
Modifié en dernier par Bud Spencer le mar. 13 août 2019 14:32, modifié 1 fois.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Frédéric
Messages : 17
Enregistré le : lun. 29 juil. 2019 19:47

Re: [Débutants] Exemple de simplification de code

Message par Frédéric » mar. 13 août 2019 12:55

Sympa ce code, j apprend pleins de trucs.
Finalement ce n est plus"_" pour False mais "."
Juste par curiosité, tu bosse dans l informatique? Parce que tu maitrise :o

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: [Débutants] Exemple de simplification de code

Message par dyox » mar. 13 août 2019 13:20

Juste par curiosité, tu bosse dans l informatique? Parce que tu maitrise :o
Et tout en sachant qu'il n'aime pas python :shock:

Il détient le post qui explose les compteurs du forum, et qui va t'intéresser : [TUTO] Application web dynamique

Frédéric
Messages : 17
Enregistré le : lun. 29 juil. 2019 19:47

Re: [Débutants] Exemple de simplification de code

Message par Frédéric » mar. 13 août 2019 13:33

Oui une application web ça peut etre un futur projet. En plus je suis PiNoob donc ce tuto est pour moi :D
Ce mec est un Ninja!!!

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 13 août 2019 14:14

@Frédéric : Oui, j’ai remplacé le _ par un . je trouvais que cela faisait plus jolie sur la console, mais ça ne change pas grand-chose si ce n’est prouvé que tu lis ce que j’écris et que tu l’analyses. Je n’ai aucun mérite pour ce genre de chose puisque je suis effectivement developpeur pro depuis bientôt 30 ans et il se trouve que mon métier me passionne toujours autant. C’est ce qui explique sans doute que j’ai peut etre un peu trop tendance à voir ces chose trop simplement et ai parfois un peu de mal à me remettre dans la peau d’un débutant (bien que j’ai enseigné la programmation pendant une lointaine période de ma vie). Je fais partie de ces vieux geek d’autrefois qui peuvent s’infuser 60 heures de code par semaine sur des projets énormes et encore taper quelques lignes rigolotes le soir ou le wk pour s’amuser et se détendre. Donc ici je m’amuse et je me détends ;-)

@Dyox : C’est vrai. Je ne suis pas du tout fan de python, mais c’est peut etre parce que j’ai d’autres langages dans ma besace pour pouvoir comparer. Ceci dit, tant que c’est pour ecrire des petits scripts ou m’amuser avec vous ici, je le trouve aussi rigolo que les autres ;)

Aller, on remet notre bargraphe a leds dans son contexte avec la charge cpu de psutil. Il y a juste a definir les leds et les seuils que l’on va passer en paramètre d’un nouvel objet bargraph et il suffit maintenant plus que d’une ligne de code pour ecrire (allumer) le bargraph en lui passant une valeur en paramètre.
poo#5.png
poo#5.png (30.93 Kio) Vu 5242 fois

Voila, il a fallu s'infuser le codage des objets, mais admettez que le code du programme est devenu particulièrement limpide et désormais, à chaque fois que l’on aura besoin d’une led ou plusieurs leds, on pourra importer l’objet Led et l’utiliser avec du code explicite. Idem pour le bargraphe qui peut servir avec n’importe quel autre type d’objet. Comme j'en ais parlé Je vous rajouterais un blink dans Led pour démontrer que l'on peut facilement enrichir ses objets.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » jeu. 15 août 2019 10:07

Ajout d’une action blink à l’objet Led.
Comme la class va utiliser time.sleep, il faut l'importer au début du fichier
Pour appeler l'action : maled.blink(nombre de clignotement, delais en seconde)
et test en console :
led.blink.png
led.blink.png (29.1 Kio) Vu 5211 fois
Ca marche (encore … :D )

Une simple boucle for ou a chaque tour on récupère l'état de la led avec l'accesseur _get_etat et on le change en utilisant le mutateur set_etat en y passant l'inverse de ce qu'a retourné _get_etat
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » ven. 16 août 2019 10:58

Petit code du matin pour digérer les tartines.
Ajour d’une fonction pwm à la class Led. RPi.GPIO possède une fonction pwm soft dont on peut définir la fréquence et le duty cycle et que l’on peut démarrer par pwm.start et arrêter par pwm.stop. Il faut par contre bien penser à arrêter le pwm avant d’utiliser la sortie en mode normal. L’idée c’est de mettre tout ça dans l’objet pour n’avoir qu’une seule instruction d’exposée pour 'pwmiser' la led sans avoir à gérer le mode pwm.

Pour ça il y a :
- Une variable interne pour connaitre l’état du mode pwm (_pwm) et qui est initialisé à None par défaut
- Une Une variable interne pour la fréquence (_pwmfrq) qui est initialisé à 300 Hz (suffisant pour une led).
- Une fonction pwm qui reçoit le duty cycle en paramètre.

Si le mode pwm de la sortie n’est pas activé, la fonction l’active et initialise le duty cylce. Si en revanche il est déjà activé, la fonction modifie le duty cycle avec celui passé en paramètre. Pour ne pas avoir à gérer l’arrêt du mode pwm, j’ai ajouté une ligne à chacune des fonctions qui est succeptible de modifier l’etat de la sortie (). Ainsi, on peut depuis le programme, utiliser très simplement le mode pwm avec une simple instruction du genre :
maled.pwm(x%)
et toute autre instruction de modification arrêtera automatiquement le mode pwm s’il est activé
pwm#1.png
pwm#1.png (60.3 Kio) Vu 5200 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » ven. 16 août 2019 11:12

Un petit programme de test de l’action pwm de Led :
pwm#2.png
pwm#2.png (14.24 Kio) Vu 5200 fois
ou plus rigolo, l'utiliser en lui passant le % de charge cpu.
pwm#3.png
pwm#3.png (16.85 Kio) Vu 5200 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « Python »