Đây là hướng dẫn chuyên sâu về cảm biến nhiệt độ DS18B20 với ESP8266 sử dụng Arduino IDE. Chúng tôi sẽ đề cập đến cách nối dây cảm biến, cài đặt các thư viện cần thiết và viết mã để đọc cảm biến từ một và nhiều cảm biến. Cuối cùng, chúng ta sẽ xây dựng một máy chủ web đơn giản để hiển thị các chỉ số cảm biến.Trong suốt hướng dẫn này, chúng tôi sẽ đề cập đến các chủ đề sau:1. Đọc nhiệt độ từ một cảm biến nhiệt độ DS18B20;2. Đọc nhiệt độ từ nhiều cảm biến nhiệt độ DS18B20;3. Hiển thị số đọc cảm biến DS18B20 trên máy chủ web
Trang 1Cảm biến nhiệt độ ESP8266 DS18B20 với Arduino IDE
(Máy chủ Web, Đơn, Nhiều)
Đây là hướng dẫn chuyên sâu về cảm biến nhiệt độ DS18B20 với ESP8266 sử dụng
Arduino IDE Chúng tôi sẽ đề cập đến cách nối dây cảm biến, cài đặt các thư viện cần
thiết và viết mã để đọc cảm biến từ một và nhiều cảm biến Cuối cùng, chúng ta sẽ xây
dựng một máy chủ web đơn giản để hiển thị các chỉ số cảm biến.
Trong suốt hướng dẫn này, chúng tôi sẽ đề cập đến các chủ đề sau:
1 Đọc nhiệt độ từ một cảm biến nhiệt độ DS18B20;
2 Đọc nhiệt độ từ nhiều cảm biến nhiệt độ DS18B20;
3 Hiển thị số đọc cảm biến DS18B20 trên máy chủ web.
Bạn cũng có thể thích đọc các hướng dẫn DS18B20 khác:
Tìm hiểu thêm về ESP8266 với khóa học của chúng tôi: Tự động hóa gia đình bằng
ESP8266.
Giới thiệu cảm biến nhiệt độ DS18B20
Cảm biến nhiệt độ DS18B20 là cảm biến nhiệt độ kỹ thuật số một dây Điều này có nghĩa
là nó chỉ yêu cầu một dòng dữ liệu (và GND) để giao tiếp với ESP8266 của bạn.
Trang 2Nó có thể được cung cấp năng lượng bởi nguồn điện bên ngoài hoặc nó có thể lấy năng lượng từ đường dữ liệu (được gọi là "chế độ ký sinh trùng"), giúp loại bỏ sự cần thiết của nguồn điện bên ngoài.
Mỗi cảm biến nhiệt độ DS18B20 có một mã sê-ri 64-bit duy nhất Điều này cho phép bạn nối nhiều cảm biến vào cùng một dây dữ liệu Vì vậy, bạn có thể nhận nhiệt độ từ nhiều cảm biến chỉ bằng một GPIO.
Cảm biến nhiệt độ DS18B20 cũng có sẵn trong phiên bản chống thấm nước.
Trang 3Dưới đây là tóm tắt các thông số kỹ thuật phù hợp nhất của cảm biến nhiệt độ DS18B20: Giao tiếp qua bus một dây
Để hoàn thành hướng dẫn này, bạn cần các thành phần sau:
ESP8266 - đọc Bảng phát triển Wi-Fi ESP8266 tốt nhất
Cảm biến nhiệt độ DS18B20 (một hoặc nhiều cảm biến) – phiên bản chống thấm
nước
Điện trở 4.7k Ohm
Breadboard
Dây nhảy
ESP8266 với sơ đồ DS18B20
Như đã đề cập trước đây, cảm biến nhiệt độ DS18B20 có thể được cấp nguồn thông qua
chân VDD (chế độ bình thường) hoặc nó có thể lấy sức mạnh từ đường dữ liệu (chế độ
ký sinh trùng) Bạn có thể chọn một trong hai chế độ.
Chế độ ký sinh trùng
Trang 5Lưu ý: trong hướng dẫn này, chúng tôi đang kết nối đường dữ liệu DS18B20 với GPIO
4, nhưng bạn có thể sử dụng bất kỳ GPIO phù hợp nào khác.
Đọc Hướng dẫn tham khảo GPIO ESP8266 của chúng tôi để tìm hiểu thêm về các GPIO ESP8266.
Lưu ý: nếu bạn đang sử dụng ESP-01, GPIO 2 là chân phù hợp nhất để kết nối với chân
dữ liệu DS18B20.
Chuẩn bị Arduino IDE của bạn
Trang 6Chúng tôi sẽ lập trình ESP8266 bằng Arduino IDE, vì vậy hãy đảm bảo bạn đã cài đặt
tiện ích bổ sung ESP8266 trước khi tiếp tục:
Cài đặt bảng ESP8266 trong Arduino IDE (hướng dẫn Windows, Mac OS X và
Linux)
Cài đặt thư viện cho DS18B20
Để giao tiếp với cảm biến nhiệt độ DS18B20, bạn cần cài đặt thư viện One Wire của Paul Stoffregen và thư viện Nhiệt độ Dallas Làm theo các bước tiếp theo để cài đặt các thư
viện đó.
1 Mở Arduino IDE của bạn và đi tới Sketch > Include Library > Manage Libraries.
Trình quản lý thư viện sẽ mở.
2 Nhập "onewire" vào hộp tìm kiếm và cài đặt thư viện OneWire của Paul Stoffregen.
3 Sau đó, tìm kiếm "Dallas" và cài đặt thư viện Nhiệt độ Dallas của Miles Burton.
Trang 7Sau khi cài đặt các thư viện, hãy khởi động lại Arduino IDE của bạn.
Mã (Đơn DS18B20)
Sau khi cài đặt các thư viện cần thiết, bạn có thể tải mã sau lên ESP8266 Mã đọc nhiệt
độ từ cảm biến nhiệt độ DS18B20 và hiển thị số đọc trên Màn hình nối tiếp Arduino IDE.
Trang 8// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices
float temperatureC = sensors.getTempCByIndex(0);
float temperatureF = sensors.getTempFByIndex(0);
Trang 9Mã hoạt động như thế nào
Bắt đầu bằng cách bao gồm các thư viện OneWire và DallasTemperature.
#include <OneWire.h>
#include <DallasTemperature.h>
Tạo các phiên bản cần thiết cho cảm biến nhiệt độ Cảm biến nhiệt độ được kết nối với
GPIO 4.
// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices
Sau đó, lấy nhiệt độ tính bằng Celsius bằng cách sử dụng phương thức
getTempCByIndex() như hình dưới đây:
float temperatureC = sensors.getTempCByIndex(0);
Trang 10Hoặc sử dụng getTempFByIndex() để lấy nhiệt độ tính bằng Fahrenheit.
float temperatureF = sensors.getTempFByIndex(0);
Các phương thức getTempCByIndex() và getTempFByIndex() chấp nhận chỉ số của cảm biến nhiệt độ Bởi vì chúng tôi chỉ sử dụng một cảm biến, chỉ số của nó là 0 Nếu bạn
muốn đọc nhiều cảm biến, bạn sử dụng chỉ số 0 cho một cảm biến, chỉ mục 1 cho cảm
Trang 11Lấy nhiệt độ từ nhiều cảm biến nhiệt độ DS18B20
Cảm biến nhiệt độ DS18B20 giao tiếp bằng giao thức một dây và mỗi cảm biến có một
mã sê-ri 64 bit duy nhất, vì vậy bạn có thể đọc nhiệt độ từ nhiều cảm biến chỉ bằng một
chân kỹ thuật số duy nhất.
Sơ
Để đọc nhiệt độ từ nhiều cảm biến, bạn chỉ cần nối tất cả các dòng dữ liệu lại với nhau
như thể hiện trong sơ đồ tiếp theo:
Trang 12Mã (Nhiều DS18B20)
Sau đó, tải lên mã sau Nó quét tất cả các thiết bị trên GPIO 4 và in nhiệt độ cho từng
thiết bị Bản phác thảo này dựa trên ví dụ được cung cấp bởi thư viện
DallasTemperature.
Trang 13// Setup a oneWire instance to communicate with any OneWire devices (not just
Maxim/Dallas temperature ICs)
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++){
// Search the wire for address
Trang 14void loop(){
sensors.requestTemperatures(); // Send the command to get temperatures
// Loop through each device, print out temperature data
for(int i=0;i<numberOfDevices; i++){
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)){
// Output the device ID
Serial.print("Temperature for device: ");
Serial.println(i,DEC);
// Print the data
float tempC = sensors.getTempC(tempDeviceAddress);
// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
for (uint8_t i = 0; i < 8; i++){
Mã sử dụng một số phương pháp hữu ích để xử lý nhiều cảm biến DS18B20.
Bạn sử dụng phương thức getDeviceCount() để lấy số lượng cảm biến DS18B20 trên
dòng dữ liệu.
numberOfDevices = sensors.getDeviceCount();
Trang 15Để có được nhiệt độ ở độ Fahrenheit, bạn có thể sử dụng getTemF() Ngoài ra, bạn có
thể chuyển đổi nhiệt độ tính bằng C sang Fahrenheit như sau:
DallasTemperature::toFahrenheit(tempC)
Cuộc biểu tình
Sau khi tải mã lên, hãy mở Màn hình nối tiếp của bạn với tốc độ truyền là 115200 Bạn sẽ nhận được tất cả các bài đọc cảm biến của bạn được hiển thị như hình dưới đây:
Hiển thị chỉ số nhiệt độ DS18B20 trong máy chủ web
Để xây dựng máy chủ web, chúng tôi sẽ sử dụng thư viện ESPAsyncWebServer cung
cấp một cách dễ dàng để xây dựng một máy chủ web không đồng bộ Xây dựng một máy chủ web không đồng bộ có một số lợi thế Chúng tôi khuyên bạn nên xem nhanh tài liệu thư viện trên trang GitHub của nó.
Cài đặt thư viện ESPAsyncWebServer
Thư viện ESPAsyncWebServer không có sẵn để cài đặt trong Trình quản lý thư viện
Arduino IDE Vì vậy, bạn cần cài đặt nó bằng tay.
Làm theo các bước tiếp theo để cài đặt thư viện ESPAsyncWebServer:
1 Bấm vào đây để tải xuống thư viện ESPAsyncWebServer Bạn sẽ có một thư mục zip trong thư mục Tải xuống của mình
2 Giải nén thư mục zip và bạn sẽ nhận được thư mục ESPAsyncWebServer-master
Trang 163 Đổi tên thư mục của bạn từ ESPAsyncWebServer-master thành
ESPAsyncWebServer
4 Di chuyển thư mục ESPAsyncWebServer vào thư mục thư viện cài đặt Arduino IDE
của bạn
Cài đặt Thư viện TCP ESPAsync
Thư viện ESPAsyncWebServer yêu cầu thư viện ESPAsyncTCP hoạt động Làm theo
các bước tiếp theo để cài đặt thư viện đó:
1 Bấm vào đây để tải xuống thư viện ESPAsyncTCP Bạn sẽ có một thư mục zip
trong thư mục Tải xuống của mình
2 Giải nén thư mục zip và bạn sẽ nhận được thư mục ESPAsyncTCP-master
3 Đổi tên thư mục của bạn từ ESPAsyncTCP-master thành ESPAsyncTCP
4 Di chuyển thư mục ESPAsyncTCP vào thư mục thư viện cài đặt Arduino IDE của
bạn
5 Cuối cùng, mở lại Arduino IDE của bạn
Mã (DS18B20 Máy chủ Web không đồng bộ)
Mở Arduino IDE của bạn và sao chép mã sau.
Trang 17unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// 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
Trang 18return String(tempC);
}
String readDSTemperatureF() {
// Call sensors.requestTemperatures() to issue a global temperature and Requests
to all devices on the bus
Trang 19// Replaces placeholder with DS18B20 values
String processor(const String& var){
Trang 20}
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());
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Mã hoạt động như thế nào
Trong các đoạn sau, chúng tôi sẽ giải thích cách mã hoạt động Hãy tiếp tục đọc nếu bạn muốn tìm hiểu thêm hoặc chuyển đến phần "Trình diễn" để xem kết quả cuối cùng.
Nhập thư viện
Trang 21Xác định GPIO mà chân dữ liệu DS18B20 được kết nối Trong trường hợp này, nó được kết nối với GPIO 4 (D1).
#define ONE_WIRE_BUS 4
Khởi tạo các phiên bản cần thiết để khởi tạo cảm biến:
// Setup a oneWire instance to communicate with any OneWire devices
Chúng tôi sẽ nhận được số đọc cảm biến mới cứ sau 30 giây Bạn có thể thay đổi điều
đó trong biến timerDelay.
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
Đặt thông tin đăng nhập mạng của bạn
Chèn thông tin đăng nhập mạng của bạn vào các biến sau, để ESP8266 có thể kết nối
với mạng cục bộ của bạn.
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Tạo một đối tượng AsyncWebServer trên cổng 80.
AsyncWebServer server(80);
Đọc hàm nhiệt độ
Sau đó, chúng tôi tạo hai hàm để đọc nhiệt độ.
Hàm readDSTemperatureC() trả về số đọc theo độ C.
Trang 22String readDSTemperatureC() {
// Call sensors.requestTemperatures() to issue a global temperature and Requests
to all devices on the bus
Xây dựng trang Web
Bước tiếp theo là xây dựng trang web HTML và CSS cần thiết để xây dựng trang web
được lưu trên biến index_html.
Trong văn bản HTML, chúng ta có TEMPERATUREC và TEMPERATUREF giữa % dấu.
Đây là trình giữ chỗ cho các giá trị nhiệt độ.
Điều này có nghĩa là văn bản %TEMPERATUREC% này giống như một biến sẽ được
Trang 23Bây giờ, chúng ta cần tạo hàm processor(), hàm này sẽ thay thế các trình giữ chỗ trong văn bản HTML của chúng ta bằng các giá trị nhiệt độ thực tế.
// Replaces placeholder with DS18B20 values
String processor(const String& var){
Trang 24Cuối cùng, thêm các dòng mã tiếp theo để xử lý máy chủ web.
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());
});
Khi chúng tôi thực hiện một yêu cầu trên URL gốc, chúng tôi gửi văn bản HTML được lưu trữ trong biến index_html Chúng ta cũng cần vượt qua chức năng bộ xử lý, chức năng
này sẽ thay thế tất cả các trình giữ chỗ bằng các giá trị phù hợp.
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
Chúng tôi cần thêm hai trình xử lý bổ sung để cập nhật chỉ số nhiệt độ Khi chúng tôi
nhận được yêu cầu trên URL / temperaturec, chúng tôi chỉ cần gửi giá trị nhiệt độ được
cập nhật Nó là văn bản thuần túy và nó nên được gửi dưới dạng ký tự, vì vậy, chúng ta
sử dụng phương thức c_str().
server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/plain", temperatureC.c_str());
});
Quá trình tương tự được lặp lại cho nhiệt độ tính bằng Fahrenheit.
Trang 25Sau khi tải mã lên, hãy mở Màn hình nối tiếp Arduino IDE với tốc độ truyền là 115200.
Sau vài giây, địa chỉ IP của bạn sẽ hiển thị.
Trong mạng cục bộ của bạn, mở trình duyệt và nhập địa chỉ IP ESP8266.
Bây giờ bạn có thể thấy nhiệt độ tính bằng C và Fahrenheit trong máy chủ web của mình Các chỉ số cảm biến tự động cập nhật mà không cần phải làm mới trang web.
Tổng kết
Đây là hướng dẫn chuyên sâu về cách sử dụng cảm biến nhiệt độ DS18B20 với
ESP8266 và hiển thị số đọc trên máy chủ web.
DS18B20 giao tiếp thông qua giao thức một dây và mỗi cảm biến có một mã sê-ri 64 bit duy nhất, có nghĩa là bạn có thể đọc nhiều cảm biến trên cùng một chân dữ liệu.
Trang 26Chúng tôi hy vọng bạn thấy hướng dẫn này hữu ích Chúng tôi có các hướng dẫn khác
với ESP8266 mà bạn cũng có thể thích:
ESP8266 với BME280 sử dụng Arduino IDE (Áp suất, Nhiệt độ, Độ ẩm)
ESP8266: Chỉ số nhiệt độ và độ ẩm DHT trong màn hình OLED
Màn hình OLED ESP8266 0.96 inch với Arduino IDE
ESP8266 DHT11 / DHT22 Nhiệt độ và Độ ẩm Máy chủ Web với Arduino IDE
Cảm ơn bạn đã đọc.