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.
