1-wire snímače na I2C, přesnější měření teploty

V komentářích u článku o měření teploty přes čidla na I2C komentoval „DFZ“ nepoužití Dallasovských 1-wire čidel s tím, že připojit je přes GPIO4 a kernelový patch je snadné. Tak tedy zamyšlení a ukázka na téma 1-wire.


 

Něco málo teorie – co to je 1-wire?

„1-wire“ je patentní systém komunikace s čidly a obecně zdroji krátkých informací (teploměry, vlhkoměry, identifikační čipy, hodiny, malé paměti, …) od Dallas Semiconductors (nyní Maxim). Jedno z obchodních jmen této technologie je „iButton“ a rutinně se používá v docházkových systémech.

V jednodušší verzi stačí pro připojení zařízení dva vodiče – zem a obousměrný signálový drát. Jednotlivá koncová zařízení se v tomto případě napájejí parazitně ze signálového vodiče.

Pokud chcete mít maximální spolehlivost, můžete použít třívodičové zapojení – zem, napájení a signál.

Základním kouzlem 1-wire je rozumně navržený komunikační protokol a to, jak se obsluhuje sběrnice – a z obou těchto bodů vyplývající spolehlivost a maximální dosah. Na jednu sběrnici je možno připojit hodně čidel – až stovky zařízení. Dobře nastavený 1-wire bus s dobrým bus driverem (s aktivním napájením datového vodiče atd.) na kvalitním krouceném kabelu UTP-5 může fungovat až na vzdálenost v řádu 500 metrů a nenechá se rozhodit poměrně silným rušením. V amatérských podmínkách není problém připojovat zařízení vzdálená několik desítek metrů.

Jak připojit 1-wire zařízení k RPi?

Jsou v podstatě tři základní metody připojování 1-wire zařízení:

1) Použití hotového bus driveru na RS-232 nebo USB.

Existují moduly od Dallasu i od jiných výrobců (např. zde), které se připojí na USB nebo RS-232 a na druhém konci z nich kouká 1-wire. Jednoduché. Jeden problém je ale cena – mluvíme o řádově 30 USD. Druhý problém je, že to není elegantní – přece k RPi nebudeme připojovat ošklivý adaptér, který je stejně velký jako celá malina? A v neposlední řadě nemáme USB portů nazbyt, že?

2) Připojení čidel přímo na GPIO4 

Součástí distribuce Occidentalis je přímá podpora 1-wire čidel na GPIO4 pomocí bit-bangingu (tj. někdo v assembleru nakódoval správné sekvence nul a jedniček; pro časování se nepoužívá žádný hardware, je to čistě softwarové řešení). Stejná funkce se pomocí kernelového patchu „w1“ dá docpat i do běžného Raspbianu.

Jenže se mi to nelíbí.

Nelíbí se mi realizace. Distribuce Occidentalis mi nefungovala dobře. A řešení s kernelovým patchem znamená, že už nepoužíváte standardní kernel – a tedy při každém update systému musíte řešit, zda to bude fungovat i nadále. Kdyby se to dostalo do jádra Raspbianu, bylo by to něco jiného.

Nelíbí se mi ale ani samotná myšlenka, že se to bude řešit přímo na GPIO portu. Smysl to určitě má – pro jednotky čidel na drátu dlouhém max. desítky centimetrů. Ale představa, že by 1-wire bus byl delší a na jednom konci končil přímo procesorem RPi … brrr. Odolnost takového řešení proti indukci neočekávaných napětí je mizivá. Takže jednoho dne zjistíte, že vaše RPi shořelo.

Takže co nám zbývá?

3) Použití bus driveru pro I2C

Ano, to je správná cesta. Na I2C si připojíme bus driver – čip, který má na jedné straně I2C a na druhé jeden či více 1-wire busů. Když se něco semele, vyměníme jen spálený bus driver – a ten je navíc výrazně odolnější než procesor RPi. Takže tohle je určitě správná cesta.

Připojení 1-wire čidla teploty přes bus driver DS2482

DS2482-100 (25 Kč u TME) je to, co hledáme. (Maximalisté mohou použít DS2482-800 – to je stejný čip, ale má 8 1-wire busů.)

Datasheet.

Tenhle čip má jen jednu malinkou chybičku. Skoro přehlédnutelnou. Největší pouzdro, ve kterém se vyrábí, je SO-8. Tj. rozměry čipu jsou cca 4×6 mm a rozteč nožiček je poloviční proti běžným DIL pouzdrům – 1/20″ (pro evropany 1,27 mm). Do nepájivého kontaktního pole to nedostanete.

Takže nezbývá než vyndat pájku. SO-8 je asi nejmenší velikost pouzdra, co se ještě dá amatérsky pájet.

Pokud se vám, stejně jako mně, nechce si leptat vlastní plošný spoj, je možné ho koupit zde. Ideální není – tomu, kdo vymyslel vývody pod čipem bych utrhnul něco důležitého – ale použít se dá.

Zapojení je jednoduché:

  • 1 – napájení +3.3V
  • 2 – datový vodič pro 1-wire, je nutné připojit přes odpor 4k7 na +3.3V
  • 3 – GND
  • 4 – SCL
  • 5 – SDA
  • 6 – pomocí této nohy se řídí „aktivní napájení datového vodiče 1-wire“, což neřešíme = nezapojit
  • 7+8 – výběr adresy, spojíme na GND

