Siguiendo con los post/publicaciones/ejemplos sobre la Raspberry Pico, ahora vamos a ver un ejemplo del ADC, el cual constara en mostrar la temperatura interna de este microcontrolador, para ello reutilizaremos nuestro post anterior post sobre la pantalla OLED para mostrar dicho dato, para este ejemplo también hemos usado el propuesto en el repositorio de la Pico.
Circuito:
El circuito utilizado será el mismo que ya teníamos montado anteriormente, simplemente la OLED conectado al puerto I2C de nuestra Pico.
Antes de ponernos a mostrar el código veamos algo sobre el ADC del RP2040, para ello puedes encontrar mas información en su datasheet en el capitulo "ADC and Temperature Sensor", como un dato diré que este tiene 5 canales, de los cuales uno esta conectado al sensor de temperatura dentro del RP2040, también se tiene que la resolución del ADC es de 12 bits.
Para aproximar la temperatura nos dan la siguiente formula.
Firmware:
Con la formula anterior ya es posible calcular la temperatura, lo primero que hacemos es seleccionar al canal del ADC (en este caso el 4), para posteriormente en nuestro bucle while leer el valor presente y hacer la conversión usando la formula anterior, una vez obtenida mostramos tanto en la OLED como en el IDE de Thonny y repetimos este proceso aproximadamente cada 5 segundos, el código usado es el siguiente.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Display Image & text on I2C driven ssd1306 OLED display | |
from machine import Pin, Timer, I2C, ADC | |
from ssd1306 import SSD1306_I2C | |
from time import sleep | |
import framebuf | |
sensor_temp = machine.ADC(4) | |
conversion_factor = 3.3 /(65535) | |
led = Pin(25, Pin.OUT) | |
timer = Timer() | |
WIDTH = 128 # oled display width | |
HEIGHT = 64 # oled display height | |
i2c = I2C(0) # Init I2C using I2C0 defaults, SCL=Pin(GP9), SDA=Pin(GP8), freq=400000 | |
print("I2C Address : "+hex(i2c.scan()[0]).upper()) # Display device address | |
print("I2C Configuration: "+str(i2c)) # Display I2C config | |
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Init oled display | |
# Raspberry Pi logo as 32x32 bytearray | |
buffer = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|?\x00\x01\x86@\x80\x01\x01\x80\x80\x01\x11\x88\x80\x01\x05\xa0\x80\x00\x83\xc1\x00\x00C\xe3\x00\x00~\xfc\x00\x00L'\x00\x00\x9c\x11\x00\x00\xbf\xfd\x00\x00\xe1\x87\x00\x01\xc1\x83\x80\x02A\x82@\x02A\x82@\x02\xc1\xc2@\x02\xf6>\xc0\x01\xfc=\x80\x01\x18\x18\x80\x01\x88\x10\x80\x00\x8c!\x00\x00\x87\xf1\x00\x00\x7f\xf6\x00\x008\x1c\x00\x00\x0c \x00\x00\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") | |
# Load the raspberry pi logo into the framebuffer (the image is 32x32) | |
fb = framebuf.FrameBuffer(buffer, 32, 32, framebuf.MONO_HLSB) | |
# Clear the oled display in case it has junk on it. | |
oled.fill(0) | |
# Blit the image from the framebuffer to the oled display | |
oled.blit(fb, 96, 0) | |
# Add some text | |
oled.text("Raspberry Pi",5,5) | |
oled.text("Pico",5,15) | |
oled.text("Testing ADC",5,25) | |
oled.text("by MrChunckuee",5,35) | |
# Finally update the oled display so the image & text is displayed | |
oled.show() | |
#Toggle LED on board using timer | |
def blink(timer): | |
led.toggle() | |
timer.init(freq=2, mode=Timer.PERIODIC, callback=blink) | |
while True: | |
reading = sensor_temp.read_u16() * conversion_factor | |
# The temperature sensor measures the Vbe voltage of a biased | |
# bipolar diode, connected to the fifth ADC channel | |
# Typically, Vbe = 0.706V at 27 degrees C, with a slope | |
# of -1.721mV (0.001721) per degree. | |
temperature = 27 - (reading - 0.706)/0.001721 | |
oled.fill_rect(44, 44, 72, 9, 0) # fill_rect(x-init, y-init, width, height, opts) | |
# Only print two decimal | |
oled.text(str("TEMP: {:.2f}".format(float(temperature))) + "C",5,45) | |
print("Temperatura interna del RP2040 = {:.2f}".format(temperature) + " C") | |
oled.show() | |
sleep(5) |
Video:
Acá un pequeño video del circuito en funcionamiento, en el script esta limitado a mostrar solo dos decimales de la temperatura aunque en el video se muestran mas (esto ya que grabe el video antes de implementar la opción de redondear los dígitos).
Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
Links:
- Raspberry Pi, "RP2040 datasheet", https://datasheets.raspberrypi.org/rp2040/rp2040-datasheet.pdf
- MicroPython, "class ADC – analog to digital conversion", https://docs.micropython.org/en/latest/library/machine.ADC.html
- Raspberry Pi Pico, "pico-micropython-examples", https://github.com/raspberrypi/pico-micropython-examples
- Pedro Sánchez - MrChunckuee, "Raspberry Pi Pico: Instalar o agregar librerias en Thonny", https://mrchunckuee.blogspot.com/2021/06/raspberry-pi-pico-instalar-o-agregar.html
0 Comentarios