Raspberry Pi Meteostanice - teplotní čidlo DS18B20

Když jsem zjistil, že Sense Hat je pro meteostanici celkem nepoužitelný (kvůli nutné korekci), rozhodl jsem se vyzkoušet teplotní čidlo DS18B20. Toto čidlo je možné rovnou z výroby sehnat na 2 metry dlouhém kabelu a tak mi přišlo jako správná volba. Jak ho tedy připojit a použít?

DS18B20 je digitální teplotní čidlo a je ho tedy velmi jednoduše možné připojit k GPIO sběrnici na Raspberry Pi. Je ho možné koupit ve několika různých provedeních. Buď jen čidlo (gme.cz) nebo doplněné o vodotěsný obal a většinou dvoumetrový kabel (Alza.cz, ale dá se sehnat i levněji 🙂.
Také parametry tohoto čidla jsou výrazně lepší než u teplotních čidel u Sense Hatu. Například teplotu umožňuje měřit v rozsahu -55 až +125 °C.

Jak tedy toto čidlo připojit k Raspberry Pi?

Nejprve je nutné doplnit samotné čidlo o odpor 4k7 nebo 10k. Tento odpor je potřeba připojit mezi napájení a datový konektor čidla.

Obrázky se nestihly načíst.
Prosím opakujte akci zachvilku.


Jakmile je odpor připojen je možné čidlo připojit ke GPIO sběrnici. Napájení (červený drátek na čidlech s kabelem) je možné buď pinů 1 a 17 (3,3 V) nebo z pinů 2 a 4 (5V). Není rozdíl mezi zvoleným napájením. Čidlo zvládne obojí. Uzemnění (černý drátek) připojte na některý z pinů označených Ground (tedy 6, 9, 14, 20, 25, 30, 34 nebo 39). Poslední nezapojený vodič je datový a bývá většinou bílý nebo žlutý. Tento vodič je potřeba připojit k některému z pinů označených GPIO. Nejčastěji se volí GPIO4 (tedy pin 7) kvůli blízkosti k napájení a uzemnění.

Načtení hodnoty z čidla.

Pokud je čidlo správně připojeno tak můžeme začít nastavovat Raspberry Pi.
Nejprve je potřeba do souboru /boot/config.txt doplnit řádku dtoverlay=w1-gpio.


sudo vim /boot/config.txt


Například na konec tohoto souboru dopište

dtoverlay=w1-gpio

a soubor uložte.

Pak je potřeba Raspberry Pi restartovat.

sudo reboot


Jakmile Raspberry Pi opět nabootuje tak do terminálu napište:


sudo modprobe w1-gpio
sudo modprobe w1-therm


Pak je možné přejít do adresáře /sys/bus/w1/devices, ve kterém se bude nacházet další adresář pojmenovaný 28-xxxx kde xxxx je několik „náhodných“ znaků (například 28-000007af5b8d). Pokud vstoupíte do tohoto adresáře, tak v něm naleznete soubor w1_slave. V tomto souboru je možné si přečíst aktuální teplotu.


cd /sys/bus/w1/devices
ls
cd 28-xxxx
cat w1_slave


Výsledek by měl vypadat nějak takto

Obrázky se nestihly načíst.
Prosím opakujte akci zachvilku.


V odpovědi by měli být dvě řádky. První může končit na YES nebo NO. Pokud končí na YES tak naměřená teplota je na konci druhé řádky. V mém případě tedy t=437. Toto je nutné vydělit 1000 abychom dostali správnou teplotu ve °C. Údaj t=437 tedy znamená teplotu 0,437 °C.

Program v Pythonu

Pokud se všechno podařilo, čidlo funguje správně a jsme z něho schopni načítat teplotu, můžeme napsat jednoduchý program v Pythonu, kterým budeme teplotu načítat v nekonečné smyčce.


import os
import glob
import time

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

time.sleep(20)

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

def read_temp_raw():
  f = open(device_file, 'r')
  lines = f.readlines()
  f.close()
  return lines

def read_temp():
  lines = read_temp_raw()
  while lines[0].strip()[-3:] != 'YES':
    time.sleep(0.2)
    lines = read_temp_raw()
  equals_pos = lines[1].find('t=')
  if equals_pos != -1:
    temp_string = lines[1][equals_pos+2:]
    temp_c = float(temp_string) / 1000.0
    temp_f = temp_c * 9.0 / 5.0 + 32.0
    
    cas = time.strftime("%Y-%m-%d %H:%M:%S")
    return temp_c, temp_f, cas

while True:
  print(read_temp())
  time.sleep(60)


Tento program v nekonečné smyčce načítá hodnoty teploty z čidla a vypisuje je na obrazovku terminálu. Po úspěšném načtení hodnoty čeká 60 vteřin než načte další teplotu. Teploty načítá ve °C a přepočítává a vypisuje je také ve °F 🙂.

Také můžeme stejně jako u předchozího pokusu se Sense Hatem doplnit zápis naměřených hodnot do databáze.

Příklad se zápisem hodnot do databáze MySQL.

Příklad se zápisem hodnot do databáze PostgreSQL.

Specifikace čidla:
Napájení 3.0 – 5.5 V
Teplotní rozsah -55°C až +125°C
Přesnost ±0.5°C od -10°C do +85°C

Zdroje:
https://learn.adafruit.com/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing/overview
https://leanpub.com/

Meteostanice, Python

- (10. 2. 2020)

Líbil se vám článek?

Nasdílejte ho svým přátelům na sociálních sítích.

Pinterest

Názory, připomínky a jiné komentáře

SUPER! Díky moc. Zajímavé informace, jen tak dále :-)

