====== 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 !