
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:
