====== Station méteo à base d'esp8266 + raspberryPI - Partie 2 ======
{{{project
picture:{{:projets:station_meteo_esp8266:dsc_5287.jpg}}
machines:
materiaux:
logiciels:
fichiers: {{:projets:station_meteo_esp8266:temperature.zip}}
liens: [[https://github.com/adafruit/Adafruit_CircuitPython_HTU21D|Adafruit_CircuitPython_HTU21D]] [[https://learn.adafruit.com/monochrome-oled-breakouts/python-setup|Adafruit SSD1306 Python]]
tags:raspberry-pi, HTU21, OLED, python
usager:bumblebee
licence:cc-by-sa
}}}
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 128x64 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 ====
{{:projets:station_meteo_esp8266:i2c_oled_128x64_raspberry_pi_wiring.png?300}}
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 128x32 au lieu de 128x64, l'affichage se fait donc une ligne sur deux, et donne un effet retro jque je trouve assez sympa !