Arduino ve spojení s teplotním senzorem DS18B20
Průvodce ukazuje, jak ovládat teplotní senzor přes desku Arduino.
Příklad používá následující prvky:
Spojení
Nejprve by měla být knihovna přidána do prostředí Arduino (Skica -> Zahrnout knihovnu -> Přidat knihovnu .ZIP ...). Poté připojte kolíky snímače podle níže uvedené tabulky:
Pin Arduino | Pin snímače |
---|---|
GND | GND |
Kolík 10 | DQ |
5 V | Vdd |
Kromě toho snímač vyžaduje mezi DQ a napájením 5 V pull-up rezistor 4,7 kΩ - to neplatí pro moduly, které již mají tento rezistor zabudovaný. |
Schéma připojení teplotního senzoru.
Servis
Abychom získali teplotu ze senzoru, použijeme ukázkový program DS18x20_Temperature z přiložené knihovny (Soubor -> Příklady -> OneWire -> DS18x20_Temperature).
// Příklad teploty OneWire DS18S20, DS18B20, DS1822 // // http://www.pjrc.com/teensy/td_libs_OneWire.html // // Knihovna DallasTemperature za vás může udělat vše! // http://milesburton.com/Dallas_Temperature_Control_Library OneWire ds (10); // na pin 10 (je nutný odpor 4,7 kB) void setup (void) { Serial.begin (9600); } void loop (void) { byte a přítomný bajt = 0; byte type_s; bajtové datum [12]; byte addr [8]; float celsius, fahrenheit; if (! ds.search (addr)) { Serial.println ("Už žádné adresy."); Serial.println (); ds.reset_search (); zpoždění (250); vrátit se; } Serial.print ("ROM ="); pro (i = 0; i <8; i ++) { Serial.write (''); Serial.print (addr [i], HEX); } if (OneWire :: crc8 (addr, 7)! = addr [7]) { Serial.println ("CRC není platný!"); vrátit se; } Serial.println ();
// první bajt ROM označuje, který čip switch (adresa [0]) { případ 0x10: Serial.println ("Čip = DS18S20"); // nebo starý DS1820 type_s = 1; přestávka; případ 0x28: Serial.println ("Čip = DS18B20"); type_s = 0; přestávka; případ 0x22: Serial.println ("Čip = DS1822"); type_s = 0; přestávka; výchozí: Serial.println ("Zařízení není zařízením řady DS18x20."); vrátit se; } pro reset (); ds.select (addr); ds.write (0x44, 1); // zahájit převod, na konci zapnuto napájení parazita zpoždění (1000); // možná 750 ms stačí, možná ne // můžeme zde udělat ds.depower (), ale reset se o to postará. present = ds.reset (); ds.select (addr); ds.write (0xBE); // Číst Scratchpad Serial.print ("Data ="); Serial.print (přítomen, HEX); Serial.print (""); pro (i = 0; i <9; i ++) {// potřebujeme 9 bytů data [i] = ds.read (); Serial.print (datum [i], HEX); Serial.print (""); } Serial.print ("CRC ="); Serial.print (OneWire :: crc8 (data, 8), HEX); Serial.println (); // Převést data na skutečnou teplotu // protože výsledkem je 16bitové celé číslo se znaménkem, mělo by být // uloženo do typu „int16_t“, což je vždy 16 bitů // i při kompilaci na 32bitovém procesoru. int16_t raw = (datum [1] << 8) | datum [0]; if (type_s) {raw = raw << 3; // Výchozí rozlišení 9 bitů if (data [7] == 0x10) {// "count remain" dává plné 12bitové rozlišení raw = (raw & 0xFFF0) + 12 - data [6]; }} else {byte cfg = (datum [4] & 0x60); // při nižším rozlišení jsou nízké bity nedefinované, takže je vynulovme, pokud (cfg == 0x00) raw = raw & ~ 7; // 9bitové rozlišení, 93,75 ms jinak if (cfg == 0x20) raw = raw & ~ 3; // 10 bit res, 187,5 ms else if (cfg == 0x40) raw = raw & ~ 1; // 11bitové rozlišení, 375 ms //// výchozí je 12bitové rozlišení, doba konverze 750 ms} celsius = (float) raw / 16,0; fahrenheit = Celsia * 1,8 + 32,0; Serial.print ("Teplota ="); Serial.print (celsius); Serial.print ("Celsius"); Serial.print (fahrenheit); Serial.println ("Fahrenheit"); }
Účinky programu lze vidět na snímku obrazovky níže.
Screenshot sériového monitoru.