Mục lục:

Nhiệt độ và độ ẩm sử dụng ESP32-DHT22-MQTT-MySQL-PHP: 7 bước
Nhiệt độ và độ ẩm sử dụng ESP32-DHT22-MQTT-MySQL-PHP: 7 bước

Video: Nhiệt độ và độ ẩm sử dụng ESP32-DHT22-MQTT-MySQL-PHP: 7 bước

Video: Nhiệt độ và độ ẩm sử dụng ESP32-DHT22-MQTT-MySQL-PHP: 7 bước
Video: Lập trình esp8266 - Bài 3 - Giám sát nhiệt độ và độ ẩm cảnh báo từ xa qua điện thoại dùng blynk iot 2024, Tháng bảy
Anonim
Nhiệt độ và độ ẩm sử dụng ESP32-DHT22-MQTT-MySQL-PHP
Nhiệt độ và độ ẩm sử dụng ESP32-DHT22-MQTT-MySQL-PHP

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

Tải mã Arduino lên ESP32-CAM
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

Lên dây!
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!
Kết quả cuối cùng!
Kết quả cuối cùng!
Kết quả cuối cùng!
Kết quả cuối cùng!
Kết quả cuối cùng!
Kết quả cuối cùng!
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: