rpi3 IMG 20260304 191114

Como eu descrevi no artigo anterior, atualizando a câmera do raspberry pi 3, eu comprei também um sensor de temperatura.  Não que eu precisasse, não que eu tenha um uso pra ele.  A janela aqui tem vedação dupla e não tem como eu colocar ele do lado de fora sem arrebentar alguma coisa ou da janela ou do sensor.  Então fica aqui dentro.

Pra ativar esse camarada, eu precisei rodar o raspi-config e habiltar a interface wire-1 em "interface options".  E depois rebootar.

Ele aparece habilitado no boot:

root@raspberrypi3 /h/pi [0|1]# dmesg | grep -i wire
[   15.395743] Driver for 1-wire Dallas network protocol.
[   15.466930] gpio-4 (onewire@0): enforced open drain please flag it properly in DT/ACPI DSDT/board file
[   15.497220] w1_master_driver w1_bus_master1: Attaching one wire slave 28.00000025630b crc 48
[   21.844564] Bluetooth: HCI UART protocol Three-wire (H5) registered

 No caso, ele mostra que conectei no GPIO-4.

Pra ler os dados é baba: tem uma interface do kernel que te dá em formato txt.  Basta ler o conteúdo de& /sys/bus/w1/devices/28-00000025630b/w1_slave.  Imagino que esse caminho deva mudar se usar um GPIO diferente.

pi@raspberrypi3 ~> cat /sys/bus/w1/devices/28-00000025630b/w1_slave 
31 01 7f 80 7f ff 0f 10 90 : crc=90 YES
31 01 7f 80 7f ff 0f 10 90 t=19062

O valor da temperatura é o que está na segunda linha junto com o "t=".  No caso mostra 19062, que é 19.062°C.

Pra ler em Python, o jeito mais baba possível:

#! /usr/bin/env -S uv run --script

TEMPERATURE_SENSOR = "/sys/bus/w1/devices/28-00000025630b/w1_slave"

def GetLocalTemperature() -> str | None:
    """
    pi@raspberrypi3 ~> cat /sys/bus/w1/devices/28-00000025630b/w1_slave
    17 01 7f 80 7f ff 09 10 01 : crc=01 YES
    17 01 7f 80 7f ff 09 10 01 t=17437
    """
    temp_item: str = ""
    with open(TEMPERATURE_SENSOR) as fh:
        for line in fh.readlines():
            if not re.search("t=", line):
                continue
            line = line.rstrip()
            temp_item = line.split()[-1]
    if len(temp_item) == 0:
        return None
    temp_int = temp_item.split("=")[-1]
    temp = int(temp_int) / 1000.0
    return f"{temp:0.2f}"
    
if __name__ == '__main__':
    temp = GetLocalTemperature()
    print(f"Temperature: {temp}°C")

Eu segui várias dicas de lugares aleatórios, mas o melhor foi esse aqui:

https://cdn-learn.adafruit.com/downloads/pdf/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing.pdf

script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js">