Wetterstation mit Raspberry Pi Pico und OLED Display

Dans son article, Andreas Wolter, un autre blogueur, vous explique comment configurer le Raspberry Pi Pico la première fois que vous l'utilisez et quels sont les autres éléments importants. Dans l'article du blog d'aujourd'hui, j'aborde mon sujet d'introduction préféré, la station météorologique. Avec le Raspberry Pi Pico, ci-après simplement appelé Pico, nous voulons sortir la température et plus tard aussi l'humidité et la pression ambiante.

Étant donné que le petit microcontrôleur est un produit de la Rapsberry Pi Foundation, le projet est développé sur le Raspberry Pi 4 avec l'IDE Thonny Python (c'est-à-dire MicroPython). Pour que vous puissiez aussi apprendre à connaître un peu mieux le Pico, le projet est divisé en trois parties dans ce blog :

  1. Sortie de température du capteur de température interne de la console
  2. Sortie de la température du capteur de température interne sur l'écran i2c OLED
  3. Détermination des conditions ambiantes avec BME/BMP280 et sortie sur l'écran i2c OLED

Ce sont toujours les premières mesures que je prends lorsque je me procure de nouveaux microcontrôleurs.

Matériel et logiciels requis

Le matériel pour ce montage expérimental est relativement simple, voir le tableau 1.

Numéro Composant Note
1 Raspberry Pi Pico
1 0,96 pouce OLED I2C Display SSD1306
1 Breadboard Kit & Jumper Wire
1 Capteur barométrique GY-BME280

Tableau 1 : Parties du matériel

Pour le logiciel, comme il s'agira d'un programme avec Python3, utilisez Thonny Python IDE, qui est déjà disponible avec l'image Raspbian et peut être installé pour tous les systèmes d'exploitation courants. Si vous travaillez avec Ubuntu, par exemple, je vous recommande d'installer Thonny Python IDE en utilisant la méthode décrite dans le Code 1.

  sudo pip3 install thonny
sudo usermod -a -G dialout $USER
Code 1 : Installer l'IDE Thonny Python via pip3


Après cela, vous ne pouvez démarrer l'IDE Thonny Python " que " via la console, mais c'est acceptable dans la mesure où cela va.

Lecture de la température sur le Pico

Dans la première partie de l'installation, il faut lire le capteur de température interne du Pico. Vous serez probablement surpris, car à première vue, il ne semble pas que le Pico dispose d'un capteur de température. Vous devez donc d'abord jeter un coup d'œil au brochage du Pico, voir la figure 1.

Figure 1: Pin de la framboise Pi Pico

Figure 1: Brochage du Raspberry Pi Pico, source: https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf

Ici, vous pouvez clairement voir les connexions ADC0 - ADC2, où ADC_VREF peut également être considéré ici comme ADC3, qui peut être utilisé pour les signaux analogiques. Ce que vous ne pouvez pas voir sur le brochage de la figure 1, mais que vous pouvez lire dans la fiche technique du RP2040 au chapitre 4.9.1, est une cinquième broche analogique (ADC4), qui est directement connectée à un capteur de température installé en interne, voir la figure 2.

Figure 2: Diagramme de connexion ADC

Figure 2 : Schéma de connexion de l'ADC, source : https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf

En principe, nous avons déjà installé le matériel nécessaire directement sur le Pico pour déterminer la température ambiante.

Le code 2 lit la température et la transmet à la console. Le programme est assez simple, mais je voudrais en expliquer directement trois parties.

 """
 // Read internal temp-sensor
 // Autor:   Joern Weise
 // License: GNU GPl 3.0
 // Created: 23. Oct 2021
 // Update: 23. Oct 2021
 """
 
  #First import needed libs
 import machine #Important to get Pins and config them
 import utime #For a little timer
 
 sensor = machine.ADC(4) # Create object sensor and init as pin ADC(4)
 conversion_factor = 3.3 / 65535 # 3.3V are 16bit (65535)
 
 while True:
     valueTemp = sensor.read_u16() * conversion_factor
     temp = 27 - (valueTemp - 0.706) / 0.001721 # See 4.9.5 of rp2040 datasheet
     print('Temperatur value: '+ "{:.2f}".format(temp)) # Print in terminal with two decimal
     utime.sleep(2) #Sleep for two seconds

Code 2 : Programme simple pour lire le capteur de température interne.

