Avançar para o conteúdo

Sensor de temperatura com microPython

Vamos aprender como ler e imprimir na tela um sensor de temperatura HDC1080 com microPython. Usaremos um Raspberry Pi RP2350 para essa tarefa, executando a versão mais recente do microPython.

Sensor de temperatura HDC1080 com Raspberry Pi Pico 2 RP2350
Sensor de temperatura HDC1080 com Raspberry Pi Pico 2 RP2350

Já vimos como começar com o RP2350 neste post, onde piscamos o LED integrado do Pi Pico 2 com o Thonny IDE. Vou explicar todo o processo do IDE novamente, só para ter certeza.

A ideia deste artigo é permitir que você leia a temperatura e a umidade do sensor HDC1080, via i2c e usando um Raspberry Pi Pico 2 RP2350. Escolhi o Thonny IDE como nosso software de programação porque ele é simples, leve e funcional o suficiente para o trabalho.

Hardware

A folha de dados do HDC1080 afirma que ele precisa de comunicação i2c para fornecer seus dados. Então, além de SDA e SCL, também precisamos de +3,3 V e GND, fornecidos pelo próprio Pi Pico 2. A tensão de alimentação para o próprio RP2350 vem via conexão USB C, que também traz dados para a placa. Veja na imagem abaixo o diagrama esquemático do experimento deste post.

Diagrama esquemático do sensor HDC1080 com RP2350
Diagrama esquemático do sensor HDC1080 com RP2350
raspberry pi pico 2 rp2350 com sensor hdc1080
Sensor HDC1080 com RP2350 montados em protoboard

A porta i2c do Raspberry Pi Pico 2 pode ser posicionada em uma variedade de pinos, como por exemplo i2c0 pode ir nos pinos 1-2, 4-5, 8-9, 16-17, e assim por diante. Os pinos “oficiais” e “originais” são 4 e 5, para serem compatíveis com o Arduino (que usa os pinos A4 e A5). Veja abaixo o diagrama completo de pinagem do Pi Pico 2.

Pinagem do Raspberry Pi Pico 2 RP2350
Pinagem do Raspberry Pi Pico 2 RP2350

Configurando a IDE Thonny

Acesse o site do Thonny IDE e baixe sua versão preferida (na verdade, a versão que se encaixa no seu sistema operacional). O meu é o Windows; siga as instruções na tela para instalá-lo (assim como qualquer outra instalação de software). Quando você abrir o IDE, haverá um menu na parte superior da tela, contendo “Arquivo”, “Editar”, “Exibir”, “Executar”, “Ferramentas” e “Ajuda”.

Vá em “Ferramentas > Opções…” e neste momento conecte sua placa Raspberry Pi Pico 2 ao computador por meio de um cabo USB. Vá para o submenu “Interpreter” e no menu suspenso selecione “Micropython (Raspberry Pi Pico)”. Em seguida, no menu suspenso “Porta ou WebRPL”, selecione a única (somente) porta COM que aparece. Clique em “OK” e observe a parte inferior da tela, ela deve ser parecida com a imagem abaixo.

Ela apresenta a versão do microPython, o nome da placa e “>>>” esperando você digitar algo. Isso significa que a placa foi reconhecida pelo Thonny IDE como executando microPython e está pronta para uso.

Parte inferior da Thonny IDE após conexão do Pi Pico 2
Parte inferior da Thonny IDE após conexão do Pi Pico 2

Código para o sensor HDC1080

O código para o nosso sensor HDC1080 não é meu, eu o encontrei no Github neste link. Você terá que criar dois arquivos “.py” para que este exemplo funcione, um é o código HDC1080 em “hdc1080.py”. O outro é o nosso arquivo principal contendo o uso da função e a impressão da tela (“main.py”). Ambos terão que ser salvos no próprio Pi, não no seu computador.

Primeiro copie o código abaixo:

# SPDX-FileCopyrightText: 2024 Mike Causer <https://github.com/mcauser>
# SPDX-License-Identifier: MIT

"""
MicroPython HDC1080 Temperature & Humidity Sensor
https://github.com/mcauser/micropython-hdc1080
"""

__version__ = "1.0.1"

from micropython import const
from time import sleep_ms

# registers
_TEMPERATURE = const(0x00)
_HUMIDITY = const(0x01)
_CONFIG = const(0x02)
_SERIAL_ID0 = const(0xFB)
_SERIAL_ID1 = const(0xFC)
_SERIAL_ID2 = const(0xFD)
_MANUFACTURER_ID = const(0xFE)
_DEVICE_ID = const(0xFF)


