Senzor DS18B20 je nejen mezi Arduino komunitou velmi rozšířené zařízení, které umožňuje snadno změřit teplotu okolního vzduchu. V našem obchodě naleznete hned několik provedení jako např. senzor určený k pájení 1452201536, voděodolnou sondu 1508312737 či voděodolnou sondu s modulem 1523260406. Voděodolné sondy je možné použít i ve vlhkém/mokrém prostředí a disponují stupněm krytí IP67. Sondu s modulem je navíc možné připojit k Arduinu bez použítí rezistoru, který je společně s kondenzátorem osazen na PCB modulu. 

DS18B20 využívá ke komunikaci s mikrokontrolérem sběrnici 1-Wire, díky které je možné přijímat a odesílat data prostřednictvím pouze jednoho vodiče. Nespornou výhodou koncepce komunikačního rozhraní 1-Wire je připojení několika senzorů na jednu sběrnici tedy na jeden signálový vodič. Další výhodou sběrnice One Wire je možnost výběru zapojení (to neplatí u sondy s modulem, kde je zapojení dáno piny modulu). Lze použít dvouvodičové neboli parazitní zapojení či trojvodičové klasické zapojení.

Pinout DS18B20

Parazitní zapojení senzoru DS18B20 a popis dalšího možného zapojení již ve svém článku zpracoval kolega Luboš M. (https://navody.dratek.cz/navody-k-produktum/teplotni-senzor-ds18b20.html). Zapojením jednoho modulu a vysvětlováním možných zapojení se tedy nebudeme zabývat a pustíme se rovnou do zapojení více senzorů na jednu sběrnici. Následně ze senzorů vyčteme data pomocí Arduina.

Klasické zapojení

Klasické zapojení

V zapojení je použit 4K7 rezistor.

Parazitní zapojení

Parazitní zapojení

V zapojení je použit 4K7 rezistor.

Program

Software je pro obě zapojení identický, tudíž není třeba cokoliv měnit. Nicméně, je nutné stáhnout knihovnu OneWire a DallasTemperature. V programu vytvoříme instanci třídy OneWire. Adresa instance je následně parametrem konstruktoru instance DallasTemperature. Daná instance již slouží pro přímé ovládání senzorů na sběrnici, ale pozor, instance je pouze jedna. Jednotlivé senzory se rozlišují podle indexu, který je součástí parametru metod (tam kde je to nutné) dané knihovny. Index senzoru je určen podle pořadí, v kterém jsou senzory zapojeny (jsou číslovány od nuly). Na začátku programu si rovněž vypíšeme počet připojených senzorů a jejich adresy. Následně bude ve smyčce vypisována teplota ze senzorů. Ukázkový program je navržen tak, aby bylo možné použít libovolné množství senzorů bez jakékoliv softwarové úpravy.

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

#define BUS_PIN 4
#define ADR_SIZE 8 //byte

//vytvoreni instanci
OneWire Bus(BUS_PIN);
DallasTemperature Sensors(&Bus);
DeviceAddress DevAdr;

uint8_t nSensors = 0;

void printAddress(DeviceAddress devAdr, uint8_t idx);
void getTemp();

void printAddress(DeviceAddress devAdr, uint8_t idx)
{
  Serial.print("Adresa senzoru ");
  Serial.print(idx + 1);
  Serial.print(": ");

  for (uint8_t i = 0; i < ADR_SIZE; i++)
  {
    if (devAdr[i] < 16) Serial.print("0");
    Serial.print(devAdr[i], HEX);
  }
  Serial.println();
}

void getTemp(){
  Sensors.requestTemperatures();

  for (uint8_t i = 0; i < nSensors; i++)
  {
    Serial.print("Teplota cidla ");
    Serial.print(i + 1);
    Serial.print(": ");
    Serial.println(Sensors.getTempCByIndex(i));
  }
  Serial.println("****************************");
  delay(2000);
}

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

  //pocet senzoru
  nSensors = Sensors.getDeviceCount();

  //vypis poctu senzoru
  Serial.print("Pocet senzoru: ");
  Serial.println(nSensors);

  //vypis adres senzoru
  for (uint8_t i = 0; i < nSensors; i++)
  {
    Sensors.getAddress(DevAdr, i);
    printAddress(DevAdr, i);
  }
  Serial.println("****************************");
}

void loop(void) {
  //cteni teploty
  getTemp();
}
FB tw

Další podobné články