duinozone.cz - Arduino a Raspberry fórum

Autor Téma: DS18B20 temperature sensor  (Přečteno 5517 krát)

K.K

  • Host
DS18B20 temperature sensor
« kdy: Prosinec 14, 2015, 11:16:01 dopoledne »
Zdravím.
Uplný začatečník.
http://arduinolearning.com/learning/basics/ds18b20-temperature-sensor.php

Misto uno jsem použil nano v.3

Teplota mi však skače po 0,5 stupních.
21.50
21.00

Kde muže byt problém?

Offline astromik

  • Pokročilý bastlíř
  • ***
  • Příspěvků: 116
Re:DS18B20 temperature sensor
« Odpověď #1 kdy: Prosinec 20, 2015, 15:37:48 odpoledne »
U čidla je možné nastavit rozlišení teploty na 9, 10, 11, nebo 12 bitů.

Defaultně je nastaveno nejnižší rozlišení (9 bitů), takže je třeba to rozlišení zvětšit.

Mají tam na to funkci:
   setResolution(adresa, rozlišení);


Příklad tady:
https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/examples/WaitForConversion2/WaitForConversion2.pde

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:DS18B20 temperature sensor
« Odpověď #2 kdy: Prosinec 20, 2015, 22:04:50 odpoledne »
zvetsenim presnosti se ti ovsem prodluzuje cas mereni. pokud bys pouzil parazitni napajeni tak ti to muze trvat az 750 ms ... navic to neni nic extra pouze meri nekolikrat po sobe a dela prumer. zalezi na co to chces ve vetsine aplikaci napr. desetinna cisla absolutne vynechavam. zdrzuje to pri vypoctech zas..as pamet velkou promennou atd. zalezi na konkretni aplikaci....

K.K

  • Host
Re:DS18B20 temperature sensor
« Odpověď #3 kdy: Prosinec 23, 2015, 21:34:18 odpoledne »
Zdravím a omlouvám se za tu delší odmlku - hold vánoce.

Dotaz.
Jak je to s knihovnami pro arduino?
Když je nějaký zdrojak pro arduino, tak jsou pro něj i knihovný?

Dal jsem tu v prvním postu odkaz.
Používají se tam knihovný OneWire.h a DallasTemperature.h a dají se tam i stáhnout.
Rozbalil jsem oba do libraries.
V obou jsou i přiklady a vše funguje.

Když do arduina vložím ten zdrojak co tu dal odkaz astromik, tak je to bez chyby.
Žadné knihovny to po mně nechce, tudíž to použivá ty staré co jsou v libraries.

Když však spustím ser.monitor, je to jak u číňanu.
http://www.fastimages.eu/?v=2015122321.png
Co je špatné?

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:DS18B20 temperature sensor
« Odpověď #4 kdy: Prosinec 23, 2015, 22:51:04 odpoledne »
spatne je to ze mas nastavenou jinou rychlost serive komunikace v programu a jinou v serial monitor.

jinak je to spis tak ze kdyz je knihovna tak je k ni vetsinou i examlp. jinak by knihovna trochu ztracela vyznam. malo kdo pise u knihoven manual tak radsi napise exampl kde ti ukaze moznosti knihoven.

ty knihovny cos uvadel (one wire vs dallas) jsou kazda trochu jina. ted nejsem u pc ale tusim ze knihovna dallas potrebuje pro spravnou funkci knihovnu one wire.
one wire knihovna resi komunikaci po sbernici a dallas uz konkretni reseni pro teplotni cidla. muze se to jevit jak super symbioza ale ztracis kontrolu jak nad velikosti programu (kvuli dalsi knihovne pomocnym promennym atd) tak hlavne nad funkcnosti. proste mu reknes zmer mi vsechno a posli mi vysledek. pro 1 cidlo super pro 10 cidel katastrofa. ja to resil jen parkrat ale mel jsem 5 cidel a abych udrzel ovladani menu v rozumnych mezich rychlosti odezvy na tlacitka musel jsem v jednotlivych smyckach nacitat kazde cidli zvlast. proste v prvni smycce jsem precetl teplotu prvniho cidla v e druhe smycce druhe cidlo atd. mas nad tim proste vetsi kontrolu.

je treba najit rozumny kompromis ....

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:DS18B20 temperature sensor
« Odpověď #5 kdy: Prosinec 23, 2015, 22:57:52 odpoledne »
... pouzil jsem tedy knihovnu one wire a cidla si spravoval sam.

