DS18B20 convenient digital thermal sensor. In industrial operation, sensors are usually used in a waterproof stainless steel capsule. Sensor Characteristics:
- The Range of measured temperatures is 55 ° ~ + 125 °.
- Supply Voltage 3.0 V ~ 5.5 V
- Low Cost (~ 1.3 USD)
- Single-Wire interface 1Wire.
- Accuracy ± 0.5 °C in the range of-10 °C to + 85 °C.
- Programmable resolution from 9 Bits to 12 Bits.
- Unique 64-bit serial number for each sensor eliminates conflicts on one bus.
- It Is possible to connect directly to microcontrollers without additional converters.
Sensor Outputs in stainless steel: Red (VCC), yellow (DATA), Black (GND)
The wiring Diagram is very simple. The Sensor is connected to the digital input via the resistor 4.7 K on + power supply.
I purchased sensors in metal waterproof capsules wholesale, 10 pcs. This seller on Aliexpress. Price ~ 1.3 USD per piece. With operative delivery to Russia. If the delivery time is not critical, the sensor can be ordered at a price of about 1 USD from many sellers on Aliexpress with free shipping.
Retrieving DS18B20 sensor addresses
#include < OneWire. h. OneWire DS (15); Data wire connected to GPIO15 void Setup (void) { Serial. Begin (9600); } void loop (void) { byte I; BYTE addr[8]; if (! ds. Search (addr)) { Serial. println ("No more addresses."); Serial. println (); ds. Reset_search (); Delay (250); Return } Serial. Print ("ROM ="); for (i = 0; i < 8; i + +) { Serial. Write (' '); Serial. Print (add[i]r, HEX); } }
DS18B20 sensor Survey
#include < OneWire. h. #include < DallasTemperature. h. Data wire is connected to GPIO15 #define ONE_WIRE_BUS 15 Setup a oneWire instance to communicate with a OneWire device OneWire oneWire (ONE_WIRE_BUS); Pass our oneWire reference to Dallas Temperature sensor DallasTemperature Sensors (& oneWire); DeviceAddress Sensor1 = {0x28, 0xB1, 0x13, 0x46, 0x92, 0xD, 0x2, 0xA7}; void Setup (void) { Serial. Begin (115200); Sensors. Begin (); } void loop (void) { Serial. Print ("Requesting temperatures..."); Sensors. requestTemperatures (); Send the command to get temperatures Serial. println ("DONE"); Serial. Print ("Sensor 1:"); Serial. Print (String (sensors. getTempC (Sensor1)) + "C,"); Serial. println (String (sensors. getTempF (Sensor1)) + "F"); tempSensor. requestTemperaturesByIndex (0); Get Single sensor value Serial. Print ("Temperature:"); Serial. Print (sensors. getTempCByIndex (0)); Serial. Print ("C,"); Serial. Print (sensors. getTempFByIndex (0)); Serial. println ("F"); Delay (1000); }
If more than one sensor hangs on the same bus, the code will be somewhat more complex. In this case, two DS18B20 sensors connected to the GPIO32 microcontroller ESP32 are tested.
#include "OneWire_Scanner. H" #include < OneWire. h. #include < DallasTemperature. h. #define OneWire_PIN 32 OneWire DS (OneWire_PIN); Pass our oneWire reference to Dallas Temperature sensor DallasTemperature Sensors (& DS); Count of DS18xxx Family devices on bus uint8_t devices = 0; Reset the number of devices when we enumerate wire devices uint8_t ds18Count = 0; Reset number of DS18xxx Family devices void Setup () { Sensors. Begin (); ScanOneWireDevicesAndShowTemp (); Output the total number of found devices Serial. println ("Foun[" + String(ds18Count) + "]d DS18XXX sensors of[" + String(devices) + "] iWare devices."); Serial. Print (sensors. getDeviceCount (), DEC); Serial. Print (sensors. getDS18Count (), DEC); Check how the power is connected Serial. Print ("Parasite power is:"); Serial. println (sensors. isParasitePowerMode ()? "ON": "OFF"); } void Loop () { ScanOneWireDevicesAndShowTemp (); Delay (1000); } String getSensorModel (uint8_t modelByte) { deviceAddress[0] String res = ""; Switch (modelByte) { Case DS18S20MODEL: return "DS18S20"; Case DS18B20MODEL: return "DS18B20"; Case DS1822MODEL: return "DS1822"; Case DS1825MODEL: return "DS1825"; Case DS28EA00MODEL: return "DS28EA00"; default: return "Unknown"; } } void ScanOneWireDevicesAndShowTemp () { DeviceAddress deviceAddress; while (ds. Search (deviceAddress)) { if (sensors. validAddress (deviceAddress)) { bitResolution = max (bitResolution, sensors. getResolution (deviceAddress)); Devices + +; if (sensors. validFamily (deviceAddress)) { Sensors. requestTemperatures (); Send the command to get temperatures Serial. Print ("Sensor"); printAddress (deviceAddress); Serial. println (". Temp: "+ String (sensors. getTempC (deviceAddress)) +" oC with resolution "+ String (sensors. getResolution (deviceAddress)) +" bit. Sensor "+ getSensorModel (deviceAddress[0]) +". "); ds18Count + +; } } } } void printAddress (DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i + +) { if (deviceAddress[i] < 16) Serial. Print ("0"); Serial. Print (deviceAddres[i]s, HEX); } }
The Result of the DS18B20 Sensor Survey code:
11:42:18.863-> Sensor 28B11346920D02A7. Temp: 24.19 oC with resolution 12 bit. Sensor DS18B20. 11:42:18.999-> Sensor 28FF6C7997090341. Temp: 28.12 oC with resolution 12 bit. Sensor DS18B20. 11:42:20.022-> Found[2] DS18XXX sensors of[2] iWare devices. 11:42:20.022-> Parasite power is: OFF