Arduino DallasTemperature könyvtár

Az 1-Wire protokoll használata bonyolult, és viszonylag hosszú kódra van szükség az eszközök működtetéséhez. A DallasTemperature könyvtár segítségével egyszerűen lekérdezhetjük a Dallas 1-Wire hőmérő IC adatait. A DallasTemperature könyvtát által támogatott eszközök: DS18B20, DS1822, DS18S20, DS1820.

Egy népszerű eszköz például a DS18B20 digitális hőmérséklet-érzékelő

TO92 tokozású, 55°C – +125°C közötti méréstartomány, ez 12bit felbontásban jelenik meg az adatkimeneti lábán.

Támogatja a 3,3V-ov és az 5V-os üzemi feszültséget.

Egy népszerű eszköz például a DS18B20 digitális hőmérséklet-érzékelő

hirdetés

Ebben a cikkben a Dallas Semiconductor DS18B20 1-Wire hőmérőjét használjuk a példákhoz. A DS18B20 egy kicsi TO92 tokozású hőmérő IC, amelyet digitális bemeneten keresztül csatlakoztathatjuk az Arduino kártyánkhoz. Ez egy 1 vezetékes eszköz, csak egy digitális tűre van szüksége a mikrokontrollerrel való kommunikációhoz.

A DallasTemperature könyvtár telepítése

A DallasTemperature könyvtár telepítéséhez nyissuk meg a könyvtárkezelőt a ‘Ctrl+Shift+i’ billentyükombinációval, vagy válasszuk a ‘Sketch -> Tartalmazza a könyvtárat -> Könyvtárak kezelése…’ menüpontot.

A keresőmezőbe írjuk be: ‘DallasTemperature’ vagy a ‘DS18B20’, majd telepítsük a ‘Miles Burton DallasTemperature‘ könyvtárát.

A DallasTemperature könyvtár használata

A DallasTemperature könyvtár használatához elöször is szükség van a ‘OneWire’ könyvtára. Ezután meghívhatjuk a vázlatunkban a DallasTemperature.h fájlt.

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

A DS18B20 érzékelővel való kommunikációhoz először létrehozunk egy oneWire objektumot, és paraméterként átadjuk annak az arduino pinnek a számát, amelyikhez a DS18B20 érzékelő adatvezetéke csatlakozik.

Ezután létrehozunk egy példányt a DallasTemperature objektumból, a paraméterében elhelyezünk egy hivatkozást az imént létrehozott oneWire objektumra.

const char oneWirePin = 10;

OneWire myOneWire(oneWirePin);	
DallasTemperature mySensors(&myOneWire);

begin

Elöször a begin függvény segítségével inicializáljuk a buszt a setup() szakaszban, ezután kezdődhet a kommunikáció.

void setup() 
{
  ....
  mySensors.begin();
  ...
}

Vissza a tartalomjegyzékhez.

getDeviceCount

A getDeviceCount függvény visszaadja a buszon talált eszközök számát.

int sensors = mySensors.getDeviceCount();
Serial.print("Devices: ");
Serial.println(sensors);

Vissza a tartalomjegyzékhez.

getAddress

A getAddress függvény igaz értéket ad vissza, ha címet talál a buszon az index paraméterben megadott helyen. A ‘deviceAddress’ paraméterbe kerül a talált eszköz hexadecimális címe.

DeviceAddress deviceAddress;
int index = 0;

bool foundAddress = mySensors.getAddress(deviceAddress, index);
if(foundAddress)
{
  for (int i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 0x10) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

Vissza a tartalomjegyzékhez.

validAddress

A validAddress függvény igazat ad vissza, ha az eszközcím érvényes.

DeviceAddress  deviceAddress;
mySensors.getAddress(deviceAddress, 0);

bool addressIsValid = mySensors.validAddress(deviceAddress);

Vissza a tartalomjegyzékhez.

validFamily

A validFamily függvény igaz értéket ad vissza, ha a cím a DallasTemperature könyvtár által támogatott érzékelők családjába tartozik.

DeviceAddress deviceAddress;
mySensors.getAddress(deviceAddress, 0);

bool familyIsValid = mySensors.validFamily(deviceAddress);

Vissza a tartalomjegyzékhez.

isConnected

Az isConnected függvény megpróbálja meg megállapítani, hogy a paraméterben megadott címen lévő eszköz csatlakozik-e a buszhoz.

DeviceAddress deviceAddress;
mySensors.getAddress(deviceAddress, 0);

bool connected = mySensors.isConnected(deviceAddress);

Az isConnected függvénynek megadható egy második paraméter is, ezáltal lehetővé teszi a scratchpad olvasását is.

DeviceAddress deviceAddress;
ScratchPad scratchPad;
mySensors.getAddress(deviceAddress, 0);

bool connected = mySensors.isConnected(deviceAddress, scratchPad);

Vissza a tartalomjegyzékhez.

readScratchPad

A readScratchPad függvény kiolvassa az eszköz scratchpad tartalmát.

DeviceAddress deviceAddress;
ScratchPad scratchPad;

mySensors.getAddress(deviceAddress, 0);
mySensors.readScratchPad(deviceAddress, scratchPad);

for(int i = 0; i < 9; i++)
{
  Serial.print(i);
  Serial.print(". byte: ");
  Serial.print(scratchPad[i]);
  Serial.println();
}

Vissza a tartalomjegyzékhez.

writeScratchPad

A writeScratchPad függvény segítségével írhatjuk a eszköz scratchpad tartalmát.

DeviceAddress deviceAddress;
ScratchPad scratchPad;

mySensors.getAddress(deviceAddress, 0);

scratchPad[2] = 30;
scratchPad[3] = 18;
mySensors.writeScratchPad(deviceAddress, scratchPad);

Vissza a tartalomjegyzékhez.

readPowerSupply

A readPowerSupply függvény igazat ad vissza, ha parazita módot, tehát a 2 vezetékes módot használunk. Hamis értéket ad vissza normál, 3 vezetékes mód használata esetén.

Ha nincs eszközcím megadva, akkor ellenőrzi, hogy a buszon lévő bármely eszköz használ-e parazita módot.

DeviceAddress deviceAddress;
mySensors.getAddress(deviceAddress, 0);

Serial.println(mySensors.readPowerSupply(deviceAddress));

Vissza a tartalomjegyzékhez.

getResolution

Ha a getResolution függvényt paraméter nélkül hívjuk meg, visszaadja az 1-Wire buszon lévő eszközökre vonatkozó felbontás általános értékét. A felbontás értéke: 9, 10, 11, vagy 12 bit lehet.

int resolutionGlobal = mySensors.getResolution();

Ha a getResolution függvény paramétere egy adott eszköz címe, akkor az adott eszköz felbontását adja vissza.

DeviceAddress deviceAddress;
mySensors.getAddress(deviceAddress, 0);

Serial.print(mySensors.getResolution(deviceAddress), DEC);

Vissza a tartalomjegyzékhez.

setResolution

A setResolution függvény paraméterben megadott értékre beállíthatjuk az 1-Wire buszon lévő eszközökre vonatkozó felbontás általános értékét. A felbontás: 9, 10, 11, vagy 12 bit lehet.

mySensors.setResolution(12);

Ha a setResolution függvényt két paraméterrel hívjuk meg, az 1. paraméterben megadott című eszközökre vonatkozó felbontás értékét a 2. paraméterben megadott értékre beállíthatjuk.

DeviceAddress deviceAddress;
mySensors.getAddress(deviceAddress, 0);

mySensors.setResolution(deviceAddress, 12);

Vissza a tartalomjegyzékhez.

setWaitForConversion

A setWaitForConversion függvény segítségével egy jelzőt állíthatunk be.

Ha a setWaitForConversion függvény paramétere true, a requestTemperature() függvény akkor tér vissza, amikor az átalakítás kész. Ez az alapértelmezés.

Ha a setWaitForConversion függvény paramétere false, a requestTemperature() függvény azonnal visszatér. Használjuk körültekintően, a konvertáláshoz szükséges időt biztosítani kell. Ez a módszer nem blokkolja a főprogram futását a konvertálás ideje alatt.

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

const char oneWirePin = 10;

OneWire myOneWire(oneWirePin);	
DallasTemperature mySensors(&myOneWire);

int  resolution = 12;
unsigned long lastTemperatureRequest = 0;
int delayForConversion = 0;
float temperature = 0.0;
DeviceAddress deviceAddress;

void setup()
{
  Serial.begin(115200);

  mySensors.begin();
  mySensors.getAddress(deviceAddress, 0);
  mySensors.setResolution(deviceAddress, resolution);
  mySensors.setWaitForConversion(false);
  mySensors.requestTemperatures();

  delayForConversion = 750 / (1 << (12 - resolution));
  lastTemperatureRequest = millis();
}

void loop()
{
  if (millis() - lastTemperatureRequest >= delayForConversion)
  {
    Serial.print(" Temperature: ");
    Serial.println(mySensors.getTempCByIndex(0));
    mySensors.requestTemperatures();
    lastTemperatureRequest = millis();
  }

}

Vissza a tartalomjegyzékhez.

getWaitForConversion

A getWaitForConversion függvénnyel lekérdezhetjük a setWaitForConversion függvény által beállított jelző értékét.

bool waitForConversionFlag = mySensors.getWaitForConversion();

Vissza a tartalomjegyzékhez.

setCheckForConversion

A setCheckForConversion beállítja a checkForConversion jelző értékét.
Ha a jelző értéke true, a requestTemperature() függvény vár a hőmérő IC válaszára, hogy az átalakítás befejeződött. Ha a jelző értéke false, a requestTemperature() függvény egy meghatározott ideig vár, amíg a konvertálás biztosan befejeződik.

mySensors.setCheckForConversion(false);

Vissza a tartalomjegyzékhez.

getCheckForConversion

A getCheckForConversion függvény segítségével lekérdezhetjük a checkForConversion jelző értékét.

bool checkForConversionFlag = mySensors.getCheckForConversion();

Vissza a tartalomjegyzékhez.

requestTemperatures

A requestTemperatures függvény parancsot küld a buszon lévő összes eszköznek a hőmérséklet-konverzió végrehajtására.

mySensors.requestTemperatures();

Vissza a tartalomjegyzékhez.

requestTemperaturesByAddress

A requestTemperaturesByAddress függvény parancsot küld a paraméterben megadott című eszköz számára a hőmérséklet-konverzió végrehajtására.

DeviceAddress deviceAddress;
mySensors.getAddress(deviceAddress, 0);

mySensors.requestTemperaturesByAddress(deviceAddress);

Vissza a tartalomjegyzékhez.

requestTemperaturesByIndex

A requestTemperaturesByIndex függvény parancsot küld a paraméterben megadott indexű eszköznek a hőmérséklet-konverzió végrehajtására.

mySensors.requestTemperaturesByIndex(0);

Vissza a tartalomjegyzékhez.

getTemp

A getTemp visszaadja a nyers hőmérsékleti értéket, vagy DEVICE_DISCONNECTED_RAW értékben, ha az eszköz scratchPad memóriája nem olvasható sikeresen. A DEVICE_DISCONNECTED_RAW számérték egy nagy negatív szám a készülék működési tartományán kívül.

float tempRaw = mySensors.getTemp(deviceAddress);

Vissza a tartalomjegyzékhez.

getTempC

A getTempC függvény visszaadja a hőmérsékletet °C -ban vagy DEVICE_DISCONNECTED_C-ben, ha az eszköz scratchPad memóriája nem olvasható sikeresen. A DEVICE_DISCONNECTED_C számérték egy nagy negatív szám az eszköz működési tartományán kívül.

float tempC = mySensors.getTempC(deviceAddress);

Vissza a tartalomjegyzékhez.

getTempF

A getTempF függvény visszaadja a hőmérsékletet °F-ben vagy DEVICE_DISCONNECTED_F-ben, ha az scratchPad memóriája nem olvasható sikeresen. A DEVICE_DISCONNECTED_F számértéke egy nagy negatív szám a készülék működési tartományán kívül.

float tempF = mySensors.getTempF(deviceAddress);

Vissza a tartalomjegyzékhez.

getTempCByIndex

A getTempCByIndex függvény visszadja a hőmérséklet °C -ban a paraméterben megadott indexű eszközről.

float tempC = mySensors.getTempCByIndex(0);

Vissza a tartalomjegyzékhez.

getTempFByIndex

A getTempFByIndex függvény visszadja a hőmérséklet °F-ban a paraméterben megadott indexű eszközről.

float tempF = mySensors.getTempFByIndex(0);

Vissza a tartalomjegyzékhez.

isParasitePowerMode

Az isParasitePowerMode függvény igazat ad vissza, ha az 1-wire buszon lévő eszköznek parazita tápellátásra van szüksége.

bool parasiteModeFlag = mySensors.isParasitePowerMode(); 

Vissza a tartalomjegyzékhez.

isConversionComplete

Az isConversionComplete függvény true értéket ad vissza, ha az konverzió befejeződött az 1-wire eszközön. Csak a busz első érzékelőjére vonatkozik.

Vissza a tartalomjegyzékhez.

setHighAlarmTemp

A setHighAlarmTemp függvénnyel beállíthatjuk az eszköz magas riasztási hőmérsékletét Celsius fokban. Elfogadja a lebegőpontos értéket, de figyelmen kívül hagyja a tizedesvessző utáni értékeket. Az érvényes tartomány -55C – 125C.

int celsius = 36;

mySensors.setHighAlarmTemp(deviceAddress, celsius);

Vissza a tartalomjegyzékhez.

setLowAlarmTemp

a setLowAlarmTemp függvény segítségével beállíthatjuk az eszköz alacsony riasztási hőmérsékletét Celsius fokban. Elfogadja a lebegőpontos értéket, de figyelmen kívül hagyja a tizedesvessző utáni értékeket. Az érvényes tartomány -55C – 125C.

int celsius = 14;

mySensors.setLowAlarmTemp(deviceAddress, celsius);

Vissza a tartalomjegyzékhez.

getHighAlarmTemp

A getHighAlarmTemp visszaadja az aktuális magas riasztási hőmérsékletet a paramétrben megadott eszközhöz.

int highAlarmTemp = mySensors.getHighAlarmTemp(deviceAddress);

Vissza a tartalomjegyzékhez.

getLowAlarmTemp

A getLowAlarmTemp visszaadja az aktuális alacsony riasztási hőmérsékletet a paramétrben megadott eszközhöz.

int lowAlarmTemp = mySensors.getLowAlarmTemp(deviceAddress);

Vissza a tartalomjegyzékhez.

resetAlarmSearch

A resetAlarmSearch alaphelyzetbe állítja a alarmSearch függvény által használt belső változókat.

Vissza a tartalomjegyzékhez.

alarmSearch

Az alarmSearch a 1-wire buszon aktív riasztással rendelkező eszközöket keres. Ha talál, a visszatérési értéke igaz lesz és a paraméterben található változóban tárolja a talált eszköz címét.

DeviceAddress deviceWithAlarmAddress;
bool foundAlarm = mySensors.alarmSearch(deviceWithAlarmAddress);

if(foundAlarm)
{
  for (int i = 0; i < 8; i++)
  {
    if (deviceWithAlarmAddress[i] < 0x10) Serial.print("0");
    Serial.print(deviceWithAlarmAddress[i], HEX);
  }
}
Serial.println();

Vissza a tartalomjegyzékhez.

hasAlarm

A hasAlarm függvény igazat ad vissza, ha bármely eszköz riasztási állapotot jelent a buszon.

bool hasAlarmFlag = mySensors.hasAlarm();

Ha a hasAlarm függvényt a paraméterben átadott eszközcímmel hívjuk meg, igazat ad vissza, ha az adott eszköz riasztással rendelkezik.

DeviceAddress deviceAddress;
bool hasAlarmFlag = mySensors.hasAlarm(deviceAddress);

Vissza a tartalomjegyzékhez.

processAlarms

A processAlarms() függvény futtatja a riasztáskezelőt az alarmSearch() által visszaadott összes eszközön.

mySensors.processAlarms();

Vissza a tartalomjegyzékhez.

setAlarmHandler

A setAlarmHandler függvény beállítja a riasztáskezelőt.

.....

void myAlarmHandler(const uint8_t* deviceAddress)
{
  Serial.print(mySensors.getHighAlarmTemp(deviceAddress), DEC);
  Serial.println(" °C");

  Serial.print(mySensors.getLowAlarmTemp(deviceAddress), DEC);
  Serial.println(" °C");
}
....

void setup()
{

  .....
  mySensors.begin();
  mySensors.setHighAlarmTemp(deviceAddress, 32);
  mySensors.setLowAlarmTemp(deviceAddress, 16);

  mySensors.setAlarmHandler(&myAlarmHandler);
  ....
}

void loop()
{
  .....
  mySensors.processAlarms();
  ......
}

Vissza a tartalomjegyzékhez.

set/get UserData

Ha nem használunk riasztáskezelőt, a két bájt felhasználható felhasználói adatként.

int data;
DeviceAddress deviceAddress;

mySensors.setUserData(deviceAddress, data);
int data;
int deviceIndex;

mySensors.setUserDataByIndex(deviceIndex, data); 
DeviceAddress deviceAddress;

int data = mySensors.getUserData(deviceAddress);
int deviceIndex = 0;

int data = mySensors.getUserDataByIndex(deviceIndex);

Vissza a tartalomjegyzékhez.

toFahrenheit

A toFahrenheit függvény konvertál Celsiusról Fahrenheitre.

float celsius = mySensors.getTempC(deviceAddress);
float fahrenheit = mySensors.toFahrenheit(celsius); 

Vissza a tartalomjegyzékhez.

toCelsius

A toCelsius függvény konvertál Fahrenheitről Celsiusra.

float fahrenheit = mySensors.getTempF(deviceAddress);
float celsius = mySensors.toCelsius(fahrenheit);

Vissza a tartalomjegyzékhez.

rawToCelsius

A rawToCelsius konvertál nyers adatból Celsius-fokra.

int raw = mySensors.getTemp(deviceAddress);
float celsius = mySensors.rawToCelsius(raw);

Vissza a tartalomjegyzékhez.

rawToFahrenheit

A rawToFahrenheit függvény nyers adatból Fahrenheitre konvertál.

int raw = mySensors.getTemp(deviceAddress);
float fahrenheit = mySensors.rawToFahrenheit(raw);

Vissza a tartalomjegyzékhez.

celsiusToRaw

A celsiusToRaw függvény Celsiusról nyers hőmérsékleti értékre konvertál.

float celsius = mySensors.getTempC(deviceAddress);
int raw = mySensors.celsiusToRaw(celsius);

Vissza a tartalomjegyzékhez.

Erőteljes Arduino tábla az Arduino Mega2560 breadboard adapterrel.

Arduino Mega2560 Rev3 Mikrokontroller
Erőteljes Arduino tábla az Arduino Mega2560 breadboard adapterrel – hirdetés

Példák DallasTemperature könyvtár használatára

DS18B20 olvasása

Az első példában egyetlen DS18B20 érzékelő hőmérsékletét kérdezük le és íratjuk ki a soros monitorra.

A vázlat elején behívjuk a szükséges könyvtárakat, és létrehozunk egy példányt az OneWire és a DallasTemperature osztályból.

Majd a setup részben inicializáljuk a soros portot és az 1-wire buszt a begin függvénnyel.

A requestTemperatures függvény segitségével elindítjuk a hőmérséklet konverziót. Ezután a getTempCByIndex függvénnyel lekérjük a DS 18B20 eszközről a hőmérséklet °C -ban.

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

const char oneWirePin = 10;

OneWire myOneWire(oneWirePin);	
DallasTemperature mySensors(&myOneWire);

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


void loop()
{
  mySensors.requestTemperatures();
  float tempC = mySensors.getTempCByIndex(0);


  Serial.print("Temperature: ");
  Serial.print(tempC);

  Serial.println("°C");
}

Vissza a tartalomjegyzékhez.

DS18B20 eszközök olvasása index szerint

A DallasTemperature könyvtár begin függvényének meghívásakor, megkeresi az összes támogatott érzékelőt, amely a buszon található. A buszon talált érzékelőket tömbként kezeli, és mindegyikhez indexet rendel. Ennek eredményeként az egyes érzékelőket az indexük alapján azonosítani tudjuk.

Itt van egy egyszerű vázlat, amely megkeresi az összes DSB1820-at a buszon, majd megmutatja mindegyik hőmérsékletét.

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

const char oneWirePin = 10;

OneWire myOneWire(oneWirePin);	
DallasTemperature mySensors(&myOneWire);

int deviceCount = 0;
float tempC;

void setup()
{
  Serial.begin(9600);
  mySensors.begin();
  
  deviceCount = mySensors.getDeviceCount();
  Serial.print(deviceCount, DEC);
  Serial.println(" device is on the 1-wire bus.");
}

void loop()
{ 
  mySensors.requestTemperatures();
  for (int i = 0;  i < deviceCount;  i++)
  {
    Serial.print(i+1);
    Serial.print(". Sensor temp.: ");
    tempC = mySensors.getTempCByIndex(i);
    Serial.print(tempC);
    Serial.print("°C -- ");
    Serial.print(mySensors.toFahrenheit(tempC));
    Serial.println("°F");
  }
  
  Serial.println("");
  delay(1000);
}

Vissza a tartalomjegyzékhez.

A DS18B20-as hőmérők címének megkeresése buszon

Minden DS18B20 hőmérő IC-t egyedi 64 bites címmel látták el a gyártás során, így meg tudjuk különböztetni az egyes eszközöket egymástól az 1-wire buszon.

Az alábbi vázlat segítségével megkereshetjük az összes DS18B20 hőmérőt az oneWire buszon, és kinyomtatja azok 1-wire címét a soros monitorra. Hogy könnyebben azonosíthassuk az egyes eszközöket, egyszerre csak egy DS18B20 IC-t csatlakoztassunk a buszhoz.

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

const char oneWirePin = 10;

OneWire myOneWire(oneWirePin);	
DallasTemperature mySensors(&myOneWire);

DeviceAddress newAddress;
int deviceCount = 0;

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

  deviceCount = mySensors.getDeviceCount();
  Serial.print(deviceCount, DEC);
  Serial.println(" device is on the 1-wire bus.");
  Serial.println();

  for (int i = 0;  i < deviceCount;  i++)
  {
    Serial.print(i+1);
    Serial.print(". Sensor Address: ")
    mySensors.getAddress(newAddress, i);
    printAddress(newAddress);
  }
}