dallas ti napr pokazde nacita seznam adres cidel a pak je prochazi (pokud si dobre pamatuju) to na sbernici o 1 datovem vodici a rozliseni log. 1 a 0 pomoci delky pulzu dela docela dlouhou odezvu po kterou by program mohl delat neco jineho.

jinam dnes uz pracuji na jinem principu ovl. menu takze me to az tak netrapi ale zkusenosti clovek ziska pri prekonavani prekazek nikoliv pri hladkem reseni . .

K.K

  • Host
Re:DS18B20 temperature sensor
« Odpověď #6 kdy: Prosinec 24, 2015, 08:40:40 dopoledne »
Tak vše vyřešilo toto.
Použivá jen tu knihovnu OneWire a funguje po desetinach  :)
http://www.tweaking4all.com/hardware/arduino/arduino-ds18b20-temperature-sensor/

A diky n-i-o  to mam i zaokrouhlene  :)
http://duinozone.cz/index.php?topic=181.0


K.K

  • Host
Re:DS18B20 temperature sensor
« Odpověď #7 kdy: Prosinec 24, 2015, 09:38:09 dopoledne »
to  posjirka.
Tak pročitám příspěvky na narazil jsem na jeden, kde jsem usoudil že umite i raspi  :)

O co se teď snažím, mi jede na raspi.
Mam takovou řidicí jednotku na topení.

Rad bych to cele předělal s raspi na arduino.
S trochou trapení to asi dam.
Vše by mělo po předělaní dělat arduino nezavisle na raspi.

Chci však nechat raspi propojené přes USB a teploty se 4 čidel, co 5 minut tahat do raspi a ukladat do databaze rrdtool.
Což asi pro mně bude dost velkej ořišek  :(
Komunikovat spolu tyto dvě krabičky umíí.
http://www.seeedstudio.com/recipe/166-basic-pi-lt-gt-arduino-communication-over-usb.html
Takže by to mělo byt řešitelne.
Nakopnete nebo nasměrujete mně  ;)

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:DS18B20 temperature sensor
« Odpověď #8 kdy: Prosinec 24, 2015, 09:50:21 dopoledne »
asi tě zklamu, ale o raspberry  pi vím jak funguje a programování je tam většinou pomocí pythonu  což je pro mě nepochopitelný program. Možná jsem začal v nevhodnou dobu ale skončil jsem u základů v době kdy se přecházelo z verze 2 na verzi 3.
Já jsem zastáncem přímějších řešení o 1 typu zařízení. Nevím k čemu ti bude sledování teplot (nemyslím to zle) možná por statistiku, a pod. navrhnoval bych spíš wifi shield nebo ethernet shield , přes něj se připojit na net a cpát data buď na nějákou exosite, případně jsou celkem schopné řešní přes google document - "excel" kam se dá přistupovat zvenku pomocí formulářu. Prostě si uděláš formulář, který ti do excelu bude přidávat zaslaná data.

Třetí variantu bych viděl jako ukládání na SD kartu a následné čtení dat.

... šlo by to ?

K.K

  • Host
Re:DS18B20 temperature sensor
« Odpověď #9 kdy: Prosinec 24, 2015, 10:23:08 dopoledne »
Já myslel něco takového, ale obraceně.
http://stackoverflow.com/questions/21943607/communication-between-arduino-and-raspberry-pi-over-usb
Že by arduino to cpalo do Serial.print.
Serial.print(cidlo1,cidlo2,cidlo3,cidlo4);
A raspi by si co 5 minut spustilo skript a tu odesílanou hodnotu zachytilo.

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:DS18B20 temperature sensor
« Odpověď #10 kdy: Prosinec 24, 2015, 21:15:55 odpoledne »
to by bylo neefektivni a myslim si ze dost komplikovane. vetsinou se to dela formou : otazka - odpoved. raspberry se zepta pres seriovy port na hodnotu jednoho z cidel a dostane odpoved.
otazka muze vypadat treba takto pro cidlo cislo 1 bude otazka #1
pro cidlo 2 bude otazka #2.
kdyz arduino dostane nekterou z techto otazek posle zpet po ser. portu odpoved.

smyckove odesilani informaci muze zpusobit chaos kdyz si nehlidas veci jak znaky na zacatku a konci vysilani, paritu atd.  predstav si ze se zaposlouchas do vysilani v pulce relace a napocitas 3 hodnoty a co ten zbytek? Atmega to castecne kompenzuje pomoci bufferu ale vse ma sve limity.
navic opet zbytecne zdrzujes procesor o vypocty vyslednych hodnot i kdyz je vlastne nepotrebujes.