D'abord la ligne "conversion_factor = 3.3 / 65535", où un facteur de correction est défini. Nous en avons besoin car le pico nous donnera plus tard une valeur analogique entre 0 et 65535 pour la sortie du capteur. La valeur est intéressante car elle représente 2 octets ou 16 bits. Puisque 3,3 volts correspondent à 65535, nous en avons besoin pour convertir les 2 octets en une tension.

Nous arrivons ensuite à la ligne "valueTemp = sensor.read_u16() * conversion_factor" où la valeur du capteur est d'abord lue puis directement multipliée par le facteur de conversion. Moins intéressante est la multiplication, plus dans ce cas la read_u16(), qui est utilisée pour obtenir une valeur de 16 bits. Contrairement à read(), où seule une valeur binaire est renvoyée, avec read_u16() nous demandons à MicroPython de sortir la valeur en 2 octets, ce qui est parfaitement logique pour une broche analogique.

Enfin, la ligne "temp = 27 - (valueTemp - 0.706) / 0.001721", qui devrait finalement calculer la température du capteur de température pico. Je n'ai pas inventé cette formule, d'ailleurs on la retrouve de la même manière dans la fiche technique du pico au chapitre 4.9.5.

La sortie dans la console, qui est tout ce que notre programme peut faire pour le moment, est également peu remarquable, voir la figure 3.

Figure 3: Sortie de la température dans la console

Figure 3 : Sortie de la température dans la console

Pour que cela marche pour vous, il suffit d'appuyer sur F5 ou sur le bouton vert Run. Cependant, vous remarquerez rapidement que le capteur de température interne n'est pas très précis. Toutefois, cela ne devrait pas trop nous déranger dans cet exemple.

Affichage de la température sur un i2c OLED

Dans l'étape suivante, l'affichage de la température ne devrait plus se faire via la ligne de commande, mais, en ce qui concerne l'utilisation sans connexion à un PC, via un écran OLED. Dans mon cas, l'écran OLED SSD1306 de 0.96 pouces I2C avec 128x64 pixels. Ce qui est génial, c'est que la connexion ne nécessite que 4 câbles, voir figure 4, une bibliothèque et quelques lignes de code supplémentaires.

Figure 4: Câblage Pico avec écran OLED

Figure 4 : Câblage du Pico avec écran OLED

Le câblage a déjà été fait assez rapidement, nous allons donc continuer directement dans l'IDE Thonny Python avec la bibliothèque requise. Ouvrez d'abord la gestion des paquets, voir la figure 5.

Figure 5: Gestion des packages ouverts

Figure 5 : Gestion ouverte des paquets

Une nouvelle fenêtre s'ouvre alors dans laquelle vous pouvez rechercher des paquets, c'est-à-dire des bibliothèques pour du matériel supplémentaire, comme vous le souhaitez. Dans notre cas, nous avons besoin d'une bibliothèque MicroPython pour le contrôleur SSD1306. Pour ce faire, il suffit de saisir ssd1306 dans la fenêtre de recherche et d'appuyer sur Enter ou de rechercher sur PyPi et de sélectionner le paquet micropython-ssd1306, voir la Figure 6.

Figure 6: Recherchez MicropyThon Bibliothèque pour SSD1306

Figure 6 : Recherche de la bibliothèque MicroPython pour le SSD1306

L'étape suivante consiste à appuyer sur le bouton Installer, ce qui crée un dossier lib sur le pico et copie également la bibliothèque MicroPython pour le SSD1306 dans ce même dossier lib, voir Figure 7.

Figure 7: Installation de la bibliothèque Microptron pour SSD1306

Figure 7 : Installation de la bibliothèque MicroPython pour le SSD1306