Takto zapojený 1-wire bus je nejjednodušší možný – pro malé počty čidel a krátké přívody. Pokud bychom chtěli připojit hodně čidel a/nebo mít bus velmi dlouhý (desítky metrů), je potřeba tam přidat jeden MOSFET transistor pro aktivní pullup řízený nožičkou číslo 6. Jo a taky by se hodilo napájení sběrnice +5V. Viz datasheet.

Jako experimentální čidlo použijeme čidlo teploty DS18B20 (24 Kč u TME). Datasheet. DS18B20 umožňuje až 12-bitovou konverzi dat a v rozsahu -10 až +85 stupňů slibuje přesnost +-0.5 stupně. A je v pěkně použitelném třínožičkovém pouzdru.

Zapojení je jednoduché – prostřední nožičku na 1-wire data, levou na GND a pravou na +3.3V. Pokud bychom chtěli připojit více čidel, všechny se zapojí paralelně.

Software

Nejprve se koukneme, zda vidíme bus driver na I2C sběrnici.

pi@raspberrypi ~ $ i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — 18 — — — — — — —
20: 20 — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — 48 — — — — 4d — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —

Je tam nové zařízení na adrese 18, takže je to v pořádku.

No a teď jak to vlastně použít – jak načíst hodnoty z čidel?

Kouzlo linuxu a open-source světa je, že hodně problémů už někdo promýšlel a vyřešil je lépe, než bych dokázal sám. Takže i pro 1-wire čidla existuje řešení – OWFS (one-wire file system). A existuje přímo v balíčku pro Raspbian!

Tak do toho:

sudo mkdir /mnt/1wire
sudo apt-get install owfs
sudo apt-get install owfs-doc
sudo apt-get install ow-shell

Nyní je potřeba editovat /etc/owfs.conf :

