Tuto pas à pas Python : le capteur d'humidité

Voici le premier tuto en python dédié au pack d’accessoires.
Aujourd’hui on s’intéresse au capteur d’humidité fourni dans le pack. Comme pour le tuto en C++ disponible ici on va réaliser un petit programme très simple permettant d’utiliser le capteur rapidement. A vous ensuite de réaliser des choses plus complexes si vous le souhaitez.

Avant tout : Installation des outils

Ce tuto est réalisé sur l’IDE Mu pour Circuit Python.
Si vous n’avez pas encore installé l’un et l’autre veuillez vous référer au guide d’installation Mu et CircuitPython disponible sur le site.

Etape 1 : La base du programme

Commencez par ouvrir Mu et créer un nouveau fichier.
Copiez-y le code suivant :

from gamebuino_meta import begin, waitForUpdate, display, buttons, color
import board
from analogio import AnalogIn

while True:
    waitForUpdate()
    display.clear()

Cela va importer les libraires Gamebuino nécessaires au fonctionnement de notre programme, ainsi qu’une libraire “board” et une libraire “AnalogIn” dont on aura besoin pour travailler avec notre capteur.

La partie commencant par “while True:” constitue la boucle principale de notre programme, sans elle il ne se passerait rien.

Etape 2 : La lecture du capteur

Ici nous allons voir comment effectuer une mesure à l’aide de notre capteur, stocker la valeur obtenue puis la transformer.

Commençons par définir le port d’entrée de notre capteur :

analog_in = AnalogIn(board.A1)

Ici on utilise la fonction AnalogIn() à laquelle on donne en paramètre le port A1 de notre carte (board.A1) pour définir une variable analog_in que l’on utilisera par la suite. Vous pouvez utiliser un autre port analogique si besoin.

Ensuite nous pouvons déclarer deux variables “base_value” et “percent_value” qu’on va utiliser pour stocker la valeur lue et la transformer :

from gamebuino_meta import begin, waitForUpdate, display, buttons, color
import board
from analogio import AnalogIn

analog_in = AnalogIn(board.A1)

base_value = 0
percent_value = 0

On initialise ces variables à 0 par principe, peu de risque avec un aussi petit programme mais c’est une bonne habitude à prendre.

Passons maintenant à la lecture proprement dite.

On va utiliser une fonction dédiée que l’on appellera “read_sensor” et qui prendra en paramètre un pin :

def read_sensor(pin):
    return 65536 - pin.value

On a bien ici notre fonction read_sensor qui prend en paramètre un pin. Elle renvoie simplement 65536 moins la valeur lue depuis ce pin. Pourquoi 65536 ? Eh bien c’est parce que la valeur envoyée par notre capteur est codée sur 16 bits, soit une valeur MAXIMALE de 65536-1, et surtout c’est une valeur croissante, or il est plus pratique d’inverser cette valeur pour la suite.

Attention, notre fonction fait bien son travail mais pour le moment elle n’est pas incluse dans notre boucle principale, donc elle ne sert à rien. On y remédie très simplement comme ceci :

while True:
    waitForUpdate()
    display.clear()
    base_value = read_sensor(analog_in)

On vient appeler cette fonction dans notre boucle principale. Et surtout ce qui nous intéresse c’est de stocker la valeur obtenue dans notre variable “base_value” pour pouvoir travailler dessus.

On va tout de suite transformer cette valeur de base un peu incompréhensible en quelque chose de plus simple, un pourcentage, que l’on stocke dans notre variable “percent_value” :

while True:
    waitForUpdate()
    display.clear()
    base_value = read_sensor(analog_in)
    percent_value = base_value * 100 // 65536

Avec un simple produit en croix on ramène notre valeur brute sur 100 et on la stocke dans “percent_value”

Etape 3 : Un peu d’affichage

Jusque là tout ce qu’on a fait fonctionne, mais on n’a aucun moyen de le vérifier tout simplement car rien ne s’affiche sur l’écran de notre console.

On va donc rajouter à notre programme deux fonctions supplémentaires pour afficher différentes informations.

La première de ces fonctions servira simplement à afficher le contenu de nos variables. Aussi on l’appellera “print_values”
On définit notre fonction print_values avec deux paramètres qui correspondent à nos deux variables :

def print_values(valueA, valueB):
    display.print(valueA)
    display.print('\n')
    display.print(valueB)
    display.print('%')

On commence par afficher la valeur A, puis un retour à la ligne, puis la valeur B suivie d’un “%”. Rien de bien compliqué.

Notre seconde fonction servira à afficher une barre au remplissage dynamique correspondant au taux d’humidité mesuré par le capteur. Dit comme ça on peut s’attendre à une fonction complexe mais je vous rassure il n’en est rien.
On déclare d’abord notre fonction que l’on appelle “draw_bar” et qui prend en paramètre une variable, en l’occurrence notre percent_value :

def draw_bar(percent_value):

Ensuite on complète avec l’affichage d’un rectangle vide :

def draw_bar(percent_value):
    display.drawRect(5, 54, 70, 10)

Puis enfin l’affichage d’un rectangle plein dont la longueur est proportionnelle à la valeur de percent_value :

def draw_bar(percent_value):
    display.drawRect(5, 54, 70, 10)
    if(percent_value > 25):
        display.setColor(color.BLUE)
    else:
        display.setColor(color.RED)
    display.fillRect(6, 55, percent_value*68//100, 8)

Notez la petite subtilité, on définit la couleur de ce second rectangle en bleu si la valeur est suffisante, ici > 25, et en rouge si elle est trop basse.

Il n’y a plus qu’à appeler nos deux nouvelles fonctions dans notre boucle principale :

while True:
    waitForUpdate()
    display.clear()
    base_value = read_sensor(analog_in)
    percent_value = base_value * 100 // 65536
    print_values(base_value, percent_value)
    draw_bar(percent_value)

Et voilà ! Votre programme est terminé, il devrait ressembler à peu près à ceci :

from gamebuino_meta import begin, waitForUpdate, display, buttons, color
import board
from analogio import AnalogIn

analog_in = AnalogIn(board.A1)

base_value = 0
percent_value = 0

def read_sensor(pin):
    return 65536 - pin.value

def print_values(valueA, valueB):
    display.print(valueA)
    display.print('\n')
    display.print(valueB)
    display.print('%')

def draw_bar(percent_value):
    display.drawRect(5, 54, 70, 10)
    if(percent_value > 25):
        display.setColor(color.BLUE)
    else:
        display.setColor(color.RED)
    display.fillRect(6, 55, percent_value*68//100, 8)

while True:
    waitForUpdate()
    display.clear()
    base_value = read_sensor(analog_in)
    percent_value = base_value * 100 // 65536
    print_values(base_value, percent_value)
    draw_bar(percent_value)

Il n’y a plus qu’à le sauvegarder sur votre console, et bien entendu sur votre ordinateur pour ne pas le perdre.

1 Like