class HDC1080:
    def __init__(self, i2c):
        self._i2c = i2c
        self._address = 0x40  # fixed I2C address
        self._buf1 = bytearray(1)
        self._buf2 = bytearray(2)
        self._config = 0x10

    def _read16(self, reg):
        self._buf1[0] = reg
        self._i2c.writeto(self._address, self._buf1)
        sleep_ms(20)
        self._i2c.readfrom_into(self._address, self._buf2)
        return (self._buf2[0] << 8) | self._buf2[1]

    def _write_config(self):
        self._buf2[0] = _CONFIG
        self._buf2[1] = self._config
        self._i2c.writeto(self._address, self._buf2)

    def _read_config(self):
        # shift out the first 8 reserved bits
        self._config = self._read16(_CONFIG) >> 8

    def check(self):
        if self._i2c.scan().count(self._address) == 0:
            raise OSError(f"HDC1080 not found at I2C address {self._address:#x}")
        return True

    def config(
        self, config=None, humid_res=None, temp_res=None, mode=None, heater=None
    ):
        if config is not None:
            self._config = config
            self._write_config()
        else:
            self._read_config()
            if humid_res is not None:
                # 00 = 14-bit, 01 = 11-bit, 10 = 8-bit
                if humid_res == 8:
                    self._config |= 2
                    self._config &= ~1
                elif humid_res == 11:
                    self._config &= ~2
                    self._config |= 1
                elif humid_res == 14:
                    self._config &= ~3
                else:
                    raise ValueError("humid_res must be 8, 11 or 14")
            if temp_res is not None:
                # 0 = 14-bit, 1 = 11-bit
                if temp_res == 11:
                    self._config |= 4
                elif temp_res == 14:
                    self._config &= ~4
                else:
                    raise ValueError("temp_res must be 11 or 14")
            if mode is not None:
                # mode 0 = temp or humid acquired
                # mode 1 = temp and humid acquired in sequence, temp first
                self._config &= ~16
                self._config |= (mode & 1) << 4
            if heater is not None:
                self._config &= ~32
                self._config |= (heater & 1) << 5
            self._write_config()

    def reset(self):
        self._config = 128
        self._write_config()
        # sw reset bit self clears
        self._read_config()

    def battery_status(self):
        # returns 0 if Vcc > 2.8V
        # returns 1 if Vcc < 2.8V
        self._read_config()
        return (self._config >> 3) & 1

    def temperature(self):
        # temperature in celsius
        return (self._read16(_TEMPERATURE) / 65536) * 165 - 40

    def humidity(self):
        # relative humidity percentage
        return (self._read16(_HUMIDITY) / 65536) * 100

    def serial_number(self):
        # unique per device
        return (
            (self._read16(_SERIAL_ID0) << 24)
            | (self._read16(_SERIAL_ID1) << 8)
            | (self._read16(_SERIAL_ID2) >> 8)
        )

    def manufacturer_id(self):
        # fixed 21577 == 0x5449 == b'\x54\x49' == b'TI'
        return self._read16(_MANUFACTURER_ID)

    def device_id(self):
        # fixed 4176 == 0x1050 == b'\x10\x50' == b'\x10P'
        return self._read16(_DEVICE_ID)

Cole-o no Thonny IDE e vá em “File > Save As..”, depois escolha “Raspberry Pi Pico” no menu abaixo. Nomeie-o como “hdc1080.py”.

Tela de "Salva como..." da Thonny IDE
Tela de “Salva como…” da Thonny IDE

Vá em “Arquivo > Novo” e copie/cole o código abaixo, nosso código principal:

# SPDX-FileCopyrightText: 2024 Mike Causer <https://github.com/mcauser>
# SPDX-License-Identifier: MIT

"""
MicroPython HDC1080 Basic example

Prints the temperature and humidity every 500ms
"""

from machine import I2C
from hdc1080 import HDC1080

i2c = I2C(0)
hdc = HDC1080(i2c)

from time import sleep_ms

hdc.config(humid_res=14, temp_res=14, mode=0, heater=0)

if hdc.check():
    print(f"Found HDC1080 with serial number {hdc.serial_number()}")

while True:
    print(f"{hdc.temperature()} C, {hdc.humidity()} RH")
    sleep_ms(1000)

Então vá em “Arquivo > Salvar como”, escolha “Raspberry Pi Pico” e nomeie-o como “main.py”. Agora clique na seta verde no topo da tela (“Executar script atual”) ou pressione “F5”. Você começará a ver informações sendo impressas na parte inferior da tela, como na imagem abaixo.

Temperatura e umidade no shell da Thonny IDE
Temperatura e umidade no shell da Thonny IDE

Pra finalizar

Primeiro você verá o número de série da placa HDC1080, depois a temperatura em graus Celsius e a umidade em %RH serão exibidas na tela a cada 1000 ms (1 segundo). Uma coisa que notei é que toda vez que você remove a conexão da placa (USB) e a reconecta, você tem que fazer um pequeno processo.

Este processo envolve ir em “Ferramentas > Opções” e selecionar novamente a porta COM. Além disso, você tem que clicar na seta verde na parte superior da tela (executar código, “F5”) novamente todas as vezes. Acho que isso é parte do uso de uma tecnologia “mais nova” que é fácil de um lado e mais complexa do outro. Abaixo está um vídeo meu mostrando como este sensor funciona com o RP2350.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *