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.
