Webserver ESP8266 อ่านค่าจากเซ็นเซอร์ DS18B20



 Webserver ESP8266 อ่านค่าจากเซ็นเซอร์ DS18B20

อุปกรณ์ที่จำเป็น

บอร์ด ESP8266

Arduino IDE ที่ใช้ 2.3.2

เซ็นเซอร์ DS18B20

ตัวต้านทาน 4.7kΩ

สาย jumper

บอร์ดขนมปัง (ถ้ามี)

Computer สำหรับอัพโหลด โค้ดลงไปในบอร์ด


วิธีทำ

1.ต่อสาย 

2.ติดตั้งไลบรารี  DS18b20 ตัวอุณหภูมิสำหรับ ใครที่ยังไม่ได้ติดตั้งมาก่อน

  "OneWire" และ "DallasTemperature" ใน Library Manager

3.เขียนโคด้และอัพโหลดเข้าบอร์ด ESP8266


1. ขั้นตอนการต่อสาย:

DS18B20  -----> ESP8266

VCC สีแดง(ขา1)---> +5V 

GND สีดำ(ขา3) ---> GND 

DQ (ขา2) ----> ขาสัญญาณดิจิทัล D2


ต่อ ต้านทาน 4.7kΩ ระหว่าง DQ และ +5V เพื่อใช้เป็น pull-up

ต้านทาน 4.7kΩ ระหว่าง DQ และ +5V เพื่อใช้เป็น pull-up คืออะไร

คำอธิบายง่ายๆ:

คิดว่าวงจรดิจิทัลเป็นเหมือนถนนที่มีสัญญาณไฟจราจร สัญญาณไฟเหล่านี้จะบอกให้ข้อมูล 

วิ่งไปตามเส้นทางที่ถูกต้อง ต้านทาน 4.7kΩ ที่เชื่อมระหว่าง DQ และ +5V 

นี้ก็เหมือนกับสัญญาณไฟจราจรเล็ก ๆ ที่คอยบอกให้สัญญาณข้อมูล (ที่วิ่งอยู่ในสาย DQ) มีทิศทางที่ชัดเจน


ทำไมต้องใช้ pull-up resistor:

ป้องกันสัญญาณลอย: ถ้าไม่มีต้านทานตัวนี้ สัญญาณในสาย DQ อาจจะ "ลอย" ไม่รู้ว่าจะไปทางไหน ซึ่งอาจทำให้เกิดปัญหาในการทำงานของวงจร

กำหนดระดับแรงดันเริ่มต้น: ต้านทานตัวนี้จะดึงแรงดันในสาย DQ ให้ไปที่ +5V เมื่อไม่มีสัญญาณใดๆ มาสั่งให้เปลี่ยนแปลง ทำให้เราสามารถกำหนดค่าเริ่มต้นของสัญญาณได้

ค่า 4.7kΩ หมายถึงอะไร:

ค่าต้านทาน: 4.7kΩ คือค่าความต้านทานไฟฟ้าของตัวต้านทานตัวนี้ ยิ่งค่าสูง แรงดันที่ดึงขึ้นไปก็จะช้าลง แต่จะช่วยลดการกินกระแสไฟฟ้า

ทำไมต้อง 4.7kΩ: ค่านี้เป็นค่าที่นิยมใช้กันทั่วไปในวงจรดิจิทัล เพราะมันเป็นค่าที่เหมาะสมกับการใช้งานส่วนใหญ่ 

แต่ค่าที่ใช้จริงอาจแตกต่างกันไป ขึ้นอยู่กับลักษณะของวงจรและอุปกรณ์ที่ใช้

สรุป:

ต้านทาน 4.7kΩ ที่เชื่อมระหว่าง DQ และ +5V ทำหน้าที่เหมือนสัญญาณไฟจราจรเล็กๆ ที่คอยควบคุมทิศทางของสัญญาณข้อมูล ช่วยให้วงจรทำงานได้อย่างถูกต้องและมีเสถียรภาพ


การติดตั้งไลบรารี 

1. DS18B20 ตัววัดค่าอุณหภูมิจากเซ็นเซอร์ ใน Arduino IDE:

เปิด Arduino IDE

ไปที่เมนู Sketch > Include Library > Manage Libraries...

ค้นหา "OneWire" และ "DallasTemperature" ใน Library Manager

ติดตั้งทั้งสองไลบรารี


2.ดาว์นโหลด ESPAsyncWebServer libraly

 https://github.com/me-no-dev/ESPAsyncWebServer

 Unzip and Rename ESPAsyncWebServer 

 เก็บใน Arduino IDE libraries folder

หรือใช้วิธี Sketch > Include Library > Add .ZIP library เลือก zip ไฟล์ที่ดาว์นโหลดมา

3. ดาว์นโหลด ESPAsyncTCP-master  libraly

https://github.com/me-no-dev/ESPAsyncWebServer

Unzip Rename ESPAsyncTCP

เก็บใน Arduino IDE libraries folder

หรือใช้วิธี Sketch > Include Library > Add .ZIP library เลือก zip ไฟล์ที่ดาว์นโหลดมา 

แบบเดียวกับด้านบน

/// Full Code

// Import required libraries

#ifdef ESP32

  #include <WiFi.h>

  #include <ESPAsyncWebServer.h>

#else

  #include <Arduino.h>

  #include <ESP8266WiFi.h>

  #include <Hash.h>

  #include <ESPAsyncTCP.h>

  #include <ESPAsyncWebServer.h>

#endif

#include <OneWire.h>

#include <DallasTemperature.h>


// Data wire is connected to GPIO 4

#define ONE_WIRE_BUS 4


// Setup a oneWire instance to communicate with any OneWire devices

OneWire oneWire(ONE_WIRE_BUS);


// Pass our oneWire reference to Dallas Temperature sensor 

DallasTemperature sensors(&oneWire);


// Variables to store temperature values

String temperatureF = "";

String temperatureC = "";


// Timer variables

unsigned long lastTime = 0;  

unsigned long timerDelay = 3000;


// Replace with your network credentials

const char* ssid = "Nui 2.4G";

const char* password = "0895515998";


// Create AsyncWebServer object on port 80

AsyncWebServer server(80);


String readDSTemperatureC() {

  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus

  sensors.requestTemperatures(); 

  float tempC = sensors.getTempCByIndex(0);


  if(tempC == -127.00) {

    Serial.println("Failed to read from DS18B20 sensor");

    return "--";

  } else {

    Serial.print("Temperature Celsius: ");

    Serial.println(tempC); 

  }

  return String(tempC);

}


String readDSTemperatureF() {

  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus

  sensors.requestTemperatures(); 

  float tempF = sensors.getTempFByIndex(0);


  if(int(tempF) == -196){

    Serial.println("Failed to read from DS18B20 sensor");

    return "--";

  } else {

    Serial.print("Temperature Fahrenheit: ");

    Serial.println(tempF);

  }

  return String(tempF);

}


const char index_html[] PROGMEM = R"rawliteral(

<!DOCTYPE HTML><html>

<head>

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

  <style>

    html {

     font-family: Arial;

     display: inline-block;

     margin: 0px auto;

     text-align: center;

    }

    h2 { font-size: 3.0rem; }

    p { font-size: 3.0rem; }

    .units { font-size: 1.2rem; }

    .ds-labels{

      font-size: 1.5rem;

      vertical-align:middle;

      padding-bottom: 15px;

    }

  </style>

</head>

<body>

  <h2>ESP DS18B20 Server</h2>

  <p>

    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 

    <span class="ds-labels">Temperature Celsius</span> 

    <span id="temperaturec">%TEMPERATUREC%</span>

    <sup class="units">&deg;C</sup>

  </p>

  <p>

    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 

    <span class="ds-labels">Temperature Fahrenheit</span>

    <span id="temperaturef">%TEMPERATUREF%</span>

    <sup class="units">&deg;F</sup>

  </p>

</body>

<script>

setInterval(function ( ) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("temperaturec").innerHTML = this.responseText;

    }

  };

  xhttp.open("GET", "/temperaturec", true);

  xhttp.send();

}, 10000) ;

setInterval(function ( ) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("temperaturef").innerHTML = this.responseText;

    }

  };

  xhttp.open("GET", "/temperaturef", true);

  xhttp.send();

}, 10000) ;

</script>

</html>)rawliteral";


// Replaces placeholder with DS18B20 values

String processor(const String& var){

  //Serial.println(var);

  if(var == "TEMPERATUREC"){

    return temperatureC;

  }

  else if(var == "TEMPERATUREF"){

    return temperatureF;

  }

  return String();

}


void setup(){

  // Serial port for debugging purposes

  Serial.begin(115200);

  Serial.println();

  

  // Start up the DS18B20 library

  sensors.begin();


  temperatureC = readDSTemperatureC();

  temperatureF = readDSTemperatureF();


  // Connect to Wi-Fi

  WiFi.begin(ssid, password);

  Serial.println("Connecting to WiFi");

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println();

  

  // Print ESP Local IP Address

  Serial.println(WiFi.localIP());


  // Route for root / web page

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/html", index_html, processor);

  });

  server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/plain", temperatureC.c_str());

  });

  server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/plain", temperatureF.c_str());

  });

  // Start server

  server.begin();

}

 

void loop(){

  if ((millis() - lastTime) > timerDelay) {

    temperatureC = readDSTemperatureC();

    temperatureF = readDSTemperatureF();

    lastTime = millis();

  }  

}


////////////////////////


References:

การติดตั้ง ไดรเวอร์ DS18B20 บน Arduino IDE  

https://randomnerdtutorials.com/esp8266-ds18b20-temperature-sensor-web-server-with-arduino-ide/


ความคิดเห็น