Wetterstation mit Raspberry Pi Pico und OLED Display - AZ-Delivery

El compañero del blogs Andreas Wolter ha explicado en su blog los detalles de la Raspberry Pi Pico, cómo configurarla por primera vez y qué otras características son importantes. En el artículo del blog de hoy, retomo mi tema introductorio favorito, la estación meteorológica. Con la Raspberry Pi Pico, a partir de ahora denominada simplemente Pico, queremos tener la temperatura y luego también la humedad y la salida de presión ambiental.

Dado que el pequeño microcontrolador es un producto de la Fundación Rapsberry Pi, el proyecto se desarrolla en la Raspberry Pi 4 con el Thonny Python IDE (es decir, MicroPython). Para que también conozca un poco mejor la Pico, el proyecto se divide en tres partes en este blog:

  1. Salida de temperatura del sensor de temperatura construido internamente en la consola
  2. Salida de temperatura del sensor de temperatura construido internamente en la pantalla OLED I2C
  3. Determina las condiciones ambientales con BME / BMP280 y la salida a la pantalla OLED I2C

Estos son siempre los primeros pasos que doy cuando adquiero nuevos microcontroladores.

Hardware y software requeridos

El hardware para esta configuración experimental es relativamente sencillo, véase la Tabla 1.

Cantidad Componente Anotación
1 Raspberry Pi Pico
1 Pantalla OLED I2C SSD1306 de 0.96 pulgadas
1 Kit Breadboard y Jumper Wire
1 Sensor barométrico GY-BME280

Tabla 1: Piezas de hardware

Para el software, ya que será un programa con Python3, Thonny Python IDE, que ya está disponible con la imagen de Raspbian y se puede instalar para todos los sistemas operativos comunes. Recomiendo en este punto, si está trabajando con Ubuntu por ejemplo, instalar Thonny Python IDE usando el método que se describe en el Código 1.

 sudo PIP3 instalar thonny
sudo usermod -a -GRAMO marcar hacia afuera $ Usuario
Código 1: Instale Thonny Python IDE a través de PIP3


Después de eso, "sólo" se puede iniciar el Thonny Python IDE "a través de la consola, pero eso es aceptable hasta ahora.

Lectura de la temperatura desde la Pico

La primera parte de la configuración consiste en leer el sensor de temperatura interno de la Pico. Probablemente se sorprenderá, porque a primera vista no parece que la Pico tenga un sensor de temperatura. Por lo tanto, primero debería mirar el pinout de la Pico, véase la Figura 1.

Figura 1: Pinout de Raspberry Pi Pico

Figura 1: Pinout de Raspberry Pi Pico, Fuente: https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf

Aquí se pueden ver claramente las conexiones ADC0 - ADC2, donde ADC_VREF también se puede visualizar como ADC3, que se puede utilizar para las señales analógicas. Lo que no se observa en el pinout de la Figura 1, pero se puede leer en la Hoja de Datos del RP2040 en el capítulo 4.9.1, es un quinto Pin analógico (ADC4), que se conecta directamente a un sensor de temperatura instalado internamente, véase la Figura 2.

Figura 2: Diagrama de conexión ADC

Figura 2: Diagrama de conexión ADC, Fuente: https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf

En principio, ya hemos instalado el hardware requerido directamente en la Pico para determinar la temperatura ambiente.

El Código 2 lee la temperatura y la muestra en la consola. El programa es bastante sencillo, aunque me gustaría explicar directamente tres puntos.

 """
 // leer sensor de temperatura interna
 // Autor: Joern Way
 // Licencia: GNU GPL 3.0
 // creado: 23. oct 2021
 // Actualización: 23. oct 2021
 """
 
  #Primenta importación necesaria libs
 importar máquina # Importante para obtener alfileres y configurarlos
 importar uti # Para un poco de temporizador
 
 sensor = máquina.Adular(4) # Crear sensor de objeto e INIT como PIN ADC (4)
 factor de conversión = 3.3 / 65535 # 3.3v son 16bit (65535)
 
 muecero Cierto:
     ValeTemp = sensor.Read_u16() * factor de conversión
     Temperatura = 27 - (ValeTemp - 0.706) / 0.001721 # 5.9.5 de Hoja de datos RP2040
     impresión('Valor de temperatura:'+ "{: .2f}".formato(Temperatura)) # Imprimir en terminal con dos decimales
     uti.dormir(2) # Duración por dos segundos

