Arduino teplomer s DS18B20

ds18b20 senzor a Arduino

V predchádzajúcom článku sme si predstavili zbernicu 1-wire, po ktorej mnohé zariadenia komunikujú. Dnes si pripojíme snímač teploty DS18B20. V tomto príklade použijeme len jeden snímač, ale pripojiť ich možme hneď niekoľko bez väčších zmien v kóde. Datasheet a popis pinov DS18B20 nájdete tu. V jednoduchosti nám stačí pripojiť pin 1 na ZEM (-), pin 2 na Arduino pin 6, pin 3 na +5V. Ešte je potrebné doplniť 4.7k rezistor medzi pin 2 a 3 snímača.

Ako prvý nasleduje kód, ktorý nám vyhladá všetky 1-wire zariadenia pripojené na zbernici. Následne vypíše ich unikátne adresy, ktoré si poznačíme a použijeme ich v ďalšom kóde ako identifikátor nášho teplotného čidla. Nezabudnite si doplniť knižnice pre 1-wire zbernicu:

// Zdroj: http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html

#include <OneWire.h>

OneWire  ds(6);  // DS18B20 pripojime na pin 6

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

void discoverOneWireDevices(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  Serial.print("Hladam 1-Wire zariadenia...\n\r");
  while(ds.search(addr)) {
    Serial.print("\n\rNajdene \'1-Wire\' zariadenia a ich adresa:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
        Serial.print("CRC nieje spravne!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rKoniec.\r\n");
  ds.reset_search();
  return;
}

void loop(void) {
  // nothing to see here
}

1-wire hladac adries

Tu už nasleduje samotný kód teplomeru, ktorý vypisuje aktuálnu teplotu na seriálovú konzolu (ako je zobrazené na prvom obrázku).

// Zdroj: http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 6

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress insideThermometer = { 0x28, 0xAA, 0x08, 0x03, 0x03, 0x00, 0x00, 0xDF };
DeviceAddress outsideThermometer = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };

void setup(void)
{
  // teplota sa bude zobrazovat na seriovej konzole
  Serial.begin(9600);
  // Start kniznice
  sensors.begin();
  // Nastavenie rozlisenia na 10 bitov
  sensors.setResolution(insideThermometer, 10);
  sensors.setResolution(outsideThermometer, 10);
  sensors.setResolution(dogHouseThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Chyba, senzor neodpoveda");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
  }
}

void loop(void)
{
  delay(2000);
  Serial.print("Zistujem teplotu...\n\r");
  sensors.requestTemperatures();

  Serial.print("Vnutorna teplota: ");
  printTemperature(insideThermometer);
  Serial.print("\n\r");
  /*Serial.print("vonkajsia: ");
  printTemperature(outsideThermometer);
  Serial.print("\n\r");
  Serial.print("Pivnica: ");
  printTemperature(dogHouseThermometer);
  Serial.print("\n\r\n\r");*/
}

Arduino a 1-Wire protokol

1-wireNa dnes som si pripravil trochu teórie, predtým ako budú pribúdať zapojenia s použitím 1-Wire protokolu (one-wire). Vyvinula ho spoločnosť Dallas, ktorú vlastní firma Maxim. Protokol sa nazýva 1-wire, pretože na komunikáciu mu stačí iba jeden vodič. Typicky pracuje s napätím 2.8V až 6V a využíva CMOS/TTL logiku. Maximálne 0.8V pre logickú “nulu” a minimálne 2.2V pre logickú “jednotku”. Po 1-wire zbernici dokážeme komunikovať len v halfduplex móde, to znamená len vysielať, alebo príjmať v ten istý čas. Pri komunikácii musí byť aspoň jedno zariadenie Master (veliteľ). Každé 1-wire zariadenie má jedinečnú 64-bitovú adresu, ktorú využíva pri identifikácii na 1-wire zbernici. Skladá sa z 8-bitov identifikujúcich typ zariadenia, 48-bitového sériového čísla a nakoniec 8-bitové CRC. Štandardne sa využíva CAT5 kábel (sieťový) na zapájanie 1-wire senzorových sietí. Možnosť zapojenia využíva zvyčajne 3 piny – zem, napájanie a dáta. Ďalšia možnosť je použiť tzv. parazitné zapojenie, pri ktorom sa použijú len dva vodiče – zem a dátový vodič (vstup pre napájanie sa pripojí k zemi). Táto druhá možnosť má však mnoho nevýhod (napr. nižšia spoľahlivosť prenosu dát).

Najznámejšie 1-wire zariadenia:

  • DS18B20 / DS18S20 / DS1822 – Vysoko precízny teplomer schopný merať rozsah teplôt od -55°C do +125°C pri ±0.5°C
    ds18b20
  • iButton – Sú to aj u nás známe dotykové “kľúče”, ktoré používame na vstup do vchodov panelákov a budov. Momentálne je ich v obehu po celom svete až 175 miliónov.
    ibutton 1-wire
  • DS2405 / DS2406 – vstupno výstupné zariadenie ovládané cez 1-wire. Príklad aplikácie môže byť spínacie relé (zapínanie/vypínanie svetla), alebo detekcia zopnutého kontaktu (či je okno otvorené alebo zatvorené).

Nasleduje popis komunikácie na 1-wire zbernici, ktorý sa skladá z troch fáz. Komunikácia vždy začína RESET príkazom a trvá 480 mikrosekúnd.

  1. RESET signál / Synchronizácia [RESET SEQUENCE]
  2. Príkaz pre výber cieľového zariadenia [ROM CMD SEQUENCE]
  3. Špecifický príkaz pre cieľové zariadenie [FUNCTION SEQUENCE]

1-wire signalizácia

V ďalšej časti si už pripojíme dáke to one-wire zariadenie.