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.
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);
A DallasTemperature könyvtár függvényei – Tartalomjegyzék
Példák a DallasTemperature könyvtár használatához – Tartalomjegyzék
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();
...
}
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);
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);
}
}
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);
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);
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);
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();
}
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);
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));
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);
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);
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();
}
}
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();
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);
getCheckForConversion
A getCheckForConversion függvény segítségével lekérdezhetjük a checkForConversion jelző értékét.
bool checkForConversionFlag = mySensors.getCheckForConversion();
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();
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);
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);
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);
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);
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);
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);
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);
Funduino UNO XXL Tanulókészlet
hirdetés
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();
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.
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);
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);
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);
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);
resetAlarmSearch
A resetAlarmSearch alaphelyzetbe állítja a alarmSearch függvény által használt belső változókat.
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();
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);
processAlarms
A processAlarms() függvény futtatja a riasztáskezelőt az alarmSearch() által visszaadott összes eszközön.
mySensors.processAlarms();
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();
......
}
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);
toFahrenheit
A toFahrenheit függvény konvertál Celsiusról Fahrenheitre.
float celsius = mySensors.getTempC(deviceAddress);
float fahrenheit = mySensors.toFahrenheit(celsius);
toCelsius
A toCelsius függvény konvertál Fahrenheitről Celsiusra.
float fahrenheit = mySensors.getTempF(deviceAddress);
float celsius = mySensors.toCelsius(fahrenheit);
rawToCelsius
A rawToCelsius konvertál nyers adatból Celsius-fokra.
int raw = mySensors.getTemp(deviceAddress);
float celsius = mySensors.rawToCelsius(raw);
rawToFahrenheit
A rawToFahrenheit függvény nyers adatból Fahrenheitre konvertál.
int raw = mySensors.getTemp(deviceAddress);
float fahrenheit = mySensors.rawToFahrenheit(raw);
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);
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");
}
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);
}
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.
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");
}