Código 2: Programa simple para leer el sensor de temperatura interna

Primero, la línea "conversion_factor = 3.3 / 65535", para la se define un factor de corrección. Necesitamos esto porque la Pico nos dará después un valor analógico entre 0 y 65535 con la salida del sensor. El valor es interesante porque tiene un tamaño de 2 bytes o 16bits. Dado que 3,3 voltios corresponde a 65535, necesitamos esto para convertir los 2 bytes en un voltaje.

Luego llegamos a la línea "valueTemp = sensor.read_u16() * conversion_factor" en la primero se lee el valor del sensor y luego se multiplica directamente con el factor de conversión. Lo menos interesante es la multiplicación, más en este caso el read_u16 (), que se utiliza para obtener un valor de 16 bits. A diferencia de read (), donde sólo se devuelve un valor binario, con read_u16 () le indicamos a MicroPython para que genere el valor en 2 bytes, lo que tiene sentido para un Pin analógico.

Por último, la línea "temp = 27 - (valueTemp - 0.706) / 0.001721", que se usa para calcular finalmente la temperatura del sensor Pico de temperatura. No he inventado esta fórmula, pero se puede encontrar en la hoja de datos de la Pico en el capítulo 4.9.5.

La salida en la consola, que es todo lo que nuestro programa puede hacer por el momento, tampoco es muy espectacular, véase la Figura 3.

Figura 3: Salida de temperatura en la consola.

Figura 3: Salida de la temperatura en la consola

Para que esto funcione para usted, sólo tiene que presionar F5 o el botón verde de Run. Sin embargo, pronto se dará cuenta de que el sensor de temperatura interno no es muy preciso. No obstante, esto no debería preocuparnos demasiado en este ejemplo.

Visualización de la temperatura en un I2C-OLED

En el siguiente paso, la temperatura ya no se mostrará a través de la línea de comando, sino a través de una pantalla OLED para su uso sin conexión a una PC. En mi caso, la pantalla OLED I2C SSD1306 de 0,96 pulgadas con 128x64 píxeles. Lo mejor es que la conexión sólo requiere 4 cables, véase la Figura 4, una biblioteca y pocas líneas más de código.

Figura 4: Cableado Pico con pantalla OLED

Figura 4: Cableado de Pico con pantalla OLED

El cableado ya se encuentra de forma bastante fija, así que continuaremos directamente en el Thonny Python IDE con la biblioteca requerida. En primer lugar, se debe abrir la gestión de paquetes, véase la Figura 5.

Figura 5: Administración de paquetes abiertos

Figura 5: Gestión de paquetes abiertos

A continuación, se abre una nueva ventana en la que puede buscar paquetes, es decir, bibliotecas para el hardware adicional, como desee. En nuestro caso, necesitamos una biblioteca MicroPython para el controlador SSD1306. Para hacer esto, simplemente ingrese SSD1306 en la ventana de búsqueda y presione Enter o buscar en PyPi y seleccione el paquete micropython-ssd1306, véase la figura 6.

Figura 6: Búsqueda de la biblioteca MicropyThon para SSD1306

Figura 6: Búsqueda de la biblioteca MicroPython para SSD1306

Inmediatamente en el siguiente paso, presione el botón Instalar, con lo que se crea una carpeta lib en la Pico y la biblioteca MicroPython para el SSD1306 también se copia exactamente en esta carpeta lib, véase la Figura 7.

Figura 7: Instalación de la biblioteca MicropyThon para SSD1306

Figura 7: Instalación de la biblioteca MicroPython para SSD1306

