Table des matières

Station méteo à base d'esp8266 + raspberryPI - Partie 2

Etape deux de la realisation : essai d'utilisation d'un capteur de température/humidité (HTU21) et d'un petit écran oled, tout deux en i2c, avec un raspberry pi.

Conception

L'idée est ici de débuter la conception de la partie de la station méto installée à l'intérieur, qui servira a stocker les données (non traité ici), les afficher mais aussi à mesurer la température à l’intérieur de la maison.

Réalisation

Installation de la raspberry pi

J'ai utilisé une distribution raspbian lite (je ne vais pas detailler l'intallation ici) configuré pour se connecter automatiquement à mon wifi afin de pouvoir y acceder en ssh.

Les script seront en python3, il est nécessaire au cas ou cela ne serait pas le cas par defaut d'installer pip3 (gestionaire de packets pour python3) afin de pouvoir installer nos dependances python.

sudo apt-get install python3-pip

Le protocole i2c n'est pas activé par defaut, pour l'activer il faut lancer la comamnde

sudo raspi-config

puis dans Interfacing Options et activer I2C.

Il peut aussi être interessant d'augmenter le vitesse de communication du bus i2c, pour cela ajouter la ligne suivant à la fin du fichier /boot/config.txt :

dtparam=i2c_baudrate=1000000

Installation des bibliothèques python pour l'ecran oled et le capteur HTU21

J'utilise un petit écran oled I2C 128×64 pilotable de la meme facons que les moduless SSD1306 d'adafruit. Adafruit propose aussi un breakout pour le capteur HTU21, nous allons donc pouvoir utilise les biblothequent qu'il fournissent pour ces deux modules :

sudo pip3 install adafruit-circuitpython-ssd1306 adafruit-circuitpython-htu21d

Connexion de l’écran et du capteur

Les deux éléments sont connectés de façons identiques.

Détection des adresses des deux module

Petit commande bien pratique pour détecter l'adresse des modules i2c connecté au raspberry pi.

 bash
i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

Ici les deux module ont les meme adresse “par defaut” que les breakouts d'adafruit, donc nous n'aurons pas de soucis particulier.

Le programme de test

Redaction d'un petit script python affichant une image avec les temperatures et humidité lue sur le capteur :

import time
 
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
 
import board
import digitalio
from adafruit_htu21d import HTU21D
import adafruit_ssd1306
 
 
# Use for I2C.
i2c = board.I2C()
 
# Definition du capteur de temperature
sensor = HTU21D(i2c)
 
# Initialisation de l'ecran
oled_reset = digitalio.DigitalInOut(board.D4)
 
OLED_WIDTH = 128
OLED_HEIGHT = 32  # (On peut utilser 64, mais j'aime bien le look scanline ;) )
OLED_ADDR = 0x3C
oled = adafruit_ssd1306.SSD1306_I2C(
    OLED_WIDTH, OLED_HEIGHT, i2c, addr=OLED_ADDR, reset=oled_reset
)
 
# re-initialisation de l'ecran.
oled.fill(0)
oled.show()
 
# Load defChargement de la police par defaut.
font = ImageFont.load_default()
 
while True:
    # On dessine l'image a afficher en se basant sur un un fichier
    image = Image.open('tree-32.pbm')
    draw = ImageDraw.Draw(image)
 
    # on affiche les valeur lues sur le capteur en bas de l'image
    temp = "%0.1f°C" % sensor.temperature
    humidity = "%0.0f%%" % sensor.relative_humidity
    draw.text((1, 23), temp,  font=font, fill=255)
    draw.text((110, 23), humidity, font=font, fill=255)
 
    # On affiche l'image dessinée sur l'ecran
    oled.image(image)
    oled.show()
    time.sleep(1)

J'ai configuré mon ecran en 128×32 au lieu de 128×64, l'affichage se fait donc une ligne sur deux, et donne un effet retro jque je trouve assez sympa !