muzes si prave o ty data rict nekolikrat po sobe a zkontrolovat si co jsi dostal ...

M.M

  • Host
Re:DS18B20 temperature sensor
« Odpověď #11 kdy: Prosinec 26, 2015, 13:33:36 odpoledne »
Komunikace s raspi bude až ten poslední bombonek.
Mam arduino 14 dní takže uplna lama  :)

Zatím, to co jsem potřeboval od arduina jsem zvlad a funguje, ale je to spiš takové lepení než programovaní  ;)

Snažim se co nejvíc ořezat a upravit tem program pro ty čidla.
Je tam smyčka, ktera načita   ROM = 28 48 D4 A8 4 0 0 A0
A pak to pošle doknihovny ds.select(addr);
Je to tak?
Takže by to mělo jit i takto.
ds.select(28 48 D4 A8 4 0 0 A0);

Udělat nějakou knihovnu ještě neumím.
Ale funkce jsem už zkoušel.
Chtěl bych s toho udělat funkcí které pošlu  OneWire  ds(2) a 28 48 D4 A8 4 0 0 A0 a ona mi vratí tu teplotu.
S pamětí 32 KB to také jinak nepůjde.
 
Kód: [Vybrat]
if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
Kód: [Vybrat]
#include <OneWire.h>
OneWire  ds(2); 

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
////////////////////////////////////////////////////// 
  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  delay(1000);     // maybe 750ms is enough, maybe not
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }
 
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  String teplota = String(celsius,1);
  Serial.print(celsius);
  Serial.print("     ");
  Serial.println(teplota);
  delay (1000);
}


Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:DS18B20 temperature sensor
« Odpověď #12 kdy: Prosinec 26, 2015, 17:09:46 odpoledne »
32 KB prostoru pro program je až až. V Assmbleru bys naprogramoval mnohem víc, protože Arduino pracuje jako vyšší programovací jazky a tak jednotlivé příkazy řeší jako předem definované kusy kodu.... no to se už řešilo kdesi jinde.

Co jě důležité .
pro přístupk čidlům one wire máš opět 2 možnosti. Buď je dáš paralelně a pak načítáš adresy jednotlivých čide ( při zkratu na 1 čidle spadne celá sběrnice, musíš se dotazovat na adresu a to zbytečně zdržuje), nebo je dáš co čidlo to 1 pin (ptáš se přímo čidla, vše je rychlejší ale zabíráš si zbytečně piny).

Adresu musíš zadat v HEX tedy:
ds.select(0x28,0x48,0xD4,0xA8, 0x4, 0x0, 0x0, 0xA0);
jinak ti nejspíš nebude fungovat.

Je třeba si ještě předem nastavit (zapamatovat, zapsat, ..) které čidlo je které číslo.
Může se ti stát, že vlivem rušení se ti pošle adresa špatně a ty budeš číst jiné čidlo. a pak se ti zpřehází pořadí načtených čidel.
Proto je nutné si nastavit, že čidlo č.1 má adresu ..., čidlo číslo 2 má tuto adresu ,...
Pak se dotázat : #1  v arduinu se pres select switch nastavit adresu a zjistit teplotu. tu pak poslat přes seriovy port zpět.
 

Offline K.K

  • Bastlíř amatér
  • **
  • Příspěvků: 86
Re:DS18B20 temperature sensor
« Odpověď #13 kdy: Leden 03, 2016, 12:14:28 odpoledne »
Tak už jsem zvlad načitaní těch teplot podle adres jak přes DallasTemperature.h tak i jen přes OneWire.h

Jedno čidlo v bojleru - 3 metry
druhe čidlo v kotlu na uhli  - 5 metru
A včera rano jsem natahl jedno ven - 10 metru
Použil jsem takovou tu nejtenčí stíněnou dvojlinku, .kde na stíněni mam zem
Zatim testují a vše šlape jak hodinký  :)

Zkoušel někdo ještě delší vzdálenost?
« Poslední změna: Leden 03, 2016, 12:49:38 odpoledne od K.K »

Offline posjirka

  • Zkušený bastlíř
  • ****
  • Příspěvků: 433
Re:DS18B20 temperature sensor
« Odpověď #14 kdy: Leden 03, 2016, 17:23:11 odpoledne »
u mě asi 5m bylo maximum co jsem kdy použil na one wire sběrnici.
Jen dobrá rada : zemění stejně jako všechyn ostatní konce spoj v 1 bodě co nejblíže u zdroje.
I pár spojů 2 cm daleko od sebe můžou napácht potom docela dost ruchů