Děkuji za pochvalu. Snažím se. :-)

Dobrý den, děkuji Vám za vaše rdy a postupy zde na webu.
Jsem u rapsberry nováček a snažím se zprovoznit malou meteostanici, pomocí rpi a Turrise. Upravil jsem si Váš příklad s ds18b20 a už funguje, nainstaloval jsem si mysql na turise a vypadá že i běží :-), ale pak jsem zjistil, že python příkladpro zápis do databáze, není pro mysql :-( a tím jsem skončil.
Nemáte náhodou řešení i pro mysql?
Druhá otázka, jak docílit čtení více čidel na 1-w sběrnici? pokoušel jsem se script upravit, ale pythonu zatím moc nerozumím .

Předem děkuji za jakoukoli radu.

S pozdravem

Mirek

Zdravím Mirku,

doplnil jsem na svůj GitHub ukázku scriptu s připojením na MySQL. Odkaz případně naleznete o kousek výše.

Ohledně 1-w sběrnice nevím. Vím jen, že je možné čidla ds18b20 spojovat paraelně a mít tak na jednu trojici pinů připojeno více než jedno čidlo.

Dobrý den,

zkouším rozchodit teplotní čidlo s RPI, mám verzi DS18B20 z GME bez vodotěsného kabelu. Bohužel se mi ani po poněkolikáté nedaří čtení teploty rozchodit. Se sběrnicemi nemám mnoho zkušeností, na RPI ještě méně. Poradil byste mi prosím, kde by mohl být problém? Moduly mám připojeny:

root@raspberrypi:~# lsmod | grep w1
w1_therm 6401 0
w1_gpio 4818 0
wire 32619 2 w1_gpio,w1_therm

V adresáři se zařízeními teploměr není vůbec k dispozici:

root@raspberrypi:~# ls -l /sys/bus/w1/devices/
total 0
lrwxrwxrwx 1 root root 0 Feb 27 20:05 w1_bus_master1 -> ../../../devices/w1_bus_master1

Děkuji, J.

Zdravím Jakube,
zkuste příkaz
ls -l /sys/devices/w1_bus_master1/

Dobrý den,

zkouším:

root@raspberrypi:/home/pi# ls -l /sys/devices/w1_bus_master1/
total 0
lrwxrwxrwx 1 root root 0 Feb 28 18:10 driver -> ../../bus/w1/drivers/w1_master_driver
drwxr-xr-x 2 root root 0 Feb 28 18:10 power
lrwxrwxrwx 1 root root 0 Feb 28 18:10 subsystem -> ../../bus/w1
-rw-r--r-- 1 root root 4096 Feb 28 18:10 uevent
-rw-rw-r-- 1 root root 4096 Feb 28 18:10 w1_master_add
-r--r--r-- 1 root root 4096 Feb 28 18:10 w1_master_attempts
-rw-rw-r-- 1 root root 4096 Feb 28 18:10 w1_master_max_slave_count
-r--r--r-- 1 root root 4096 Feb 28 18:10 w1_master_name
-r--r--r-- 1 root root 4096 Feb 28 18:10 w1_master_pointer
-rw-rw-r-- 1 root root 4096 Feb 28 18:10 w1_master_pullup
-rw-rw-r-- 1 root root 4096 Feb 28 18:10 w1_master_remove
-rw-rw-r-- 1 root root 4096 Feb 28 18:10 w1_master_search
-r--r--r-- 1 root root 4096 Feb 28 18:10 w1_master_slave_count
-r--r--r-- 1 root root 4096 Feb 28 18:10 w1_master_slaves
-r--r--r-- 1 root root 4096 Feb 28 18:10 w1_master_timeout
-r--r--r-- 1 root root 4096 Feb 28 18:10 w1_master_timeout_us

nicméně žádný ze souborů neobsahuje žádný smysluplný údaj týkající se čidla:

root@raspberrypi:/home/pi# find /sys/devices/w1_bus_master1/ -type f -exec cat {} \;
64
0
cat: /sys/devices/w1_bus_master1/power/autosuspend_delay_ms: Input/output error
0
auto
unsupported
0xb700de48
10
write device id xx-xxxxxxxxxxxx to remove slave
0
69
write device id xx-xxxxxxxxxxxx to add slave
1
not found.
w1_bus_master1
-1
DRIVER=w1_master_driver
0

Pokud Vás něco napadne, budu rád, za každou radu.

Díky moc, J.

Říkal jsem si, jestli se s novým Raspbianem něco nezměnilo (jako přechod z PHP5 na PHP7).

Tady bych si spíš myslel, že máte čidlo špatně připojené. Máte tam odpor? Mezi pacičkama? Máte čidlo připojené na správné piny? Atd.

Ano, zapojení dle návodu. Zkusil jsem tedy všecho odpojit a poctivě zapojit znovu a nyní již funguji. Zřejmě jsem buď něco špatně zapojil nebo špatný kontakt v nepájivém poli. Jinak návod je vynikající, jednoduchý a účinný.

Každopádně díky za snahu a rady :-)