Maintenant que nous avons la bibliothèque, nous devons programmer l'écran correctement, voir le code 3.


  """
 // Read internal temp-sensor and
 // show on i2c-OLED
 // Autor:   Joern Weise
 // License: GNU GPl 3.0
 // Created: 23. Oct 2021
 // Update: 24. Oct 2021
 """
 
  #First import needed libs
 from ssd1306 import SSD1306_I2C #Import from Lib the needed subpart
 from machine import Pin, I2C
 import machine  #Important to get Pins and config them
 import utime #For a little timer
 
 #Definitions for internal temp-sensor
 sensor = machine.ADC(4) # Create object sensor and init as pin ADC(4)
 conversion_factor = 3.3 / 65535 # 3.3V are 16bit (65535)
 
 #Definitons for i2c-Com
 sda=Pin(0)
 scl=Pin(1)
 i2c=I2C(0, sda=sda, scl=scl, freq=400000)
 
 #Write in cmd found addresses
 i2cScan = i2c.scan()
 counter = 0
 for i in i2cScan:
     print("I2C Address " + str(counter) + "     : "+hex(i).upper())
     counter+=1
 
 #Definitions for OLED-Display
 WIDTH = 128
 HIGHT = 64
 oled = SSD1306_I2C(WIDTH, HIGHT, i2c)
 
 i = 0
 while True:
     valueTemp = sensor.read_u16() * conversion_factor #
     temp = 27 - (valueTemp - 0.706) / 0.001721 # See 4.9.5 of rp2040 datasheet
     print('Temperatur value: '+ '{:.2f}'.format(temp)) # Print in terminal with two decimal
     print('Counter: ' +str(i))
     #Write data to display
     oled.fill(0)
     oled.text('Internal Temp',6,8)
     oled.text('Temp: ',6,22)
     oled.text(str(round(temp,2)),50,22)
     oled.text('*C',95,22)
     oled.text('Counter: ' + str(i),6,36)
     oled.show()
     i+=1
     utime.sleep(2) #Sleep for two seconds

Code 3 : Code du premier exemple étendu pour inclure un écran OLED.

Les commentaires expliquent exactement ce que je fais, mais il y a quelques sections que j'aimerais expliquer plus en détail. En commençant par "from ssd1306 import SSD1306_I2C", où nous chargeons ou fournissons la partie SSD1306_I2C de la bibliothèque ssd1306. Cela signifie que nous ne devons pas charger la bibliothèque entière, mais charger exactement la partie qui nous intéresse.

Après le commentaire "#Definitons pour i2c-Com", il ne se passe pas grand chose de passionnant au début. D'abord, les broches pour SDA et SCL sont déclarées et ensuite l'interface i2c 0 est créée avec les broches déjà déclarées et la fréquence 400kHz. Ensuite, ce qui est simplement une sortie intéressante pour moi, mon programme interroge toutes les adresses hexagonales disponibles pour voir si un abonné est présent et sort les adresses des abonnés trouvées dans la ligne de commande via la boucle-for.

Juste après, derrière le commentaire "#Definitions for OLED-Display", je déclare la taille de l'écran et crée un objet avec tous les paramètres nécessaires pour l'écran.

Par la suite, la boucle-while a été modifiée de manière à ce que la température et un petit compteur soient affichés à la fois dans la ligne de commande et sur l'écran, voir Figure 8.

Figure 8: Sortie OLED

Figure 8 : Sortie OLED

J'ai inséré le compteur afin de pouvoir constater que mon pico fonctionne toujours et qu'il n'est pas passé inaperçu.

Lecture de la température d'un GY-BME280

Comme vous l'avez probablement déjà remarqué ou lu dans la documentation du Pico, la lecture de la température du capteur installé en interne n'est pas vraiment précise. À ce stade, j'aime toujours utiliser le capteur barométrique GY-BME280 pour la température, l'humidité et la pression atmosphérique, car il me fournit directement toutes les données pertinentes. J'ai déjà utilisé ce capteur dans des articles de blog précédents. Comme le GY-BME280 communique également via i2c, il n'a besoin que de quatre fils supplémentaires à ceux déjà utilisés pour l'écran OLED, voir figure 9.

Figure 9: Connectez le GY-BME280

Figure 9 : Connexion de la GY-BME280

Si vous avez lu les fiches techniques de l'OLED et du GY-BME280, vous avez dû remarquer qu'ils utilisent tous deux des adresses différentes, nous pouvons donc connecter les deux composants en série. Si les adresses étaient les mêmes, nous devrions créer une autre interface i2c à partir du pico. Recherchez maintenant bme280 dans la gestion des paquets et sélectionnez la bibliothèque micropython-bme280 pour l'installation, même si la description parle de l'ESP8266/ESP32, voir Figure 10.

Figure 10: Installation de la bibliothèque pour BME280

Figure 10 : Installer la bibliothèque pour BME280