Por lo tanto, ahora que tenemos la biblioteca, se debe programar correctamente la pantalla, consulte el Código 3.


 """
 // leer sensor de temperatura interna y
 // mostrar en i2c-oled
 // Autor: Joern Way
 // Licencia: GNU GPL 3.0
 // creado: 23. oct 2021
 // Actualización: 24. oct 2021
 """
 
  #Primenta importación necesaria libs
 de SSD1306 importar SSD1306_I2C #Meport desde lib la subparte necesaria
 de máquina importar Alfiler, I2C
 importar máquina  # Importante para obtener alfileres y configurarlos
 importar utime # Para un poco de temporizador
 
 #DEFINICIONES PARA EL SENSOR TEMPERAL INTERNO
 sensor = máquina.Adular(4) # Crear sensor de objeto e INIT como PIN ADC (4)
 factor de conversión = 3.3 / 65535 # 3.3v son 16bit (65535)
 
 #Definitons para i2c-com
 sda=Alfiler(0)
 scl=Alfiler(1)
 I2C=I2C(0, sda=sda, scl=scl, freq=400000)
 
 #Write en cmd se encuentra direcciones
 i2cscan = I2C.escanear()
 encimera = 0
 por I en i2cscan:
     impresión("Dirección I2C" + str(encimera) + "     : "+maleficio(I).superior())
     encimera+=1
 
 #DEFINICIONES PARA PANTALLA OLED
 ANCHO = 128
 Hight = 64
 oled = SSD1306_I2C(ANCHO, Hight, I2C)
 
 I = 0
 tiempo Cierto:
     valeTemp = sensor.read_u16() * factor de conversión #
     temperatura = 27 - (valeTemp - 0.706) / 0.001721 # Ver 4.9.5 de la hoja de datos RP2040
     impresión('Valor de temperatura:'+ '{: .2f}'.formato(temperatura)) # Imprimir en terminal con dos decimales
     impresión('Encimera: ' +str(I))
     # Escribe datos para mostrar
     oled.llenar(0)
     oled.texto('TEMP INTERNA',6,8)
     oled.texto('TEMP:',6,22)
     oled.texto(str(ronda(temperatura,2)),50,22)
     oled.texto('*C',95,22)
     oled.texto('Encimera: ' + str(I),6,36)
     oled.show()
     I+=1
     utime.dormir(2) # Duración por dos segundos


Código 3: Código del primer ejemplo ampliado para incluir la pantalla OLED

Los comentarios explican exactamente lo que estoy haciendo, pero se encuentran algunas secciones que me gustaría explica brevemente. Empezando por "from ssd1306 import SSD1306_I2C", donde cargamos o proporcionamos la parte SSD1306_I2C de la biblioteca ssd1306. Esto significa que no tenemos que cargar toda la biblioteca, sino cargar exactamente la parte que nos interesa.

Tras el comentario "#Definitions for i2c-Com", al principio no ocurre nada interesante. Primero se declaran los pines para SDA y SCL, y luego se crea la interfaz i2c 0 con los pines ya declarados y la frecuencia 400kHz. Después, lo que para mí es una salida interesante, mi programa consulta todas las direcciones hexadecimales disponibles para ver si hay algún participante presente y emite las direcciones de participantes encontradas en la línea de comandos a través del bucle for.

A continuación, después del comentario "#Definitions for OLED-Display", declaro el tamaño de la pantalla y creo un objeto con todos los parámetros necesarios para la pantalla.

Posteriormente, se modificó el bucle while para que la temperatura y un pequeño contador se muestren tanto en la línea de comando como en la pantalla, véase la Figura 8.

Figura 8: Salida OLED

Figura 8: Salida del OLED

He añadido el contador para poder ver que mi Pico sigue funcionando y no se ha quedado atascada sin que se detecte.

Lectura de la temperatura de un GY-BME280

Como probablemente haya notado o leído en la documentación de la Pico, la lectura de la temperatura del sensor interno no es realmente precisa. En este punto siempre me gusta utilizar el sensor barométrico GY-BME280 para la temperatura, la humedad y la presión atmosférica, ya que me proporciona todos los datos relevantes de manera directa. Ya he utilizado este sensor en anteriores publicaciones del blog. Dado que el GY-BME280 también se comunica a través de i2c, por el momento sólo se necesitan cuatro cables adicionales, además de los que ya se utilizan para la pantalla OLED, véase la Figura 9.

Figura 9: Conecte el GY-BME280

Figura 9: Conexión del GY-BME280

