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">°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">°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/

ความคิดเห็น
แสดงความคิดเห็น