Temperature Sensor Web Server with ESP8266 ESP01 & DS18B20

Temperature Sensor Web Server with ESP8266 ESP01 & DS18B20

Introduction

In this tutorial, we are going to make a simple “Temperature Sensor Web Server with ESP8266 ESP01 & DS18B20”. ESP8266 displays readings of Temperature in Celsius & Fahrenheit on a web page from DS18B20 Sensor. This is just a simple demonstration we can make more things by combining multiple sensors, broadcast reading in the world, etc. This tutorial pre assumes that you have experience in programming ESP8266-ESP01. So let’s get started!

JLCPCB is the foremost PCB prototype & manufacturing company in china, providing us with the best service we have ever experienced regarding (Quality, Price Service & Time).

Hardware Component

The following components are required to make Temperature Sensor Web Server Circuit

S.noComponentValueQty
1.ESP011
2.Temperature SensorDS18B201
3.Connecting Wires
4.Resistor4.7k1

DS18B20 Pinout

ds18b20-digital-temperature-sensor-pinout

For a detailed description of pinout, dimension features, and specifications download the datasheet of DS18B20

Temperature Sensor Web Server Circuit

Temperature-Sensor-Web Server -Circuit-Diagram-Schematic

Connections

Connections are very simple. We added a 4.7k Resistor in between VCC & DQ of DS18B20. DQ is also connected to the GPIO2 of ESP8266 ESP01. RX & TX Pin can be used to see data on the serial monitor. Be careful while powering up the circuit in our case we used a 3.7 Lithium Cell which is nearly 3.3v. Don’t power it up with 5V

