58

Arduino čtyři teploměry DS18B20 na jedné sběrnici

V článku ze dne 3.1.2015 jsme se věnovali digitálnímu teplotnímu senzoru DS18B20. Nyní si povíme o připojení dvou a více takových senzorů na jednu sběrnici pro nás bude umístěna na digitálním vstupu 5.

Potřebujete

Schéma zapojení

Schema zapojení vice tepoloměrů DS18B20

Schema zapojení dvou a více tepoloměrů S18B20

Zdrojový kód

Zde si ukážeme jak zjistit adresu všech připojených teploměrů ke sběrnici. S adresou zjistíte i další informace, jako je aktuální teplota ve stupních celsia.

#include <OneWire.h>
//Překlad a doplnění komentářů Prosprry vytvořeno pro Vás a http://www.arduinonavody.cz
// OneWire DS18S20, DS18B20, DS1822 Temperature Example 
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(5); //pin pro vstup dat

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, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("Nenalezena žádná další vhodná adresa.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC není validní!");
      return;
  }
  Serial.println();
 
  // První ROM byte označuje o jaký čip z rodiny DS18x20 se jedná
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // nebo starší DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Zařízení nepatří do rodiny čipů DS18x20.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // Zahájení komunikace s teploměrem
  
  delay(1000);     // může stačit zpožnění 750ms, záleží na vás
  // můžeme využít funkci ds.depower() pro šetření baterie, ale pro naše učelinám bude stačit ds.reset();
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Přečte záznamy

  Serial.print("  Data = ");          //odešle po seriové lince text " Data = "
  Serial.print(present, HEX);         //odešle po seriové lince adresu v šestnáctkové soustavě
  Serial.print(" ");
  // Potřebujeme 9 bitů
  for ( i = 0; i < 9; i++) {          // opakuj dokud i je menší než 9, i je pozice 9bitového čísla         
    data[i] = ds.read();              // data na pozici i jsou načtena z ds.read()
    Serial.print(data[i], HEX);       // zapiš data na pozici i v šestnáctkové soustavě
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Převod dat na aktuální teplotu
  // Protože výsledkem je 16 bitové celé číslo se znaménkem, by měl
  // Být uložen na "int16_t" typu, který je vždy 16 bitů
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit výchozí délka
    if (data[7] == 0x10) {
      // "count remain" nadále počítá se všemi 12 bity
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // V nižších rozlišení, jsou nízké bity nedefinované, takže je převedeme na nulu
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit rozlišení, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit rozlišení, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit rozlišení, 375 ms
    // Výchozí hodnota je rozlišení 12 bitů, 750 ms doba převodu
  }
  celsius = (float)raw / 16.0;
  Serial.print("  Teplota = ");
  Serial.print(celsius);
  Serial.println("°C");
}

Očekávaný výstup

ROM = 11 FF AF 33 3 0 0 11
  Chip = DS18B20
  Data = 1 23 1 2A 56 AF AF C 10 26  CRC=26
  Teplota = 22.31°C
ROM = 11 AA AF 33 3 0 0 11
  Chip = DS18B20
  Data = 1 33 1 2A 56 AF AF C 10 26  CRC=26
  Teplota = 22,31°C
ROM = 11 CA AF 33 3 0 0 11
  Chip = DS18B20
  Data = 1 82 1 2A 56 2F AF C 10 26  CRC=26
  Teplota = 22.21°C
ROM = 11 FF C2 33 3 0 0 11
  Chip = DS18B20
  Data = 1 63 1 33 A6 CF AF C 10 26  CRC=26
  Teplota = 22.22°C
Nenalezena žádná další vhodná adresa.

Arduino Uno, Mega, Senzory, Moduly za

