Here are couple of quick ways to set up temperature sensing with ESP32 using DS18B20 temperature sensors. Why DS18B20 you may ask. Well here is why:
- Measures Temperatures from -55°C to +125°C (-67°F to +257°F)
- ±0.5°C Accuracy from -10°C to +85°C
- Programmable Resolution from 9 Bits to 12 Bits
- Unique 1-Wire® Interface Requires Only One Port Pin for Communication
So its accurate sensor with nice range. Plus its it doesn’t need analog pins because it uses 1-wire digital interface.
So lets get started…
The sensor works with the method of 1-Wire communication. It requires only the data pin connected to the microcontroller with a pull up resistor and the other two pins are used for power.
DS18B20 datasheet: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf or archived here: DS18B20
We also need OneWire library: https://github.com/stickbreaker/OneWire or archived here: OneWire-master .
Also temperature sensor library: https://github.com/milesburton/Arduino-Temperature-Control-Library or archived here: Arduino-Temperature-Control-Library-master
We will use GPIO 15 And connect the 4.4k resistor between GIPO 15 and 3.3V.
Sesnsor wiring:
Sensor | ESP32 |
Red – VCC | 3.3V |
Black – GND | GND |
Yellow – Data | GPIO 15 |
Code without temperature sensor library:
include <OneWire.h> // OneWire DS18S20, DS18B20, DS1822 Temperature Example OneWire ds(15); // on pin D4 (a 4.7K resistor is necessary) void setup(void){ Serial.begin(9600); } void loop(void){ byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius, fahrenheit; if ( !ds.search(addr)){ ds.reset_search(); delay(250); return; } if (OneWire::crc8(addr, 7) != addr[7]){ Serial.println("CRC is not valid!"); return; } //Serial.println(); // the first ROM byte indicates which chip switch (addr[0]){ case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(1000); present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 9; i++){ data[i] = ds.read(); } // Convert the data to actual temperature int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10){ raw = (raw & 0xFFF0) + 12 - data[6]; } } else{ byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print("Temperature = "); Serial.print(celsius); Serial.print(" Celsius, "); Serial.print(fahrenheit); Serial.println(" Fahrenheit"); }
And now example with temperature sensor library:
// Include the libraries we need #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 2 on the Arduino #define ONE_WIRE_BUS 15 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); /* * The setup function. We only start the sensors here */ void setup(void) { // start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // Start up the library sensors.begin(); } /* * Main function, get and show the temperature */ void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Send the command to get temperatures Serial.println("DONE"); // After we got the temperatures, we can print them here. // We use the function ByIndex, and as an example get the temperature from the first sensor only. Serial.print("Temperature for the device 1 (index 0) is: "); Serial.println(sensors.getTempCByIndex(0)); }
Thanks for a good samples and explanations on how to connect a DS18D20 sensor to a ESP32 Board.
Hello, how to read the same data to SD card and save it.
To get you started check out:
https://jakemakes.eu/arduino-tf-micro-sd-card-tutorial/