Si ha leído las hojas de datos del OLED y del GY-BME280, se habrá dado cuenta de que ambos utilizan direcciones diferentes, por lo que podemos conectar ambos componentes en serie. Si las direcciones fueran las mismas, tendríamos que crear otra interfaz i2c desde la Pico. Ahora busque bme280 en la gestión de paquetes y selecciona la biblioteca micropython-bme280 para su instalación, aunque la descripción se refiera al ESP8266/ESP32, véase la Figura 10.

Figura 10: Instalación de la biblioteca para BME280

Figura 10: Instalación de la biblioteca para BME280


Con esto, una biblioteca para nuestro sensor está ahora disponible y nuestro código de ejemplo se puede extender por unas pocas líneas, consulte el Código 4.


 '''
 // Leer BME280 y
 // mostrar en i2c-oled
 // Autor: Joern Way
 // Licencia: GNU GPL 3.0
 // creado: 23. oct 2021
 // Actualización: 24. oct 2021
 '''
 
  #Primenta importación necesaria libs
 de SSD1306 importar SSD1306_I2C #Meport desde lib la subparte necesaria
 de BME280 importar BME280 #Import bme280-lib
 de máquina importar Código PIN, I2C
 importar máquina  # Importante para obtener alfileres y configurarlos
 importar uti # Para un poco de temporizador
 
 #DEFINICIONES PARA EL SENSOR DE TEMP INTERNO
 sensor = máquina.Adular(4) # Crear sensor de objeto e INIT como PIN ADC (4)
 factor de conversión = 3.3 / 65535 # 3.3v son 16bit (65535)
 
 #Definitons para i2c-com
 Sda=Código PIN(0)
 Scl=Código PIN(1)
 I2C=I2C(0, Sda=Sda, Scl=Scl, freq=400000)
 
 #Write en cmd se encuentra direcciones
 I2cscan = I2C.escanear()
 Encimera = 0
 por I en I2cscan:
     impresión('I2C Dirección' + cuerda(Encimera) + '     : '+maleficio(I).superior())
     Encimera+=1
 impresión('---------------------------')
 #DEFINICIONES PARA PANTALLA OLED
 Ancho = 128
 Hight = 64
 Oled = SSD1306_I2C(Ancho, Hight, I2C)
 
 #Definición para BME280
 sensor = BME280(I2C=I2C)
 
 I = 0
 muecero Cierto:
     ValeTemp = sensor.Read_u16() * factor de conversión #
     Temperatura = 27 - (ValeTemp - 0.706) / 0.001721 # 5.9.5 de Hoja de datos RP2040
     TEMPC, preshpa, Humrh = sensor.Valores # Valores actuales de recibe de GY-BME280 como tupla
     TEMPC = TEMPC.reemplazar('C','* C')
     impresión('Valor de temperatura:'+ '{: .2f}'.formato(Temperatura) +'* C') # Imprimir en terminal con dos decima
     impresión('Temperatura BME:' + TEMPC)
     impresión('Presión BME:' + preshpa)
     impresión('Humidy BME:' + Humrh)
     impresión('Encimera:' + cuerda(I))
     impresión('>-----------<')
     # Escribe datos para mostrar
     Oled.llenar(0)
     Oled.texto('GY-BME280',6,0)
     Oled.texto('Temperatura:' + TEMPC,6,14)
     Oled.texto('Pres:' + preshpa,6,28)
     Oled.texto('HUMI:' + Humrh,6,42)
     Oled.texto('Encimera:' + cuerda(I),6,56)
     Oled.show()
     I+=1
     uti.dormir(2) # Duración por dos segundos

Código 4: Medición con GY-BME280

Como en el código anterior, los cambios son sencillos. En primer lugar, BME280 se carga desde la biblioteca bme280. Después del comentario "#Definition for BME280" se crea un objeto sensorBME y se transfiere la interfaz i2c. La parte interesante ocurre en el bucle while. Aquí, los datos del entorno legibles para las personas se transfieren a las variables tempC, preshPA, humRH en una Tupla usando "sensorBME.values".

Posteriormente, estos datos se muestran en la pantalla, véase la Figura 11.

Figura 11: Datos BME280 en la pantalla OLED

Figura 11: Datos de BME280 en la pantalla OLED

Como todavía estoy interesado en los valores que entrega la Pico, los he dejado en la salida de la línea de comandos, véase la Figura 12.