void loop() {}

void printAddress(DeviceAddress deviceAddress)
{ 
  for (uint8_t i = 0; i < 8; i++)
  {
    Serial.print("0x");
    if (deviceAddress[i] < 0x10) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
    if (i < 7) Serial.print(", ");
  }
  Serial.println();
}

Jegyezzük fel az összes címet.

Vissza a tartalomjegyzékhez.

DS18B20 olvasása cím szerint

A következő példa a DS18B20 hőmérő IC-k címeit használja a hőmérsékletek olvasásához. Ne felejtsük el lecserélni a DS18B20 érzékelők címeit az elöbbi példa segítségével kinyert címekre!

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

const char oneWirePin = 10;

OneWire myOneWire(oneWirePin);	
DallasTemperature mySensors(&myOneWire);

DeviceAddress sensor1 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
DeviceAddress sensor2 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};

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

void loop()
{
  mySensors.requestTemperatures();
  
  Serial.print("1.Sensor temperature: ");
  printTemperature(sensor1);
  
  Serial.print("2.Sensor temperature: ");
  printTemperature(sensor2);

  Serial.println();
  delay(1000);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = mySensors.getTempC(deviceAddress);
  Serial.print(tempC);
  Serial.print("°C -- ");
  Serial.print(mySensors.toFahrenheit(tempC));
  Serial.println("°F");
}

Vissza a tartalomjegyzékhez.