Zakomentujte (přidejte před ní #) řádku:

server: FAKE = DS18S20,DS2405

a přidejte následující řádky:

device = /dev/i2c-0
mountpoint = /mnt/1wire
Celsius
allow_other
error_print = 0
error_level = 0

Dále editujte /etc/fuse.conf – odkomentujte řádku

user_allow_other

Teď by bylo dobré restartovat. Chvilku počkáme, než RPi naběhne… a pak zkusíme vypsat obsah owfs:

pi@raspberrypi ~ $ owdir
/28.9614C2030000
/bus.0
/uncached
/settings
/system
/statistics
/structure
/simultaneous
/alarm

Výpis „owdir“ ukazuje strukturu objektů v owfs. Objekt „/28.9614C2030000“ reprezentuje teplotní čidlo; kdyby bylo připojeno více čidel, měly by obdobná jména. Objekt „/bus.0“ je 1-wire sběrnice; kdyby bylo více sběrnic (např. při použití čipu DS2482-800), bylo by zde více záznamů „/bus.#“ .

Objekty jsou uloženy stromově – je možné se dívat i na další úrovně. Třeba na detaily čidla:

pi@raspberrypi ~ $ owdir /28.9614C2030000
/28.9614C2030000/address
/28.9614C2030000/alias
/28.9614C2030000/crc8
/28.9614C2030000/errata
/28.9614C2030000/family
/28.9614C2030000/fasttemp
/28.9614C2030000/id
/28.9614C2030000/locator
/28.9614C2030000/power
/28.9614C2030000/r_address
/28.9614C2030000/r_id
/28.9614C2030000/r_locator
/28.9614C2030000/temperature
/28.9614C2030000/temperature10
/28.9614C2030000/temperature11
/28.9614C2030000/temperature12
/28.9614C2030000/temperature9
/28.9614C2030000/temphigh
/28.9614C2030000/templow
/28.9614C2030000/type

Pro čtení dat z jednotlivých souborů je k dispozici příkaz owread. Můžeme se tedy zeptat třeba na typ připojeného čidla:

pi@raspberrypi ~ $ owread /28.9614C2030000/type
DS18B20

A jakou nám měří teplotu?

pi@raspberrypi ~ $ owread /28.9614C2030000/temperature
20.4375

(Jaké hodnoty jsou v dalších souborech a co s nimi? Nastudujte si za domácí úkol dokumentaci OWFS a datasheet čidla DS18B20.)

Stejným způsobem jako k čidlu se můžeme chovat i k ostatním položkám stromu OWFS. Třeba můžeme zjisti, jaký bus master je použit pro bus.0:

pi@raspberrypi ~ $ owread /bus.0/interface/settings/name
DS2482-100

Jak zde je vidět, OWFS řeší spoustu věcí, ne jen vlastní zjištění teploty. Pro většinu 1-wire zařízení OWFS umožňuje plnohodnotné použití. Například u teplotních čidel je tak možno zjišťovat maxima a minima nebo nastavovat limity pro automatické alerty. Vygenerované alerty pak najdete v cestě /alarm.
Dá se to ještě vylepšit? No jistě!

Copak asi značí to „FS“ v názvu OWFS? Filesystém.

Zkusíme ho spustit:

sudo owfs

No a teď zkusíme použít ne „owdir“, ale prostý výpis adresáře:

pi@raspberrypi ~ $ ls -l /mnt/1wire
total 0
drwxrwxrwx 1 root root 8 Nov 17 23:49 28.9614C2030000
drwxr-xr-x 1 root root 8 Nov 17 23:49 alarm
drwxr-xr-x 1 root root 8 Nov 17 23:49 bus.0
drwxr-xr-x 1 root root 8 Nov 17 23:49 settings
drwxrwxrwx 1 root root 8 Nov 17 23:49 simultaneous
drwxr-xr-x 1 root root 8 Nov 17 23:49 statistics
drwxr-xr-x 1 root root 32 Nov 17 23:49 structure
drwxr-xr-x 1 root root 8 Nov 17 23:49 system
drwxr-xr-x 1 root root 8 Nov 17 23:49 uncached

A hele? Je tu totéž, co vypisovalo owdir!
A data se z toho čtou jak? No jako z normálních souborů:

pi@raspberrypi ~ $ cat /mnt/1wire/28.9614C2030000/temperature
20.6875

Šlo by z toho dostat ještě víc?

Pomocí služby owhttpd je možné stejná data zpřístupnit jako webové stránky.

Aplikace owserver a owhttpd jsou systémové služby, takže se spouští při startu systému a je možno je ovládat pomocí

sudo service owserver start
sudo service owserver stop

resp.

sudo service owhttpd start
sudo service owhttpd stop

Další odkazy

A design guide for the layman: understanding, designing and building MicroLan™ (1-Wire) networks:
http://www.1wire.org/Files/Articles/1-Wire-Design%20Guide%20v1.0.pdf

Guidelines for Reliable Long Line 1-Wire® Networks:
http://www.maximintegrated.com/app-notes/index.mvp/id/148
Zde najdete informace, jak počítat délky 1-wire sítě a jaké jsou limity 

Quickstart quide pro ubuntu:
http://owfs.org/index.php?page=quickstart-guide

Kterak zajistit, aby se „owfs“ (ne owserver) spustilo samo po startu systému:
http://wiki.temperatur.nu/…

Jak připojit čidla teploty přes GPIO4 a kernelový patch (česky – zdejší diskutující MiK):
http://www.astromik.org/raspi/15.htm

1 – I2C teploměry
2+3 – I2C GPIO expandér a jím řízená LED
4 – budič 1-wire sběrnice DS2482-100
5 – teplotní čidlo DS18B20

85 thoughts on “1-wire snímače na I2C, přesnější měření teploty

  1. Díky za článek.

    Pokoušel jsem se o zprovoznění budiče už dřív, ale nějak se mi to nepodařilo, tak jsem to odložil.
    O víkendu vyzkouším tento tvůj postup.

    Budič DS2482S-800+ jsem si nechal poslat od Maximů jako vzorek.
    A přechodku z toho malýho pouzdra na normální DIL jsem si objednal u http://futurlec.com/, ale protože jim to trvalo strašně dlouho, než jí poslali, nevydržel jsem to a uříznul jsem kus plošňáku ze staré televize, na kterém byl původně připájený podobně velký obvod a ten budič jsem tam na to nabastlil.


    Jinak ještě připomínka. Ten web astromik.org nepatří diskutujícímu „DFZ“, ale je můj (MiK).

  2. Ja si jen dovolim maly komentar, jednou sem resil problem (s mikrokontrolery Atmel) jak zapojit nekolik (4-6) 1-wire cidel tak, aby byla mozna odpojitelnost a vymena bez zmeny programu (tzn nevyuzivat jedinecnou adresu cidel) a aby prave nebylo obsazeno I2C (TWI). A tady byla vyhoda, ze se nejedna o I2C. Jinak lecos resi i ochrany odpor do serie k pinu procesoru, ale souhlasim s tim, ze pouziti bus driveru je BEZPECNEJSI (i kvuli poruseni kabelu a objeveni se napajeciho napeti na pinu – coz by opet vyresil ochrany odpor), ale komunikovat s 1-wire cidly pres I2C uz me zas moc vyhodne nepripada (navic proc tedy rovnou nepouzit I2C cidla, ktera mohou byt i levnejsi nez zminovane dallasy napr TCN75A). Pri nepouziti patchu je pomerne jednoduche si komunikaci s dallas cidlem naprogramovat svepomoci. A nakonec pro uplnou jistotu lze vyuzit obousmerne galvanicke oddeleni (cena pod 50kc) a pak uz muzeme vesele vyuzivat vyhod sbernicoveho zapojeni 1-wire cidel http://www.jon00.me.uk/images/1wirebus.gif (coz dle datasheetu zrejme neumoznuje v clanku zminovany bus driver)

    • „Proč rovnou nepoužít I2C čidla“ má jednoduchou odpověď – délka sběrnice. Pokud chceš měřit cokoli na mnohametrovou vzdálenost, nic jiného než 1-wire není příliš funkční.

      Druhý důvod – nenašel jsem (ve stejné cenové kategorii) žádná I2C čidla, která by se přesností i jen blížila k 18B20. I Tebou zmiňované TCN75A má přesnost ±3°C, 18B20 je 6x přesnější.

      „komunikovat s 1-wire čidly přes I2C … moc výhodné nepřipadá“ – kouzlo je v tom, že s čidly nechci komunikovat napřímo. Kvůli tomu si hraju s RPi a ne s Arduinem – nechci programovat v assembleru. A pokud používám OWFS, je vcelku jedno, zda jsou čidla připojená přes USB, kernelový patch „w1“ či I2C driver – ovládání je vždy stejné. Tj. aplikace je pak např. snadno přenositelná na libovolné PC s USB driverem 1-wire sběrnice.

    • Sběrnicové zapojení čidel ten driver samozřejmě umožňuje. Mám tu dvě čidla 18B20 a čte je to bez problémů. Driver by jich bez problémů měl na krátkou vzdálenost utáhnout řádově sto, na dlouhou určitě desítky.

      Naopak – jak zmiňuju v článku – ten driver umí i „aktivní pullup“, tj. řízené pouštění více proudu do datového vodiče tak, aby to utáhlo i hodně čidel v parazitním módu napájení na velkou vzdálenost. Stačí tam místo jednoduchého pullup odporu na ten poslední nevyužitý pin budiče přidat MOSFET transistor.
      A aktivním pullupem může mít síť váhu až cca 500 metrů a vzdálenost k nejvzdálenějšímu čidlu až v řádu 250 metrů.
      To je typicky věc, kterou na GPIO portu procesoru neuděláš – byť application note 4206 mluví o možnosti udělat aktivní pullup pomocí druhé GPIO nožičky na procesoru, programovat bych to nechtěl. Bus driver to umí sám…

      Přečti si ty guidelines – tam je spousta zajímavých věcí.

    • Aha, teď mne napadl ještě třetí důvod, proč ne čidla na I2C – čidel na 1-wire sběrnici můžu mít „neomezeně“ mnoho a zaberou mi jen jednu I2C adresu. Čidel na I2C můžu mít jen tolik, kolik dokážu zajistit unikátních adres – a jak píšu v předešlém článku, třeba pro ty moje I2C čidla měli v TME v 3.3V provedení právě jednu adresu.

      • Ale ja sem prave propagator pouziti 1-wire a ne i2c :-) , jen chci rict, ze i2c sbernice diky slozitejsimu casovani ma vyssi HW naroky na procesor nez 1-wire , takze pouzivat slozitejsi sbernici k komunikaci po jednodussi sbernici me neprijde vyhodne (uzivatelsky je to jedno). Samozrejme RPI ma relativne dost vykonu, takze se setrit nemusi, ale plytvat take ne :-) Co se tyka poznamky o nemoznosti zapojeni sbernicove, tak beru zpet – moje chyba, dival sem se na tu 800ku a tam to na prvni pohled nebylo jasne. Jinak souhlasim, ze arduino je hnus (jen se to teda neprogramuje v assembleru, to by asi hodne priznivcu ubylo :-)), ale programovat mikrokontrolery v C je stejnne snadne (diky hw periferiim mozna i snadnejsi) jak delat program v C pro RPI. Jinak otazka do placu ma nekdo praktickou zkusenosti s RISC OS a RPI co se tyka ovladani GPIO a I2C a 1-wire atd. ???

        • 1) I2C je výrazně jednodušší než 1-wire. Na I2C máš drát s hodinami, který udává, co se kdy stane. A byť se běžně komunikuje na fixních frekvencích, I2C tuším nemá spodní limit – tj. když tam poženeš 1000 bite za sekundu, pojede to taky. 1-wire je oproti tomu asynchronní a má přesně definované timingy v řádu mikrosekund.

          2) V RPi se I2C odbavuje hardwarem, alespoň se domnívám; 1-wire je bit-banging. Tj. procesorová náročnost je výrazně vyšší u 1-wire.

          3) V C pro mikrokontrolery stále nemáš k dispozici ten celý linux kolem (http server, databázi, filesystém). A hlavně – já si nechci hrát v C. To je opruz. C je pro programování na čistém hardwaru a pro psaní OS; pro jakoukoli složitější práci je extrémně nevhodné (resp. má nedobrý poměr délky kódu a funkce).
          Pro většinu věcí na RPi stačí shell a co nejde v bashi, odbaví Java.

          4) RISC OS zkoušel Sledge a byl velmi zklamán; doufám že napíše více.

          • add 1) nesouhlasim, viz citace hw.cz: „Vyhody 1-wire: jednoduché a originální řešení adresovatelnosti účastníků;jednoduchý protokol;jednoduchá struktura spojení;Standardní rychlost práce 1-Wire sítě 16kbit/s … Standardní hodnota rychlosti přenosu může být libovolně zmenšována díky zavedení vynuceného zpoždění mezi vysíláním jednotlivých bitů dat.“ naproti tomu I2C:“I²C komunikaci lze pochopitelně naprogramovat prakticky do jakéhokoli mikrokontroléru, ale musí se pak přesně dodržovat časové prodlevy popsané v I²C-bus specification. Některé mikrokontroléry však přímo podporují I²C a mají ji v hardware.“ – on neni problem v rychlosti hodin, ale dodrzovani casu – realtime.

            add 2) ano POKUD ma RPI implemantovano I2C hardwarove je situace jina, ale mam pocit ze I2C je soucasti jadra linuxu.

            add 3) nesouhlasim taky, ale to je vec nazoru takze nevyvracim :-)

            add 4) Prosim Sledge o podrobnejsi zkusenosti (programovani atd) – zajimam se spise o extremni vytizitelnost vs realtime aplikace = vyuziti v automatizaci a robotice, de o to jestli totuto cestou vubec jit, protoze to by mela byt dle propagatoru RISC OS prave lepsi varianta.

          • ad 3) Treba pro me je C na mikrokontrolery v podstate nepouzitelny, dela to moc velkej kod. Takze pro me osobne jasne vitezi assembler. Pro aplikace na PC se zase nic jinyho nez C pouzit neda pokud se ma ta aplikace hybat…

    • Možná hloupý dotaz, ale kvůli bezpečnosti … musím při použití bus driveru (např. DS2482S-100) řešit galvanické oddělení I2C (např.ADuM1250) nebo jeho funkci plní samotný bus driver?

      • Bus driver neřeší GALVANICKÉ oddělení. Tj. pokud ho k něčemu potřebuješ, musíš tam dát ještě nějaký prvek, který ho realizuje – např. ADuM1250. Nicméně pro 95% aplikací galvanické oddělení nepotřebuješ.

        • Díky za info! Mám obavu z těch zbylých 5%, tj. např . nežádoucí indukce na dlouhých vedeních k čidlům apod. Mimochodem, v tom případě by bylo i záhodno napájet 1-wire sběrnici sólo, jestli jsem to dobře pochopil.
          Jsem ryzí amatér, proto … nemáte někdo schema zapojení s ADuM1250, prosím? Z datasheetu mi to úplně jasné není. Hádám, že by tím vyřešil i Cenda svůj problém s napájením sběrnice 5V.

    • K čemu to potřebuješ? Máš nějaká čidla, která umí jen pětivoltové napájení?

      Možnosti jsou dvě:

      1) Zcela bezpečně to půjde tak, že použiješ konvertor I2C sběrnice na 5 V logiku (např. http://adafruit.com/products/757) a bus driver už budeš napájet 5V.

      2) Nicméně si myslím, že jednoduché řešení by bylo bus driver napájet 3.3 V (a nechat ho napřímo připojený k RPi), ten pull-up odpor 1-wire sběrnice připojit na 5 V a případně čidla napájet 5 V. Nikde v datasheetu není, že by ten bus driver nebyl tolerantní k 5 V na 1-wire vstupu při napájení z 3.3 V. Zkus vygooglit, zda to někdo nezkoušel.

      Disclaimer: Byť si myslím, že v postupu 2) není žádný háček, může to skončit spálením RPi. Vše děláš na vlastní nebezpečí.

        • Taky jsem se začal zabývat tímto problémem, protože mám čidla DS1820 použita pro řízení podlahové topení. Ale našel jsem dneska tyto stránky http://www.elektrorevue.cz/clanky/03012/index.html asi použitelné pro 1-wire komunikaci bude „Obr. 6: Galvanické oddělení obousměrné linky s využitím speciálního integrovaného obvodu P82B96“. Už jsem na to koukal u http://www.gme.cz a asi by to stálo cca do 150kč jenom za součástky. Až mě přijde objednané Raspberry tak se do toho pustím. Pak bych jsem toho napsal víc.

  3. Dobrý den,
    velmi mě zaujal tento článek, protože popisuje něco co bych chtěl delší dobu realizovat. Potřebuju jednoduše připojit k několik teplotních čidel a vzdálenosti budou desítky metrů. K tomu se nabízí popisovaná varianta s bus driverem DS2482-100 a MOSFET tranzisotem. Poradil by mi někdo, jaký konrétní typ MOSFETu a velikost odporu použít ? Mohu pro napájení sběrnice použít 3.3V přímo z GPIO pinu nebo je lepší použít nějaký externí 3.3V zdroj ? Děkuji moc za případnou radu. S pozdravem
    Tomas

  4. Na mereni teploty je OWFS zbytecny molouch, bohate staci to co je v linuxovem jadre. Nize se pokusim vysvetlit jak na to (jen podotykam memam raspery pi, ale mnelo by to fungovat stejne).

    // zprovozneni w1 sbernice s ds2482 interfacem a teplotnim cidlem
    modprobe ds2482 force=0,0×18
    modprobe w1_therm

    ps: 0x18 je adresa i2c bus driveru, muze but i jina viz. i2cdetect -y 0

    v adresari /sys se vytvori struktura nalezenych 1wire zarizeni. Teplotu na cidle lze pak precist vypsanim obsahu souboru napr.:
    cat /sys/devices/w1_bus_master1/28-000001b480d4(w1-adresa cidla)/w1_slave
    vypis vypada nasledovne:
    de 01 4b 46 7f ff 02 10 1f : crc=1f YES
    de 01 4b 46 7f ff 02 10 1f t=29875
    de 01 4b 46 7f ff 02 10 1f : crc=1f YES
    de 01 4b 46 7f ff 02 10 1f t=29875

    Mereni nevim proc probehne dvakrat. Teplota je uvedena v tisici nasobku stupnu.

    Pro mereni teplot to bohate staci a neni potreba nic dalsiho instalovat.

    • OWFS je moloch, ale má proti patchu „w1“ mnoho výhod i pokud jde jen o měření teplot:

      1) spolehlivost – při použití „w1“ je potřeba kontrolovat, zda se data načetly správně (crc YES) a případně opakovat

      2) rychlost – pokud chceš rychle data, můžeš použít měření s nižší přesností, které proběhne výrazně rychleji (soubory temperature9 – temperature11, číslo je počet bitů)

      3) více funkcí – čtení max/min teploty, nastavování alertů, práce s alerty….

      A hlavně – OWFS nepodporuje JEN čidla DS18B20, ale i ostatní moduly od Dallasů. A tam je spoustu zajímavých věcí.

    • Jo a kromě toho, co jsem napsal v předešlém komentáři – w1 není (v prosinci nebylo) součástí standardního kernelu pro RPi, musíš si ho tam napatchovat. A to se mi nechce.
      (viz poslední odkaz na konci článku, odkazuji tam na popis, jak se to dělá)

  5. Nic proti OWSF na rasperypi bych ho pouzil take. Rasprypi nemam, zkousel jsem neco podobneho na modulu, ktery mnel jen 8 MRAM a po nabehu zakladniho systemu mi na program zbylo cca 200KB a tam se OWFS neveslo, proto jsem pouzil modul jadra. Natchlo mne jak jednoduse to lze pouzit, tak jsem se podelil o zkusenost.

  6. Mám drobný problém. RPi mi neche detekovat teplotní čidlo. owdir vypíše toto:
    /bus.0
    /uncached
    /settings
    /system
    /statistics
    /structure
    pokud procházím bus.0 tak v tom najdu že používám DS2482-100. Divné navíc je, že i2cdetect -y 0 nedetekuje žádné zařízení. Zkusil jsem tedy i2cdetect -y 1 to našlo jedno ale to najde jen po restartu, pokud s tím chvilku dělám zkusím znova i2detect tak to vrátí samé nuly. Je to normální? Čidlo mám fungl nové, zkoušel jsem jak parazitní napájení tak i přímé napájení. Jelikož bude čidlo dost vzdálené používám 5V, ale nyní to mám na drátu asi 30cm (UTP kabel) Nemá někdo nějakou radu. Předem díky.

    • Umím odpovědět na to, proč je to vidět jako I2C bus s číslem 1 a ne 0 jako v mých ukázkách – podle dostupných informací mají novější modely RPi vyvedené IIC busy opačně, takže na expanzním portu je skutečně bus 1.

      Ostatní se bez dalších informací těžko určuje. Jak máš udělané to napájení 5V? Máš oddělovač na IIC sběrnici? Jaký?

        • Tj. DS2482-100 napájíš +3.3V, ale napájecí drát k čidlu bereš z +5V ?
          Začal bych možná tím, že bych to převedl na standardní konfiguraci – tj. i napájecí drát k čidlu na +3.3V.
          To, že ti busmaster zmizí z i2cdetect svědčí o tom, že tam něco hnije.

          • Nene, vše napájím 5V. Dle Datasheetů je možné vše napájet 5V, ele teď mně tak napadá zda vstupy RPi jsou pouze 3V3 tak to bude asi problém.

              • Tak jsem to přehodil a nic. Stále stejný výsledek. Mám tam bus.1 a to je vše. Pokud desku s DS2482 odpojím, tak v owdir nemám nic, takže spojení s ním funguje. Dnes zkusím ještě udělat novou desku s posílením MOSFETem. Jinak mně už nic nenapadá. Jsou to tři dráty, tam není co zkazit.

              • Tak zase jedno zjištěné. Připojil jsem ještě jeden řadič s jedním čidlem. Po startu to oba řadiče najde. Pokud potom spustím owdir, tak se mi zobrazí jen jeden bus, ale pokud potom opět dám detekci zařízení na i2c, tak už to nic nenajde:
                pi@raspberrypi ~ $ sudo i2cdetect -y -r 1
                0 1 2 3 4 5 6 7 8 9 a b c d e f
                00: — — — — — — — — — — — — —
                10: — — — — — — — — 18 — 1a — — — — —
                20: — — — — — — — — — — — — — — — —
                30: — — — — — — — — — — — — — — — —
                40: — — — — — — — — — — — — — — — —
                50: — — — — — — — — — — — — — — — —
                60: — — — — — — — — — — — — — — — —
                70: — — — — — — — —
                pi@raspberrypi ~ $ owdir
                /bus.0
                /uncached
                /settings
                /system
                /statistics
                /structure
                pi@raspberrypi ~ $ sudo i2cdetect -y -r 1
                0 1 2 3 4 5 6 7 8 9 a b c d e f
                00: — — — — — — — — — — — — —
                10: — — — — — — — — — — — — — — — —
                20: — — — — — — — — — — — — — — — —
                30: — — — — — — — — — — — — — — — —
                40: — — — — — — — — — — — — — — — —
                50: — — — — — — — — — — — — — — — —
                60: — — — — — — — — — — — — — — — —
                70: — — — — — — — —

                Tak a teď babo raď :)

  7. Programujem trošku v jazyku C, pričom využívam pri komunikácii s GPIO knižnice wiringPi. Ako by som mohol pristupovať k snímačom 1-wire pomocou týchto knižníc? Zatiaľ dokážem merať 8 teplôt pomocou snímačov SMT160-30, ale tie majú na výstupe striedu závislú na teplote.

    • resp. vedel by som automatizovať zapisovanie 32 1-wire snímačov do súboru vo vopred definovaných intervaloch pomocou hore uvedeného postupu?

      • Pokud použijete OWFS, není potřeba používat žádné další knihovny. Data ze všech 1-wire snímačů jsou dostupné jako běžné soubory na filesystému a je tedy bez problémů možné je číst z libovolné aplikace v libovolném jazyce.

        • Ako často sa mení hodnota teploty v súbore? Potreboval by som merať teplotné pole s 32 snímačmi a neviem ako často by sa aktualizovali teploty, resp. či je nutné meranie manuálne prikázať. Ďakujem za radu.

          • Komunikace s čidlem proběhne v ten okamžik, kdy přečtete obsah souboru. Ten soubor ve skutečnosti neexistuje, je jen virtuální a obsahuje přímo data získaná z čidla.

            • Prečo to nie je takto jednoznačne napísané v manuáloch ? :-) Teraz tomu už rozumiem. Inak, ja sa tomu venujem v rámci hobby, tak musíte mať so mnou trpezlivosť. Ďakujem

  8. Díky za nápovědu,
    pokoušel jsem se o zprovoznění DS18B20 přes DS2482-100 ale po zadání příkazu „i2cdetect -y 0“ mě to píše „i2cdetect: command not found“ čili asi něco zchází přímo ve „Wheezy“ když jsem DS18B20 připojil rovnou na GPIO4 tak mě to měřilo.
    Kuna

  9. Zprovoznil jsem I2C dle popisu a když jsem připojil přímo TC74A0 tak mě to zařízení našlo na i2cdetect -y 1 („48“ jako dle popisu ) ale nemůžu přijít na to jak upravit příkaz na měření „i2cget -y 1 0×48 0 b“ ?
    Zkoušel jsem to různě ale píše mě to :
    pi@raspberrypi ~ $ i2cget -y 1 0×48 0 b
    Error: Chip address is not a number!
    Usage: i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
    I2CBUS is an integer or an I2C bus name
    ADDRESS is an integer (0x03 – 0x77)
    MODE is one of:
    b (read byte data, default)
    w (read word data)
    c (write byte/read byte)
    Append p for SMBus PEC

    Zato když připojím bus DS2482-100 tak se mě to sekne při bootování. A má to při bootování i jinačí rozlišení nemůže se něco z dotčených obvodů hádat s grafikou?
    Nemáte někdo podobnou zkušenost?
    Díky Kuna.

  10. Tak to měření už mám, kopíroval jsem „i2cget -y 0 0×48 0 b“ a přepsal „-y 1“ ale i když to vypadalo že je to přepsaný příkaz to posílalo pořád neviditelně s „-y 0“ až jsem to napsal celý ručně tak to šlo.

    Teť ještě laboruji s tím busem DS2482-100, napájel jsem už na jedno pouzdro druhý ale dělá to stejné.

  11. Tak jsem to rozjel, hádalo se mě to asi s WebIOPi když jsem dal na kartu obraz před instalací WebIOPi tak to bootuje normálně.
    Chtěl bych se zeptat: můžu ndát popřípadě na I2C paralelně 2x DS2482-100 ?
    Děkuji Kuna.

    • >>> Chtěl bych se zeptat: můžu ndát popřípadě na I2C paralelně 2x DS2482-100 ?

      Urcite ano, ale kazdemu se musi pomoci adresnich vstupu AD0 a AD1 nastavit jina I2C adresa. Kazdopadne na jeden DS2482-100 jdou pripojit desitky 1wire snimacu a zarizeni, takze druhe DS2482-100 by melo vyznam jen ve specialnich pripadech (viz datasheet)

      Z.

  12. Zdravím, zkoušel jsem udělat vše podle návodu. Ale nedaří se mi nic detekovat pomocí i2c-detect. Níže jsou odkazy naobrázky, jak je udělaný ten převodník. Bohužel jsem to dělal ve škole a nakreslili jsme to obráceně, takže je tam čip s ohnutýma nožkama + drátek. Uměl by někdo poradit? Několikrát jsem to ve škole konzultoval a napájené by to mělo být dobře. Čidlo ds18b20 je v pořádku.

    http://oi45.tinypic.com/vyawb6.jpg
    http://oi50.tinypic.com/2eb48kp.jpg

  13. Díky za odpověď, ještě k tomu čidlu DS18B20 stačí na výstupních svorkách jeden odpor pro všechny čidla nebo mám dát odpor až ke každému čidlu na konec kabelu?

    Děkuji Kuna.

  14. w1 kernel patch je už součástí oficiální verze Raspbian wheeze – firmware 3.6.11+. Nejjednodušeji lze firmware aktualizovat pomocí rpi-update – https://github.com/Hexxeh/rpi-update.
    Pak není potřeba i2c – w1 převodník (jakkoli souhlasím s jeho použitím pro ochranu RasPi) a výstup DS18B20 lze připojit přímo na GPIO4 -napájení DS18B20 3,3V !!! a mezi napájení a výstup odpor 4k7.
    Po zapnutí jednoduše:
    sudo modprove w1-gpio
    sudo modprove w1-therm
    a pomocí cat /sys/bus/w1/xxx/w1-slave (xxx je sériové číslo DS18B20 čteme teplotu, detaily jsou srozumitelně anglicky zde http://www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/temperature/ – provní bod ve Step One: nemusíte dělat.

  15. zapojoval jsem paralelne nekolik DS18B20 (na zacatku na GPIO4, pak pres tenhle prevodnik), a zjistil, ze obcas nektera z nich vraceji teplotu 85 stupnu, a zbytek take o neco vetsi nezli je teplota pokojova. to same cidlo po restartu pi, nebo za nejakych jinych okolnosti pak ukazujeteplotu spravnou.

    • Nesmyslnou hodnotu mi to ukazovalo, kdyz byl nekde zkrat. Zkousel jsem cidla zaizolovat a dat do vody, ale dostala se tam vlhkost a pak ukazovaly blbosti.
      Zkusil bych pripojovat postupne cidlo po cidlu, pripadne zmerit odpor.

        • Jeste jedna moznost, kde muze byt problem.
          Pokud ma clovek hodne cidel, pripadne se mu omylem spusti vic programu, ktere je ctou, tak se muze stat, ze nedostane vcas odpoved.
          Pak je mozne zvetsit READ_TIME treba na 2000 v .digitemprc

  16. existuje nejaký šikovný 1w čip alebo nejaké riešenie na meranie frekvencie z elekretového mikrofónu s využitím raspi? v jednoduhšom prípade signalizovať dosiahnutú frekvenciu? , potrebujem sledovať frekvenciu zvuku na viacerých miestach alebo aspoň signalizovať vopred nastavenú hodnotu /to by sa už riešilo asi softwerovo/. Dik

  17. Ahoj, super článek, ale potřeboval bych poradit, jak se dostat na druhé DS2482-100 s adresou 0x19 přes owfs. Když dám i2cdetect -y 1, tak ho tam vidím, ale když dám v owfs /opt/owfs/bin/owfs –i2c-1:ALL –allow_other /mnt/1wire, tak mi to po rebootu nenajde. Teploměry na čipu s adresou 0x18 jo, ale na tom druhém ne. Použil jsem nastavení podle stránky http://wiki.temperatur.nu/index.php/OWFS_with_i2c_support_on_Raspberry_Pi_(English_version)#Make_sure_OWFS_is_started_automatically_at_boot , aby to rovnou bootovalo. Taky nerozumím tomu, jaký je rozdíl v tom, když to zapíšu do owfs.conf a mezi tím, když se to dá do default runlevelu. Je potřeba teda, aby to bylo v tom owfs.conf, když to s tím parametrem spouštím při bootování? Díky

    • No tak sláva, už jsem na to přišel. Při použití více DS2484-100 je potřeba do owfs.conf místo
      device = /dev/i2c-0
      zapsat
      i2c /dev/i2c-0:ALL
      device je starší způsob, který podporuje pouze první zařízení DS2484 na i2c sběrnici.
      Jinak owfs server se startuje při bootování automaticky a bere nastavení z owfs.conf, takže ho už není potřeba dávat do runlevelu.

  18. Zdravím Vás, chtěl bych se zeptat: mám připojeny 4 čidla „DS18B20“ přes sběrnici „DS2482-100“ na I2C. Půjde toto logovat přes RRDTool, nebo to platí jen pro připojení „DS18B20“ napřímo na GPIO4?

    Děkuji s pozdravem Kuna.

  19. Nemáte někdo zkušenosti s parazitním napájením DS18B20 na Raspberry Pi ? Pokud připojím senzor na tři vodiče – OK, zatím přímo na PIN 4, jakmile použiji dvouvodičové připojení, hlásí teplotu 85 – což pravděpodobně znamená chybu. Může být chyba v ovladači? Potřebuji teplotní čidlo v místě kam už jiný drát nenatáhnu.

  20. Dobrý den, s raspberrym provozuji 12čidel ds18b20 které jsou připojené třídrátově do hvězdicového tvaru s délkou vedení cca 4m. Z počátku docházelo k chybám výjimečně že mě to zato nestálo řešit. Teploty jsem pouze zobrazoval na webu který je uložený na web serveru v raspim, ale poté co jsem vytvořil kontinuální grafy s knihovnou matplotlib začalo k chybám docházet relativně často nepravidelně někdy po hodině někdy po několika dnech. Zkusil jsem posílit zdroj pro raspberryho na 5V/5A a chyby jsou stále. Teploměry napájím z raspberryho 3.3V je možné že by ten zdroj nestačil pro 12 teploměrů? Nebo je nutný chladič na procesor? Pravda je že při tvorbě grafů je procesor u raspiho na 100%. Kdyby někoho něco napadlo děkuji za odpověď

    • Ty teploměry jsou zapojené přímo na pin procesoru, nebo přes bus driver? Pokud napřímo, tak není třeba hledat dál – vytahovat drát přímo z nohy procesoru na délku několik metrů je extra špatný nápad.

      S teplotou procesoru by to nemělo mít nic společného; napáječ na straně 5 V by taky neměl výrazně hrát roli (když není dostatečně výkonný, RPi se seká nebo neběží jako celek).
      Napájení z 3.3 V by roli hrát mohlo – zdroj 3.3 V v RPi není moc výkonný. Dohledej si v dokumentaci, kolik je povoleno brát z RPi a kolik žere jeden teploměr.

  21. Prosím o aktualizaci.
    Ne všechny bus drivery jsou drahé. Pro mnoho čidel a dlouhé dráty v kombinaci s owfs (nutno verzi 3+ a ne 2.9 s chybou v podobě odpojování čidel. 5eším teď kamarádovi 30 termostatů a 30 čidel DS2482 na celkem asi 40m kabelů (od 1 do 3m každý). DS2482-100 na to nestačí a 12bitové konverze trvají dlouho, aktivní pullup mi přijde že owfs neumí s tímhle čipem za necelých 150,-, připojí se na UART a vše si řídí sám, včetně aktivního pullupu. Konverze trvají půlku doby a a celé je to elegantní řešení na 5V. Jen nutno použít převodník napěťových úrovní, třeba z BSS138 a 2*10k rezistoru.

    Tak prosím kyžtak o doplnění.

  22. Heyký, článek, díky!
    Nevíte náhodou jak zprovoznit na RPi 1-wire pro vyčítání čidel AM2302/DHT22(15 čidel na jednom stíněném Cat6 kableu poslední čidlo ve vzdálenosti asi 50m)?
    Čidla se standardní 1-wire implementací od Dallasu mi fungují správně, ale toto(Aosong 1+wire) nejsem schopen zprovoznit .(

  23. Pingback: RPi a One wire

Napsat komentář: Ghost Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna.