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.

zveme vás ke spolupráci!