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");*/
}