Avec cela, une bibliothèque pour notre capteur est maintenant disponible et notre exemple de code peut être étendu par quelques lignes, voir le Code 4.


  '''
 // Read BME280 and
 // show on i2c-OLED
 // Autor:   Joern Weise
 // License: GNU GPl 3.0
 // Created: 23. Oct 2021
 // Update: 24. Oct 2021
 '''
 
  #First import needed libs
 from ssd1306 import SSD1306_I2C #Import from Lib the needed subpart
 from bme280 import BME280 #Import BME280-lib
 from machine import Pin, I2C
 import machine  #Important to get Pins and config them
 import utime #For a little timer
 
 #Definitions for internal temp-sensor
 sensor = machine.ADC(4) # Create object sensor and init as pin ADC(4)
 conversion_factor = 3.3 / 65535 # 3.3V are 16bit (65535)
 
 #Definitons for i2c-Com
 sda=Pin(0)
 scl=Pin(1)
 i2c=I2C(0, sda=sda, scl=scl, freq=400000)
 
 #Write in cmd found addresses
 i2cScan = i2c.scan()
 counter = 0
 for i in i2cScan:
     print('I2C Address ' + str(counter) + '     : '+hex(i).upper())
     counter+=1
 print('---------------------------')
 #Definitions for OLED-Display
 WIDTH = 128
 HIGHT = 64
 oled = SSD1306_I2C(WIDTH, HIGHT, i2c)
 
 #Definition for BME280
 sensorBME = BME280(i2c=i2c)
 
 i = 0
 while True:
     valueTemp = sensor.read_u16() * conversion_factor #
     temp = 27 - (valueTemp - 0.706) / 0.001721 # See 4.9.5 of rp2040 datasheet
     tempC, preshPa, humRH = sensorBME.values #Receive current values from GY-BME280 as tuple
     tempC = tempC.replace('C','*C')
     print('Temperatur value: '+ '{:.2f}'.format(temp) +'*C') # Print in terminal with two decima
     print('Temperatur BME: ' + tempC)
     print('Pressure BME: ' + preshPa)
     print('Humidty BME: ' + humRH)
     print('Counter: ' + str(i))
     print('>-----------<')
     #Write data to display
     oled.fill(0)
     oled.text('GY-BME280 ',6,0)
     oled.text('Temp:' + tempC,6,14)
     oled.text('Pres:' + preshPa,6,28)
     oled.text('Humi:' + humRH,6,42)
     oled.text('Counter:' + str(i),6,56)
     oled.show()
     i+=1
     utime.sleep(2) #Sleep for two seconds

Code 4 : Mesure avec GY-BME280

Comme dans le code précédent, les changements sont gérables. Tout d'abord, BME280 est chargé à partir de la bibliothèque bme280. Derrière le commentaire "#Definition for BME280" un objet sensorBME est créé et l'interface i2c est passée. La partie intéressante se passe dans la boucle-while. Ici, au moyen de "sensorBME.values", les données ambiantes lisibles par l'homme sont transmises dans un tuple aux variables tempC, preshPa, humRH.

Ensuite, ces données sont affichées sur l'écran, voir figure 11.

Figure 11: Données BME280 sur l'écran OLED

Figure 11 : Données du BME280 sur l'écran OLED

Comme je suis toujours intéressé par les valeurs fournies par le pico, je les ai laissées dans la sortie de la ligne de commande, voir Figure 12.

Figure 12: Édition de ligne de commande

Figure 12 : Sortie de la ligne de commande

Mon script ne s'exécute pas / ne démarre pas sans PC

Vous avez probablement déjà essayé d'utiliser les scripts dans l'IDE Thonny Python. Ici, vous devez absolument faire attention à deux choses !!!

  1. Lorsque vous enregistrez un script Python, vous devez toujours saisir l'extension .py lors de l'enregistrement. Sinon, le code ne sera plus reconnu dans la suite et les modifications ne seront plus possibles.
  2. Pour que votre code marche sans PC et sans Thonny Python IDE, le fichier à exécuter doit s'appeler py sur le Raspberry Pi Pico. Si le Pico trouve ce fichier, le script qu'il contient sera exécuté.

Je les ai résumés une fois de plus dans la figure 13.

Figure 13: Types de soi de pico

Figure 13 : Caractéristiques du Pico

Sommaire

Même si vous avez "seulement" travaillé avec nos microcontrôleurs ESP32/ESP8266 ou Nano v3.0 et l'IDE Arduino jusqu'à présent, ce petit exemple devrait pouvoir être mis en œuvre assez rapidement. Il existe en effet la possibilité d'utiliser l'IDE Arduino pour programmer le Pico (quelques informations à ce sujet ici), cependant, à mon avis personnel, vous devriez programmer avec l'IDE Thonny Python et microPython. Ce dernier a l'avantage de vous permettre d'apprendre l'un des langages de programmation les plus importants, à savoir Python. Ce langage est devenu si populaire que de nombreux outils de piratage sont également mis en œuvre avec ce langage de script.