ESP8266 ESP01 Code

  1. #include <ESP8266WiFi.h>
  2. #include <OneWire.h>
  3. const char* ssid = "TP-LINK_CD2ED6"; // Your ssid
  4. const char* password = "20244064"; // Your Password
  5. OneWire ds(2); // on pin 2 (a 4.7K resistor is necessary)
  6. WiFiServer server(80);
  7. void setup() {
  8. Serial.begin(115200);
  9. delay(10);
  10. // Connect to WiFi network
  11. Serial.println();
  12. Serial.println();
  13. Serial.print("Connecting to ");
  14. Serial.println(ssid);
  15. WiFi.begin(ssid, password);
  16. while (WiFi.status() != WL_CONNECTED) {
  17. delay(500);
  18. Serial.print(".");
  19. }
  20. Serial.println("");
  21. Serial.println("WiFi connected");
  22. // Start the server
  23. server.begin();
  24. Serial.println("Server started");
  25. // Print the IP address
  26. Serial.println(WiFi.localIP());
  27. }
  28. void loop() {
  29. byte i;
  30. byte present = 0;
  31. byte type_s;
  32. byte data[12];
  33. byte addr[8];
  34. float celsius, fahrenheit;
  35. if ( !ds.search(addr)) {
  36. Serial.println("No more addresses.");
  37. Serial.println();
  38. ds.reset_search();
  39. delay(250);
  40. return;
  41. }
  42. Serial.print("ROM =");
  43. for ( i = 0; i < 8; i++) {
  44. Serial.write(' ');
  45. Serial.print(addr[i], HEX);
  46. }
  47. if (OneWire::crc8(addr, 7) != addr[7]) {
  48. Serial.println("CRC is not valid!");
  49. return;
  50. }
  51. Serial.println();
  52. // the first ROM byte indicates which chip
  53. switch (addr[0]) {
  54. case 0x10:
  55. Serial.println(" Chip = DS18S20"); // or old DS1820
  56. type_s = 1;
  57. break;
  58. case 0x28:
  59. Serial.println(" Chip = DS18B20");
  60. type_s = 0;
  61. break;
  62. case 0x22:
  63. Serial.println(" Chip = DS1822");
  64. type_s = 0;
  65. break;
  66. default:
  67. Serial.println("Device is not a DS18x20 family device.");
  68. return;
  69. }
  70. ds.reset();
  71. ds.select(addr);
  72. ds.write(0x44, 1); // start conversion, with parasite power on at the end
  73. delay(1000); // maybe 750ms is enough, maybe not
  74. // we might do a ds.depower() here, but the reset will take care of it.
  75. present = ds.reset();
  76. ds.select(addr);
  77. ds.write(0xBE); // Read Scratchpad
  78. Serial.print(" Data = ");
  79. Serial.print(present, HEX);
  80. Serial.print(" ");
  81. for ( i = 0; i < 9; i++) { // we need 9 bytes
  82. data[i] = ds.read();
  83. Serial.print(data[i], HEX);
  84. Serial.print(" ");
  85. }
  86. Serial.print(" CRC=");
  87. Serial.print(OneWire::crc8(data, 8), HEX);
  88. Serial.println();
  89. int16_t raw = (data[1] << 8) | data[0];
  90. if (type_s) {
  91. raw = raw << 3; // 9 bit resolution default
  92. if (data[7] == 0x10) {
  93. // "count remain" gives full 12 bit resolution
  94. raw = (raw & 0xFFF0) + 12 - data[6];
  95. }
  96. } else {
  97. byte cfg = (data[4] & 0x60);
  98. // at lower res, the low bits are undefined, so let's zero them
  99. if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
  100. else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
  101. else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
  102. //// default is 12 bit resolution, 750 ms conversion time
  103. }
  104. celsius = (float)raw / 16.0;
  105. fahrenheit = celsius * 1.8 + 32.0;
  106. Serial.print(" Temperature = ");
  107. Serial.print(celsius);
  108. Serial.print(" Celsius, ");
  109. Serial.print(fahrenheit);
  110. Serial.println(" Fahrenheit");
  111. WiFiClient client = server.available();
  112. client.println("HTTP/1.1 200 OK");
  113. client.println("Content-Type: text/html");
  114. client.println("Connection: close"); // the connection will be closed after completion of the response
  115. client.println("Refresh: 5"); // refresh the page automatically every 5 sec
  116. client.println();
  117. client.println("<!DOCTYPE HTML>");
  118. client.println("<html>");
  119. client.print("<p style='text-align: center;'>&nbsp;</p>");
  120. client.print("<p style='text-align: center;'><span style='font-size: x-large;'><strong>ESP8266 & DS18B20 Temperature Sensor Server</strong></span></p>");
  121. client.print("<p style='text-align: center;'><span style='font-size: x-large;'><strong>www.Circuit-DIY.com</strong></span></p>");
  122. client.print("<p style='text-align: center;'><span style='color: #0000ff;'><strong style='font-size: large;'>Temperature in Celcius = ");
  123. client.println(celsius);
  124. client.print("<p style='text-align: center;'><span style='color: #0000ff;'><strong style='font-size: large;'>Temperature in Fahrenheit = ");
  125. client.println(fahrenheit);
  126. client.print("<p style='text-align: center;'>&nbsp;</p>");
  127. client.print("<p style='text-align: center;'>&nbsp;</p>");
  128. client.print("<p style='text-align: center;'>&nbsp;");
  129. client.print("</p>");
  130. client.println("</html>");
  131. delay(5000);
  132. }

Working Explanation

Code is simple first you will need to install OneWire Library from here https://github.com/PaulStoffregen/OneWire. Update your SSID & Password according to your network. In code, we defined a one-wire protocol at GPIO2 of ESP8266 and then created a WebServer at Port 80.

In the Setup function if we connected to wifi successfully then it will display “WiFi connected” & “Server started” on the serial monitor otherwise a loop function call, again and again, displays a dotted line.

In the loop function, we defined some variables to store data from sensor DS18B20. Sensor reading data every 1000 milliseconds and updated on these variables in Fahrenheit and Celcius. Last we broadcast readings on a webpage using the local IP assigned by the router. You can check from the serial monitor at which IP ESP8266 is broadcasting the entire webpage.