Figura 12: Edición de la línea de comandos

Figura 12: Salida de la línea de comandos

Mi script no se ejecuta / no se inicia sin una PC

Probablemente ya habrá intentado usar los scripts en Thonny Python IDE. ¡Aquí se debe prestar absolutamente atención a dos cosas!

  1. Si guarda un script de Python, siempre tiene que incluir la extensión .py al guardarlo. De lo contrario, el código dejará de ser reconocido a continuación y los cambios ya no serán posibles.
  2. Para que su código funcione sin una PC y Thonth Python IDE, el archivo a ejecutar se debe llamar py en la Raspberry Pi Pico. Si la Pico encuentra este archivo, se ejecutará el script incluido.

He resumido ambas cosas una vez más en la Figura 13.

Figura 13: Montipos de Pico

Figura 13: Características de Pico


Resumen

Incluso si usted "sólo" ha trabajado con nuestros microcontroladores ESP32/ESP8266 o Nano V3.0 y el Arduino IDE hasta ahora, este pequeño ejemplo se debería implementar con bastante rapidez. Efectivamente existe la posibilidad de utilizar el Arduino IDE para programar la Pico (algo de información aquí). Sin embargo, en mi opinión personal, debería programar con el Thonny Python IDE y MicroPython. Este último tiene la ventaja de que aquí se aprende probablemente uno de los lenguajes de programación más importantes, como es Python. Este lenguaje se ha vuelto tan popular que muchas herramientas de hackers también se implementen con este lenguaje de scripting.

Siéntase libre de tratar de entender estos tres ejemplos con más detalle y tal vez crear dos conexiones i2c separadas. También sería posible utilizar dos conexiones GY-BME280 y emplear la media de ambas mediciones. Las modificaciones de estos ejemplos bastantes simples son casi ilimitadas, pero deberían mostrar el comienzo bastante sencillo. Espero haberlo conseguido, para que se decante por la Pico y no por el más potente ESP32.

Puede encontrar más proyectos míos para AZ-Delivery en https://github.com/M3taKn1ght/Blog-Repo.

DisplaysProjekte für anfängerRaspberry piSensoren

12 comentarios

JoKa

JoKa

Hallo, mit dem 1. Beispiel ‘Die Temperatur vom Pico auslesen’ hatte ich auch Probleme.
Erst nachdem ich alle Bemerkungen und die 1. Leerstelle gelöscht hatte lief das Beispiel.

JoKa

JoKa

Hallo, leider kämpfe ich immer noch mit der Technik. Egal ob Thonny, oder Arduino-IDE überall fehlt es an passenden Treibern usw. . In diesem Blog konnte ich den Treiber für das Display installieren. Bei der Installation des BME280 kam die Fehlermeldung, dass der wohl nicht für das MicroPython sei. Wollte dann das Beispiel
‘Die Temperatur auf einem i2c-OLED anzeigen’ ausprobieren. Fehlermeldung:
Traceback (most recent call last):
File “”, line 1
SyntaxError: invalid syntax
Da in Zeile 1 nur """ steht, ist mir unverständlich wo da der Fehler sein soll.
Leider konnte ich das Beispiel nur stückweise markieren und in eine getrennte Textdatei kopieren. Vielleicht kann man in diesem Blog auch die oft zu findene Funktion ’ in die Zwischenablage kopieren’ einbauen. Oder gibt es dafür einen mir noch unbekannten Trick?
Mit dem Thonny habe ich noch weitere Probleme: Abspeichern der Datei oft nicht möglich, weil das Prog. aktiv ist. Keine Ahnung, wie man das umgehen kann.
Mit der Arduino-IDE komme ich besser zurecht. Aber da fehlt es auch an passenden Beispielen und den richtigen Treibern.
Gruß, JoKa

Wolfhard Jording

Wolfhard Jording

Die OLED Ansteuerung funktionierte bei mir nicht. Ich programmieren den Pico über ein Raspi 4. Folgendes habe ich geändert:
#import machine #Important to get Pins and config them - entfernt

#i2c=I2C
i2c = machine.I2C
Jetzt funktioniert das 2. Beispielprogramm

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.

Deja un comentario

Todos los comentarios son moderados antes de ser publicados