N'hésitez pas à essayer de comprendre ces trois exemples plus en détail et peut-être à créer deux connexions i2c distinctes. Il serait également possible d'utiliser deux GY-BME280 et d'utiliser la moyenne des deux mesures. Les modifications de ces exemples très simples sont presque illimitées, mais elles devraient montrer un début très simple. J'espère avoir réussi à faire en sorte que vous vous tourniez vers le Pico et non vers le plus puissant ESP32.

Vous trouverez d'autres projets pour AZ-Delivery à l'adresse suivante  https://github.com/M3taKn1ght/Blog-Repo

AfficheProjets pour débutantsTarte aux framboisesCapteurs

9 commentaires

Jörn Weise

Jörn Weise

Hallo Wolfgang,
1:1 können sie das Programm nicht auf dem Raspberry Pi übernehmen, da eine andere Bibliothek für das ansteuern der gpios verwendet wird. Heißt, die machine -lib muss ersetzt werden und somit auch einige Kommandos in den Beispiel.
Gruß
Weise

Wolfgang

Wolfgang

Ist das Pythonprogramm auch auf einen Raspberry Pi Zero lauffähig oder muss es angepasst werden?

Andreas Wolter

Andreas Wolter

@Harald Bohnenkamp: ich erhalte den gleichen Fehler, wenn ich versuche, diesen Bibliothek in Thonny unter Windows zu installieren. Im Beitrag wird ein Raspberry Pi verwendet, mit dem der Pico programmiert wird. Vielleicht könnte es daran liegen. Als Workaround könnten Sie versuchen, die Bibliothek manuell einzubinden: https://github.com/SebastianRoll/mpy_bme280_esp8266

Grüße,
Andreas Wolter
AZ-Delivery Blog

Harald Bohnenkamp

Harald Bohnenkamp

Ich bekomme eine Fehlermeldung wenn ich micropython-bme280 installieren möchte: Error: Command errored out with exit status 1: python setup.py egg_info Check the logs for for full command output. Error: process returned with code 1

Was muss ich machen, damit ich den bme280 am pico zum laufen bekomme?
lg Harald

Wolfhard Jording

Wolfhard Jording

Ich bin gerade dabei, mich in den Pico und die Programmiersprache ein zu arbeiten. Da hilft so ein Beispiel natürlich sehr schön weiter. In meiner Bastelkiste befinden sich einige Pico’s und auch BME’s, so das ich “Hemmungslos” los basteln kann. Gerne mehr davon!

Andreas Wolter

Andreas Wolter

Hallo liebe Leser, danke für das Feedback. Auch der AZ-Shop bleibt von gelegentlichen Lieferschwierigkeiten nicht verschont. Hinter den Kulissen arbeiten Menschen, die darum bemüht sind, die gewünschten Komponenten für die Bastelprojekte verfügbar zu machen.

Zum Titelbild: Es ist ein gestalterisches Mittel. Die wichtigen Abbildungen finden Sie immer in den Beiträgen.

Jedes Projekt dient als Inspiration für eigene Projekte. Der BME/BMP kann durch andere Sensoren ersetzt werden. In diesem Beitrag ging es nicht speziell um diesen Sensor, sondern um den Pico, die Bibliotheken in Thonny und noch einiges mehr. Der Pico ist neu im Programm und wir halten es für wichtig zu zeigen, wie man ihn verwenden kann.

Grüße,
Andreas Wolter

michael

michael

Was nützt eine Anleitung wenn dei BME nicht lieferbar sind

Tony Goodhew

Tony Goodhew

I agree. This is now the time to learn Python, via Micropython. Using the interpreter rather than having to compile makes learning quicker and easier. I love Micropython.
The Pi Pico is an ideal route – cheap and powerful with plenty of internet help now available.
If you haven’t tried a Pico yet – give it a go – you do not know what you are missing.

Herbert Kahl

Herbert Kahl

Netter Bauvorschlag. Habe jedoch zwei Anmerkungen. Ich frage mich bei jedem Bauvorschlag, warum das Titelbild immer unscharf abgebildet ist. Wäre doch viel schöner, wenn man alles erkkent und zweitens, warum gerade jetzt ein Bauvorschlag mit dem BME280, wo dieser doch bei AZ-Delivery seit mehreren Wochen ausverkauft ist.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Messages de blogs recommandés

  1. Installez maintenant ESP32 via l'administrateur de la carte
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA-Over the Air-ESP Programmation par WiFi