Arduino in Kombination mit dem Temperatursensor DS18B20

Das Tutorial zeigt, wie man den Temperatursensor über das Arduino-Board handhabt.

Das Beispiel verwendet die folgenden Elemente:

Verbindung

Zunächst sollte die Bibliothek zur Arduino-Umgebung hinzugefügt werden (Sketch -> Include Library -> Add .ZIP Library ...). Schließen Sie dann die Sensorpins gemäß der folgenden Tabelle an:

Arduino-Stift Sensorstift
Masse Masse
Stift 10 DQ
5 V Vdd

Zusätzlich benötigt der Sensor einen 4,7 kΩ Pull-up-Widerstand zwischen dem DQ und der 5-V-Versorgung – dies gilt nicht für Module, die diesen Widerstand bereits eingebaut haben.

Anschlussplan Temperatursensor.

Service

Um die Temperatur vom Sensor zu erhalten, verwenden wir das Beispielprogramm DS18x20_Temperature aus der beigefügten Bibliothek (Datei -> Beispiele -> OneWire -> DS18x20_Temperature).

 
// OneWire DS18S20, DS18B20, DS1822 Temperaturbeispiel
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// Die DallasTemperature-Bibliothek kann all diese Arbeit für Sie erledigen!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire ds (10); // auf Pin 10 (ein 4,7K-Widerstand ist erforderlich)

void-Setup (void) {
  Serial.begin (9600);
}

Leere Schleife (leer) {
  Byte und;
  Byte vorhanden = 0;
  Bytetyp_s;
  Bytedatum [12];
  Byteadresse [8];
  schweben Celsius, Fahrenheit;
  
  if (! ds.search (adr)) {
    Serial.println ("Keine Adressen mehr.");
    Serial.println ();
    ds.reset_search ();
    Verzögerung (250);
    Rückkehr;
  }
  
  Serial.print ("ROM =");
  für (i = 0; i <8; i ++) {
    Serial.write ('');
    Serial.print (Adresse [i], HEX);
  }

  if (OneWire :: crc8 (Adresse, 7)! = Adresse [7]) {
      Serial.println ("CRC ist nicht gültig!");
      Rückkehr;
  }
  Serial.println ();

// Das erste ROM-Byte gibt an, welcher Chip Schalter (Adresse [0]) { Fall 0x10: Serial.println ("Chip = DS18S20"); // oder alter DS1820 Typ_s = 1; brechen; Fall 0x28: Serial.println ("Chip = DS18B20"); Typ_s = 0; brechen; Fall 0x22: Serial.println ("Chip = DS1822"); Typ_s = 0; brechen; Ursprünglich: Serial.println ("Gerät ist kein Gerät der DS18x20-Familie."); Rückkehr; } für zurücksetzen (); ds.select (Adresse); ds.write (0x44, 1); // Konvertierung starten, am Ende Parasit einschalten Verzögerung (1000); // vielleicht reichen 750 ms, vielleicht auch nicht // Wir könnten hier ein ds.depower() machen, aber der Reset wird sich darum kümmern. vorhanden = ds.reset (); ds.select (Adresse); ds.write (0xBE); // Scratchpad lesen Serial.print ("Daten ="); Serial.print (vorhanden, HEX); Serial.print (""); für (i = 0; i <9; i ++) {// benötigen wir 9 Bytes Daten [i] = ds.read (); Serial.print (Datum [i], HEX); Serial.print (""); } Serial.print ("CRC ="); Serial.print (OneWire :: crc8 (Daten, 8), HEX); Serial.println (); // Konvertieren Sie die Daten in die tatsächliche Temperatur // weil das Ergebnis eine vorzeichenbehaftete 16-Bit-Ganzzahl ist, es sollte // in einem "int16_t"-Typ gespeichert werden, der immer 16 Bit // hat, selbst wenn es auf einem 32-Bit-Prozessor kompiliert wird. int16_t raw = (Datum [1] << 8) | Datum [0]; if (type_s) {roh = roh << 3; // 9-Bit-Auflösungsvorgabe if (data [7] == 0x10) {// "count stay" ergibt volle 12-Bit-Auflösung raw = (raw & 0xFFF0) + 12 - data [6]; }} sonst {byte cfg = (date [4] & 0x60); // bei niedrigerer Auflösung sind die niedrigen Bits undefiniert, also nullen wir sie if (cfg == 0x00) raw = raw & ~ 7; // 9 Bit Auflösung, 93,75 ms sonst if (cfg == 0x20) raw = raw & ~ 3; // 10 Bit Auflösung, 187,5 ms sonst if (cfg == 0x40) raw = raw & ~ 1; // 11 Bit Auflösung, 375 ms //// Standard ist 12 Bit Auflösung, 750 ms Konvertierungszeit} celsius = (float) raw / 16.0; Fahrenheit = Celsius * 1,8 + 32,0; Serial.print ("Temperatur ="); Serial.print (Celsius); Serial.print ("Celsius"); Serial.print (fahrenheit); Serial.println ("Fahrenheit"); }

Die Auswirkungen des Programms sind im Screenshot unten zu sehen.

Screenshot des seriellen Monitors.

Wir freuen uns auf die Zusammenarbeit mit Ihnen!