Mục lục:
- Quân nhu
- Bước 1: Tải mã Arduino lên ESP32-CAM
- Bước 2: Lên dây
- Bước 3: Tập lệnh Python3
- Bước 4: Máy chủ MySQL
- Bước 5: Máy chủ trang web
- Bước 6: Nhà ở in 3D
- Bước 7: Kết quả cuối cùng
Video: Nhiệt độ và độ ẩm sử dụng ESP32-DHT22-MQTT-MySQL-PHP: 7 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:31
Bạn gái tôi muốn có một ngôi nhà kính, vì vậy tôi đã làm cho cô ấy một cái. Nhưng tôi muốn có một cảm biến nhiệt độ và độ ẩm bên trong nhà kính. Vì vậy, tôi tìm kiếm các ví dụ và bắt đầu thử nghiệm.
Kết luận của tôi là tất cả các ví dụ mà tôi tìm thấy không chính xác như những gì tôi muốn xây dựng. Tôi nắm bắt rất nhiều phần nhỏ của mã và kết hợp chúng. Tôi đã mất khá nhiều thời gian để hoàn thành bản dựng làm việc đầu tiên của mình vì tài liệu của hầu hết các ví dụ quá khó hiểu đối với tôi hoặc họ cho rằng một phần mà tôi nên biết ?? Nhưng tôi chưa biết gì (chưa) ☹
Đó là lý do tại sao tôi xây dựng điều này có thể hướng dẫn. Hướng dẫn “bắt đầu cho đến khi kết thúc” để mọi người hiểu theo nghĩa đen. (Ít nhất tôi còn hy vọng ?)
Làm thế nào nó hoạt động …
Sản phẩm cuối cùng là ESP32-CAM với cảm biến DHT22 được gắn vào nó để lấy năng lượng từ pin 18650. Cứ sau ba phút, nó đọc nhiệt độ và độ ẩm và gửi thông tin này qua WiFi đến máy chủ MQTT bên ngoài, sau đó chuyển sang chế độ ngủ (trong ba phút) để sử dụng ít pin hơn nếu cần
Trên máy chủ Debian, (tôi đoán đó cũng có thể là mâm xôi pi), tôi có python3, máy chủ MQTT, máy chủ MySQL và máy chủ web
Tập lệnh python3 chạy như một dịch vụ và bất cứ khi nào nó nhận được thông báo MQTT, nó sẽ đếm số lượng mục nhập trước đó (số chỉ mục) và tăng số này lên từng mục. Sau đó, nó đọc các giá trị nhiệt độ và độ ẩm từ tin nhắn MQTT. Nó kiểm tra các giá trị sai và bất cứ khi nào các giá trị chính xác, nó sẽ gửi các giá trị cùng với số chỉ mục mới và ngày giờ hiện tại đến máy chủ MySQL
Máy chủ web có một tập lệnh PHP đọc các giá trị từ máy chủ MySQL và tạo một biểu đồ đẹp từ nó bằng cách sử dụng Google Charts. (thí dụ)
Quân nhu
Các phần tôi đã sử dụng như sau:
- ESP32-CAM (Lý do tôi sử dụng phiên bản cam là vì nó có đầu nối ăng-ten bên ngoài. Có thể còn có các ESP32 khác mà bạn có thể sử dụng)
- Ăng ten bên ngoài
-
Cảm biến AM2302 DHT22 (Cái này có một điện trở tích hợp, vì vậy bạn chỉ cần ba dây)
https://www.amazon.de/gp/product/B07CM2VLBK/ref=p…
- Tấm chắn pin 18650 v3
- Pin 18650 (NCR18650B)
- Cáp micro USB cũ (để kết nối ESP32 với tấm chắn pin)
- Một số dây nhảy ngắn
Cần thêm:
-
Đầu nối USB sang TTL (hình ảnh)
https://www.amazon.de/FT232RL-Seriell-Unterst%C3%…
- Hàn sắt
- Máy in 3D (chỉ cần thiết cho trường hợp nhà ở)
Bước 1: Tải mã Arduino lên ESP32-CAM
Vậy hãy bắt đầu!
Để tải mã Arduino lên ESP32-CAM, bạn phải kết nối đầu nối USBtoTTL với ESP32 bằng cách sử dụng sơ đồ ở trên.
Mã Arduino là:
/ * Chỉ cần một chương trình nhỏ để đọc nhiệt độ và độ ẩm từ cảm biến DHT22 và
chuyển nó cho MQTT. B. Duijnhouwer Tháng 6, 8 năm 2020 * / #include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // mật khẩu wifi #define mqtt_server "*** SERVER_NAME ***" // tên máy chủ hoặc IP #define mqtt_user "*** MQTT_USER ***" // tên người dùng #define mqtt_password "*** MQTT_PASSWORD ***" // mật khẩu #define topic "glasshouse / dhtreadings "#define debug_topic" glasshouse / debug "// Chủ đề gỡ lỗi / * định nghĩa cho deepsleep * / #define uS_TO_S_FACTOR 1000000 / * Hệ số chuyển đổi từ micro giây sang giây * / #define TIME_TO_SLEEP 180 / * Thời gian ESP32 sẽ chuyển sang chế độ ngủ trong 5 phút (tính bằng giây) * / bool debug = true; // Hiển thị thông báo nhật ký nếu True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; Ứng dụng khách PubSubClient (espClient); dữ liệu char [80]; void setup () {Serial.begin (115200); setup_wifi (); // Kết nối với mạng Wifi client.setServer (mqtt_server, 1883); // Cấu hình kết nối MQTT, thay đổi cổng nếu cần. if (! client.connected ()) {renect (); } // ĐỌC DỮ LIỆU int chk = DHT.read22 (DHT22_PIN); float t = DHT. nhiệt độ; float h = DHT.humidity; Chuỗi dhtReadings = "{" nhiệt độ / ": \" "+ Chuỗi (t) +" / ", \" độ ẩm / ": \" "+ Chuỗi (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); if (gỡ lỗi) {Serial.print ("Nhiệt độ:"); Serial.print (t); Serial.print ("| Humidity:"); Serial.println (h); } // Xuất bản các giá trị lên MQTT chủ đề client.publish (chủ đề, dữ liệu); // Xuất bản các bài đọc về chủ đề (glasshouse / dhtreadings) if (debug) {Serial.println ("Các bài đọc được gửi tới MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // chuyển sang chế độ ngủ Serial.println ("Thiết lập ESP32 để ngủ cho mọi" + String (TIME_TO_SLEEP) + "Giây"); Serial.println ("Bây giờ đi ngủ như bình thường."); esp_deep_sleep_start (); } // Thiết lập kết nối tới wifi void setup_wifi () {delay (20); Serial.println (); Serial.print ("Đang kết nối với"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {delay (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi OK"); Serial.print ("=> Địa chỉ IP mới của ESP32 là:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Kết nối lại wifi nếu mất kết nối void renect () {while (! Client.connected ()) {Serial.print ("Đang kết nối với MQTT broker…"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Lỗi] Chưa kết nối:"); Serial.print (client.state ()); Serial.println ("Chờ 5 giây trước khi thử lại."); chậm trễ (5000); }}} void loop () {}
Và một lần nữa, đừng quên thay thế thông tin đăng nhập bằng thông tin đăng nhập của chính bạn
Bước 2: Lên dây
Đối với nguồn điện, tôi đã sử dụng cáp USB cũ mà tôi đã cắt đầu nối USB-A. Có bốn dây trong cáp USB, chúng tôi chỉ cần dây màu đen và màu đỏ.
Vì vậy, hãy kết nối mọi thứ theo lịch trình ở trên.
Bước 3: Tập lệnh Python3
Tập lệnh Python3 đi vào một nơi mà người dùng root có thể truy cập được.
Tôi đã sử dụng /root/scripts/glasshouse/glasshouse.py cho tập lệnh này. Nội dung của tập lệnh python là:
# Tập lệnh Python3 để kết nối với MQTT, đọc các giá trị và ghi chúng vào MySQL
# # B. Duijnhouwer # June, 8/2020 # # version: 1.0 # # import paho.mqtt.client dưới dạng mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb từ datetime import datetime db = MySQLdb.connect ("localhost", "glasshouse", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** * MQTT_USERNAME *** "# Mật khẩu tên người dùng kết nối =" *** MQTT_PASSWORD *** "# Mật khẩu kết nối def on_connect (máy khách, dữ liệu người dùng, cờ, rc): # Lệnh gọi lại khi máy khách kết nối với máy in môi giới (" Đã kết nối với mã kết quả {0} ". format (str (rc))) # In kết quả của lần thử kết nối client.subscribe (" glasshouse / dhtreadings / # ") def on_message (client, userdata, msg): # Lệnh gọi lại khi a Thông báo PUBLISH được nhận từ máy chủ. cursor.execute ("select * from sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datetime.now () formatted_date = now.strftime ('% Y-% m-% d% H:% M:% S ') payload = json.loads (msg.payload.decode (' utf-8 ')) print ("Hàng mới:" + str (newrow)) nhiệt độ = float (payload ["nhiệt độ"]) độ ẩm = float (payload ["độ ẩm"]) print ("Nhiệt độ:" + str (nhiệt độ)) print ("Độ ẩm:" + str (độ ẩm)) print ("DateTime:" + str (formatted_date)) if ((nhiệt độ > -20) và (nhiệt độ = 0) và (độ ẩm <= 100)): cur = db.cursor () cur.execute ("CHÈN VÀO glasshouse.sensordata (idx, nhiệt độ, độ ẩm, dấu thời gian) VALUES (" + str (newrow) + "," + str (nhiệt độ) + "," + str (độ ẩm) + ",% s)", (formatted_date)) db.commit () print ("dữ liệu đã nhận và nhập trong MySQL") khác: print ("dữ liệu vượt quá giới hạn và KHÔNG được nhập trong MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (user, password = password) client.on_connect = on_connect # Xác định hàm gọi lại vì kết nối thành công client.on_message = on_message # Xác định hàm gọi lại để nhận tin nhắn client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Bắt đầu trình nền mạng
Đừng quên thay thế tên người dùng và mật khẩu MySQL cũng như tên người dùng và mật khẩu MQTT thành thông tin đăng nhập của riêng bạn
Bạn có thể làm cho tập lệnh chạy như một dịch vụ bằng cách tạo hai tệp.
Đầu tiên là “/etc/init/glasshouse.conf” với nội dung sau:
bắt đầu trên runlevel [2345]
dừng trên runlevel [! 2345] execute /root/scripts/glasshouse/glasshouse.py
Cái thứ hai là “/etc/systemd/system/multi-user.target.wants/glasshouse.serviceranty với các nội dung sau:
[Đơn vị]
Mô tả = Dịch vụ giám sát nhà kính After = multi-user.target [Dịch vụ] Type = simple Restart = always RestartSec = 1 ExecStart = / usr / bin / python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy = multi-user. Mục tiêu
Bạn có thể làm cho nó chạy như một dịch vụ bằng cách sử dụng lệnh sau:
systemctl cho phép nhà kính
và bắt đầu nó bằng cách sử dụng:
nhà kính bắt đầu systemctl
Bước 4: Máy chủ MySQL
Bạn phải tạo một cơ sở dữ liệu MySQL mới chỉ với một bảng trong đó.
Mã để tạo bảng là:
TẠO BẢNG `sensordata` (`idx` int (11) DEFAULT NULL,` nhiệt độ` float DEFAULT NULL, `độ ẩm` float DEFAULT NULL,` timestamp` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;
Bước 5: Máy chủ trang web
Máy chủ web có hai tệp, tệp index.php và một tệp config.ini
Nội dung của tệp config.ini là:
[cơ sở dữ liệu]
db_host = "localhost" db_name = "glasshouse" db_table = "sensordata" db_user = "*** DATABASE_USER ***" db_password = "*** DATABASE_PASSWORD ***"
Về cơ bản, bạn thay thế *** DATABASE_USER *** và *** DATABASE_PASSWORD *** bằng thông tin đăng nhập của riêng bạn.
google.charts.load ('current', {'pack': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Dấu thời gian', 'Nhiệt độ', 'Độ ẩm', 'Chỉ số nhiệt'], ['Dấu thời gian', 'Nhiệt độ', 'Độ ẩm'], query ($ sql); # Định dạng vòng lặp while này và đưa tất cả dữ liệu đã truy xuất vào ['dấu thời gian', 'nhiệt độ', 'độ ẩm'] theo cách. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['nhiệt độ']. ",". $ row ['độ ẩm']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['nhiệt độ']. ",". $ row ['độ ẩm']. ",". $ row ['heatindex ']. "],";}?>]); // Đường cong var options = {title: 'Nhiệt độ và độ ẩm', curveType: 'function', chú giải: {position: 'bottom'}, hAxis: {sl xiênText: true, sl xiênTextAngle: 45}}; // Biểu đồ cong var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (dữ liệu, tùy chọn); } // Dấu ngoặc kết thúc từ drawChart //
Bước 6: Nhà ở in 3D
Đối với vỏ, tôi đã sử dụng hai vỏ riêng biệt, một cho ESP32-CAM và DHT22 cùng nhau và một cho tấm chắn pin 18650.
Bước 7: Kết quả cuối cùng
Kết quả cuối cùng cũng được hiển thị trong các hình ảnh trên.
Và bất cứ khi nào hết pin, bạn có thể sạc bằng cáp USB mini.
Đề xuất:
Sử dụng lại tản nhiệt máy tính để tạo tản nhiệt bóng bán dẫn: 7 bước
Sử dụng lại tản nhiệt máy tính để tạo tản nhiệt bóng bán dẫn: Một thời gian trước, tôi đã mua một số Raspberry Pi 3 để sử dụng. Vì chúng không có tản nhiệt nên tôi đã tìm mua một số chiếc. Tôi đã tìm kiếm nhanh trên Google và bắt gặp sản phẩm Có thể hướng dẫn này (Đế tản nhiệt Raspberry Pi) - đây là sau khi từ chối ý tưởng về
Hiển thị nhiệt độ & độ ẩm nhiệt nhiệt - Phiên bản PCB: 6 bước (có hình ảnh)
Hiển thị Nhiệt độ & Độ ẩm Thermochromic - Phiên bản PCB: Cách đây không lâu, một dự án có tên Nhiệt độ Nhiệt & Màn hình độ ẩm nơi tôi đã chế tạo màn hình 7 phân đoạn từ các tấm đồng được làm nóng / làm mát bằng các phần tử peltier. Các tấm đồng được bao phủ bởi một lá mỏng nhiệt sắc
Dụng cụ đo nhiệt độ đơn giản và rẻ tiền sử dụng nhiệt điện trở: 5 bước
Dụng cụ đo nhiệt độ đơn giản và rẻ tiền sử dụng nhiệt điện trở: cảm biến nhiệt độ đơn giản và rẻ tiền sử dụng nhiệt điện trở nhiệt NTC thay đổi điện trở của nó theo thời gian thay đổi bằng cách sử dụng đặc tính này, chúng tôi đang xây dựng cảm biến nhiệt độ để biết thêm về nhiệt điện trở https://en.wikipedia.org/wiki/ Thermistor
Cách sử dụng cảm biến nhiệt độ DHT11 với Arduino và nhiệt độ in Nhiệt độ và độ ẩm: 5 bước
Cách sử dụng cảm biến nhiệt độ DHT11 với Arduino và nhiệt độ in Nhiệt độ và độ ẩm: Cảm biến DHT11 được sử dụng để đo nhiệt độ và độ ẩm. Họ là những người rất ưa thích đồ điện tử. Cảm biến nhiệt độ và độ ẩm DHT11 giúp bạn thực sự dễ dàng thêm dữ liệu độ ẩm và nhiệt độ vào các dự án điện tử tự làm của mình. Đó là mỗi
Nhiệt kế nấu ăn đầu dò nhiệt độ ESP32 NTP với cảnh báo nhiệt độ và hiệu chỉnh Steinhart-Hart.: 7 bước (có hình ảnh)
Nhiệt kế nấu ăn đầu dò nhiệt độ ESP32 NTP với cảnh báo nhiệt độ và hiệu chỉnh Steinhart-Hart. là một chương trình Có thể hướng dẫn cho thấy cách tôi thêm đầu dò nhiệt độ NTP, piezo b