J.

P.S. ještě drobnost, přidal jsem při testování různých postupů do /boot/config.txt:

dtoverlay=w1-gpio,gpiopin=4

nevím, jestli to problém řeší (defaultní využití pinů apod.)

Tak to jsem rád, že už fungujete.

Mě všechno funguje s dtoverlay=w1-gpio. Mám k jednomu RPi připojena 3 čidla (DS18B20, DHT-22 a MPL3115A2). Ale nemyslím si, že by tento rozdíl řešil problém.

Ahoj, mohu poprosit o radu, jak upravit verzi s exportem do mysql na více teplotních čidel DS18B20? S programováním se nevím rady.

Díky

Moc děkuji za skvělé návody a ukázky. Jsem uplný začátečník, ale vše je srozumitelné tak mi to funguje dobře.
Jen jsem se chtěl zeptat, vím že je to mimo to to téma, ale připojuji se přes VNCServer a problém je, že pokud není připojen monitor tak logicky po restartu se zobrazí jen černá obrazovka s textem, že zobrazení není možné.
Tak se chci jen zeptat jestli by se to nedalo nějak obejít a nebo nemám strácet čas hledáním něčeho co opravdu nejde.
Mám Raspberry PI4. Moc děkuji za odpověď.

Připojujte se přes SSH https://charlieblog.eu/clanek-raspberry-pi-webserver-ssh
Na VNC se vyprdněte ;-)

Vložit nový komentář

Jsem programátor, horolezec a tak trochu FlexiBee fanatik :-).
Na CharlieBlogu sepisuji své nápady a poznatky už od roku 2006.

Powered by CharlieBlog Engine v2.3 - Login