VÝHODNOU CENU

  1. Kamagra Information Levitra Verschreiben Lassen Generic Viagra Online Paypal viagra Il Viagra Senza Ricetta Buy Kamagra Jelly Uk Cialis Efecto En Mujeres

  2. Cialis Y Para Que Sirve Cialis Generico Senza Ricetta 5 Mg Cialis Online Lipitor

  3. Amoxicillin Genital Herpes Levitra Prezzi Farmacia cialis Viagra Pas Marche Buy Generic Propecia 20 Mg

  4. Lioresal Commander 10mg Recommended Viagia Sites generic viagra Over The Counter Cymbalta Celexa Online Cheap Dove Acquistare Cialis Senza Ricetta

  5. Levitra 5 Mg Configurazione cialis 5mg Order Synthroid 125 Mcg Online Generic Levitra Information Viagra Sans Ordonnance En France

  6. Buy Anafranil Online viagra Canadian Pharm Support Group Tadapox Tadalafil Dapoxetine Comentarios Sobre Priligy

  7. Achat Cialis Non Generique Vente Baclofen 10mg viagra Cialis Espanol Comprar Levitra Medicament 20mg

  8. Viagra Con Cerveza Buy Plavix Brand Length Of Levitra Patent buy viagra online Levitra 5 Mg Preis Can You Take Amoxicillin With Food Propecia Minoxidil Together

  9. Canadian Rx Network Cephalexin Yeast Amoxicillin Used To Treat Acne online pharmacy Kamagra Oral Jelly 200 Mg Australia Site Fiable Pour Achat Kamagra Canadian Pharmacy Escrow

  10. Zithromax Two First Day Faq Finasteride Propecia cialis Does Alcohol Affect Amoxicillin Buy Viagra Now Online Where Is Priligy Sold

  11. Dobrý den, prosím, mohli byste zveřejnit funkční verzi programu „Arduino čtyři teploměry DS18B20 na jedné sběrnici“. Jsem začátečník Greenhorn senior (61 let) a celkem se v zápisu nevyznám. Snad SW obsahuje HTLM kod.
    Předem děkuji za odpověď. Jirka N. 9.1.2018

  12. Tlak a jako vedlejší produkt i teplotu. Toto čidlo používám a funguje výborně. S čidlem BME280 nemám zkušenost, ale díky za info. Hned nechám někoho v Číně vydělat :-)

  13. jasně, překlep. Bacha ještě existuje BMP280 a to měří jen tlak.

  14. Myslíš asi BME280 ?
    Jasně, to by šlo :-)
    Cena na AliExpressu je lehce přes 3$, takže nic co by jednoho zruinovalo.
    Pro Arduino existuje již hotová šikovná knihovna, takže zadáš jenom nadmořskou výšku a vypadne ti teplota i tlak už naservírovaný a spočítaný.

  15. To tam pak rovnou vraž bpe280 😉

    A tu máš rovnou vzorec na přepočet tlaku na hladinu moře, musíš znát jen aktuální nadmořskou výšku čidla pro první vzorec který je dostatečně přesný do cca 1000m n.m.
    Pro přesnější vzorec pak ještě teplotu, kterou ti poskytne to čidlo.
    Takhle jsem to řešil pro moji meteorologickou staničku kterou stále ne a ne dodělat z nedostatku času. Jinak funkce POW je mocnina s reálným mocnitelem …..zde na -5.257.
    Vstupem je Presure…..co ti naměří čidlo, absolutní tlak v hPa , Temperature….teplota v °C, altitude v metrech nad mořem.

    1. Pressure_Rel=Pressure+(altitude/8.3);

    2. Pressure_Rel=Pressure*pow((1-(0.0065*altitude/(Temperature+0.0065*altitude+273.15))),(-5.257));
    // Calculation is based on the following mean sea-level pressure transformation formula:
    // p0 =p1 (1-0,0065h / (T + 0,0065h +273,15))^-5,257 [hPa, hPa, m, *C]

  16. A kdyby se to vylepšilo tak, že ty dva použité piny budou I2C sběrnice, tak by bylo pěkné použít o hodně přesnější čidlo Si7021
    😉

  17. komentář níže….klikl jsem na jiné ODPOVEDET :(

  18. Ještě se to dá vylepšit a případné napájení čidel (obecně….pokud nemají moc velký odběr) dát na nějaký logický výstup….nebo pomocí něj napájení ovládat. A zapnout napájení těsně před měřením, nechat ustálit – nutno odzkoušet, ale pod vteřinu se to většinou vejde.
    Jako bonus získáš trochu snížení spotřeby pokud jedeš z baterií.

  19. Zajímavá myšlenka.
    To mě vůbec nenapadlo. Protože mi ale čínská čidla většinou dost kecají (běžně i o 2°C), tak jsem ani o parazitním napájení nikdy neuvažoval, protože jsem to viděl jako další zdroj možných problémů a komplikací.

  20. Mám lepší zkušenost s parazitním napájením (dva vodiče). Čidlo je napájené jen při měření a tolik se neohřeje.

  21. Souhlasím, mám stejnou zkušenost :-(
    Na venkovní teploměr to bohužel moc přesná čidla nejsou i když datasheet udává přesnost přijatelnou. Navíc se při rychlém opakovaném měření čidlo samo o sobě dost zahřívá a tím ještě víc lže. To se dá ale vyřešit přišroubováním na nějaký kousek hliníku a teplotu číst jenom jednou za čas (např. po minutě).
    Pro měření venkovní teploty používám čidlo DHT22. Je to kombinace docela slušného teplotního čidla + naprosto kecající čidlo vlhkosti, které prostě nepoužívám. Dobrá náhrada jsou i podobná čidla AM23xx.

  22. S tím měřením lépe-hůře u jiného čidla je to bohužel smutná skutečnost.
    Mám pár čidel DS18B20 koupených před pár lety v zaniklém KTE. Stály tenkrát kolem 40,- za kus. Tato čidla když hodím na jednu sběrnici a porovnám výstup tak mají rozptyl naměřené teploty výrazně pod 0,5°C.
    Nedávno jsem koupil výhodný balíček z eBay a některá z těchto čidel jsou od těch starých i o 2°C :(

    Jak to tak vypadá tak ta levná z Číny jsou pravděpodobně vyřazené kusy co neuspěly při kalibraci.

  23. Jasný, mám právě projekt připravený tak, že uživatel označuje čidlo, takže si je může měnit jak chce, ale vždy musí projít setupem. Takže index i adresa je pro mě „skoro“ totožná, Díky za odpovědi. Ať žije ARDUINO 😉

  24. Index je obezlička pro nezkušené programátory. Knihovna zjistí adresy všech čidel na sběrnici, uloží si je do paměti a přiřadí jim nějaký index, zpravidla na základě interní adresy (ID) čidla. Na první pohled pak vypadá práce s indexem jako „snažší“. A pak se přidá nebo vymění úplně nové čidlo na sběrnici, které dle svého interního ID zrovinka vyjde někam do dříve zavedeného indexu (pořadí) a je problém. Při výměně takového čidla je tak stejně potřeba znát jeho interní ID a z něj pak vyjde nějaký index na sběrnici. To už je rozumnější rovnou zjišťovat ID čidel a někam (do EEPROM) si je ukládat. A nebo zpět k „lazy“ variantě – jedno čidlo = jeden pin.

    PS: Z praxe mám zkušenost, že uživatel rád vyměňuje čidla mezi sebou, protože si myslí, že některé kecá, nebo že by to mohlo fungovat lépe a nebo prostě jenom proto, že ho to jenom tak napadlo 😉

  25. To je jasné. Já mám nyní připojené čidla na dvou digitálních vstupech (1 čidlo = 1 vstup), protože jsem nevěděl, že je adresa pevná a myslel jsem si, že se může změnit např při resetu/výpadku napájení. Takže teď to zapojím na jeden vstup ušetřím „díru“. Díky za odpovědi. Asi dokonce půjde přistupovat k čidlům jen přes index, ten se taky nezmění, což je jště jednodušší varinata. Stačí zadat jaký index je jaké čidlo a vše bude stále stejné.

    Díky

  26. Pokud bude ale na jedné sběrnici (jeden pin procesoru) jenom jedno čidlo, je možné vynechat adresování konkrétního čidla a používat zjednodušený režim komunikace. Příkazy se tak posílají všem čidlům na sběrnici, což je jeden kus a po zadání příkazu vrátit teplotu zase odpoví všechna čidla na sběrnici, což je zase jenom jeden kus. Pak není třeba řešit a znát adresu toho čidla a je možné ho např. v případě poruchy prostě jenom fyzicky vyměnit za jiné.

  27. Přesně tak, je nastavená z výroby.

  28. Chápu to dobře, že čidlo má svoji adresu pevně danou? Tedy po resetu/odpojení napájení bude stále čidlo na své adrese ?

  29. " Nahraďte za “
    < Nahraďte za

  30. Ahoj taky by se mi hodilo aby ten kod byl někde bez chyb jsem začátečník a nevyznám se v tom díky

  31. Zdravím, proč nemáte propojen vývod Vdd s GND, když používáte parazitní zapojení? Dle datasheetu tak má být učiněno. Děkuji

  32. Nedá se ten program dát někam ke stažení opravený bez těch html znaků? Díky

  33. Jedná se o takzvané parazitní napájení čidla.
    Čidlo provede měření, nasyslí si elektřinu do interního kondenzátoru a pak ji použije pro své napájení při odeslání dat.
    Ušetří se tím pár metrů jednoho drátu v aplikaci za několik tisíc korun a svět hned bude o něco ekologičtější :-)

  34. Bohužel se mi také ve zdrojovém kódu zobrazují HTML tagy místo apostrofů a uvozovek. To bude pro začátečníky velice matoucí 😉

  35. Podle toho obrázku není zapojen Vdd, a to proč ?

  36. Velice se omlouváme, jedná se o HTML (webové značky, které do kódu Arduino nepatří)

  37. jswm zacatecnik a neni mi jasny nasledujici zapis:
    #include <OneWire.h>
    proc tam neni jen
    #include „OneWire.h“
    preklad mi hlasi chybu hned na tomto radku
    Kde bych si mohl o tomto zapisu precist vic? Je to pouzite na vice mistech v tomto kodu.

  38. je tam čárka místo tečky.A to je chyba Petře Fuku.

  39. Díky, moc pomohlo. :-) Těším se na další díly

Napsat komentář

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