Chtěl jsem díky ARDUIN(u) měřit teplotu a pomocí programu ji nějakým způsobem vyhodnocovat. Poohlédl jsem se tedy po možnostech, kdy to za minimální náklady uskutečním co nejjednodušeji. Na Aukru jsem našel digitální obvod DS18S20. Tento obvod má pouze jediný výstup a pomocí jediného odporu 4K7 jej můžete připojit do Arduina a okamžitě začít měřit teplotu v rozmezí –55 až + 125 stupňů. Cena tohoto obvodu je okolo 42 Kč.
Zapojení tohoto obvodu je opravdu jednoduché.
Ono zapojení je jedna věc, druhá je ale naučit program, aby s obvodem pracoval. To byl trochu oříšek, jelikož je nutné pro komunikaci použít knihovnu OneWire, kterou ale musíte nejdříve na internetu stáhnout. Na stránkách projektu ARDUINO.CC přitom překvapivě stažení nefungovalo.
Po chvíli hledání jsem nalezl stránku, kde byly k dispozici příklad, i celý zdrojový kód i s knihovnou a tím se mi podařilo celé zapojení oživit.
U knihovny ještě zůstanu, jelikož zde je menší zádrhel, na který jsem narazil, když jsem se snažil obvod zprovoznit. Na internetu je těchto knihoven více a nejsou zdaleka všechny stejné. Některé končí chybou, a proto je nutné dohledat správnou verzi, aby vše fungovalo tak jak má.
Pro opakované použití je nutné knihovnu do arduina přidat. To se dělá tak, že se složka s knihovnou se musí přidat do složky a ardurinem a to do složky libaries.
Po importu této knihovny již příklad funguje jak má a jako odměnou se Vám ARDUINO odmění výpisem měřených hodnot.
Na zkušebním poli jde vidět i mé nouzové spojení odporu. Abych docílil orientační hodnoty 4K7 musel jsem spojit několik slabších odporu do sebe.
#include <OneWire.h>
int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 2
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
float temperature = getTemp();
Serial.println(temperature);
delay(100); //just here to slow down the output so it is easier to read
}
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}
Zajímavé odkazy
Danh
2013-01-10 19:12:23Díky moc už jsem byl zoufalej.Ale super návod :) jen se divim že arduino na to má tutoriál ale nemá v arduino ide tu složku
Ijacek.007
2013-01-10 19:48:09no taky jsem se divil ale přikládal jsem to tomu že složky v instalátoru se mění kdežto starší tutoriál zůstal bezezměn. Hlavně že jsem ti pomohl :-)
tonde
2013-03-19 11:45:16Ahoj, dík za inspiraci, večer doma vyzkouším, jelikož se mi obvod nepodařilo rozběhat, stále mi psalo, že nenašel periferii. Jen „teploměr“ se mi pár sekund po zapojení tak zahřál, že na něm nebylo možné ani udržet prst – setkal se s tím někdo? Děkuji :)
Ijacek.007
2013-03-19 12:15:33no zahřívat by se ten obvod určitě neměl pokud se zahřívá můžeš ho mít napojený špatně. Mě se rozhodně nehřeje.
tonde
2013-03-19 17:54:22:) já jsem totiž trošku debil, já zapojil odpor mezi signál a zem :DDDD Takže už to chodí, díky moc :)Ještě vyzkouším původní OneWire knihovnu.
Ijacek.007
2013-03-19 21:14:08tak hlavně že ti to funguje :-) když tak se pochlub dalším zajímavým zapojením :-)
tonde
2013-03-20 15:49:30snažím se dělat cnc řezačku epp, tak až bude nějaký výsledek, který se bude dát ukázat tak sem určitě písnu :)
Juro
2015-02-11 18:43:36Můžu se prosím zeptat…když připojim čidlo, napíšu stejný program, tak mi to vypisuje pouze hodnoty z return (-1000), když přepíšu, tak ono přepsané číslo. Co s tím?
Ijacek.007
2015-02-11 19:49:03ahoj Juro
no tak začni tím že napišeš jakou verzi arduina máš jakou verzi máš
programovací sw a kouknu co se dá dělat někde možná jen děláš chybu
nebo je příklad napsaný s chybou kdo ví to co jsem zde zveřejnil fungovalo
ale už to pod novou verzi fungovat nemusí.
ladae
2015-10-28 11:15:23Ahoj,
v seriovém monitoru se mi nic nezobrazuje. Dokážete poradit? začátečník :)
Arduino: 1.6.5 (Windows 7), Vývojová deska: “Arduino Nano, ATmega328”
ladae
2015-10-28 11:19:48Ahoj,
na seriovém monitoru se mi nic nezobrazí Dokážete poradit? začátečník :)
Arduino: 1.6.5 (Windows 7), Vývojová deska: “Arduino Nano, ATmega328”
Tony
2015-11-10 17:47:25Ahoj, které si použil DS18S20 nebo DS18B20. Protože máš na obrázku jiné označení než v popisku. Jaký je mezi nima rozdíl dají se zaměnit?
Ijacek.007
2015-11-12 08:51:38ahoj Tony,
no máš pravdu že je v tom trochu chaoz. Ani přesně nevím jaký vlastně
mám teploměr. Zkoušel jsem jej hledat a nemohl jsme ho najít. Mám teď v
„dílně“ poněkud problém s úklidem takže ani nezjistím který obvod
jsem použil.
Tony
2016-03-26 01:19:45Ahoj,
mám to zapojené a nahrané na Arduino, ale když dám vypsat hodnoty tak to ukazuje 3,06. Když čidlo zahřeju rukou celkem pomalu vstoupá teplota. Co s tím? Když jsem nahrál jiný kód tak to fungovalo dobře. Jen ten drůhý kód vypisuje více hodnot a já bych potřeboval jen sloupec čísel…
Ijacek.007
2016-03-26 09:58:58upřímně nevím kde by mohl být problém musel bych vyhrabat to čidlo a program spustit znovu abych zjistil zda se něco nezměnilo podle mě si ale někde musel udělat chybu.
Vložit komentář
* - vyžadované údaje. RSS kanál s komentáři