Isi kandungan:

Suhu dan Kelembapan Menggunakan ESP32-DHT22-MQTT-MySQL-PHP: 7 Langkah
Suhu dan Kelembapan Menggunakan ESP32-DHT22-MQTT-MySQL-PHP: 7 Langkah

Video: Suhu dan Kelembapan Menggunakan ESP32-DHT22-MQTT-MySQL-PHP: 7 Langkah

Video: Suhu dan Kelembapan Menggunakan ESP32-DHT22-MQTT-MySQL-PHP: 7 Langkah
Video: IoT Learning - #Part1 Monitoring Nilai Suhu dan Kelembapan Pada Dashboard Menggunakan Protokol MQTT 2024, Julai
Anonim
Suhu dan Kelembapan Menggunakan ESP32-DHT22-MQTT-MySQL-PHP
Suhu dan Kelembapan Menggunakan ESP32-DHT22-MQTT-MySQL-PHP

Teman wanita saya mahukan rumah kaca, jadi saya membuatnya. Tetapi saya mahukan sensor suhu dan kelembapan di dalam rumah kaca. Oleh itu, saya mencari contoh dan mula bereksperimen.

Kesimpulan saya adalah bahawa semua contoh yang saya dapati tidak tepat seperti yang ingin saya bina. Saya mengambil banyak bahagian kecil kod dan menggabungkannya. Saya mengambil masa agak lama untuk menyelesaikan kerja pertama saya kerana dokumentasi kebanyakan contoh terlalu sukar untuk saya fahami atau mereka menganggap bahagian yang harus saya ketahui ?? Tetapi saya tidak tahu apa-apa (belum) ☹

Itulah sebabnya saya membina ini. Tutorial "awal hingga akhir" untuk difahami oleh semua orang. (Sekurang-kurangnya saya harap?)

Bagaimana ia berfungsi …

Produk akhir adalah ESP32-CAM dengan sensor DHT22 yang terpasang padanya yang mendapat kuasa dari bateri 18650. Setiap tiga minit ia membaca suhu dan kelembapan dan menghantar ini melalui WiFi ke pelayan MQTT luaran dan kemudian tidur (selama tiga minit) untuk menggunakan bateri kurang seperti yang diperlukan

Pada pelayan Debian, (yang mungkin juga saya raspberry pi) saya mempunyai python3, pelayan MQTT, pelayan MySQL dan pelayan laman web

Skrip python3 berfungsi sebagai perkhidmatan dan setiap kali ia menerima mesej MQTT, ia menghitung jumlah entri sebelumnya (nombor indeks) dan menambahnya satu demi satu. Kemudian ia membaca nilai suhu dan kelembapan dari mesej MQTT. Ia memeriksa nilai-nilai palsu dan kapan pun nilainya benar, nilai akan dikirimkan bersama-sama dengan nombor indeks baru dan tarikh dan waktu semasa ke pelayan MySQL

Pelayan laman web mempunyai skrip PHP yang membaca nilai dari pelayan MySQL dan membuat grafik yang bagus daripadanya menggunakan Carta Google. (contoh)

Bekalan

Bahagian yang saya gunakan adalah seperti berikut:

  • ESP32-CAM (Sebab saya menggunakan versi cam adalah kerana ia mempunyai penyambung antena luaran. Mungkin ada juga ESP32 lain yang boleh anda gunakan)
  • Antena luaran
  • Sensor DH222 AM2302 (Yang ini mempunyai perintang terbina dalam, jadi anda hanya memerlukan tiga wayar)

    https://www.amazon.de/gp/product/B07CM2VLBK/ref=p…

  • Perisai bateri 18650 v3
  • Bateri 18650 (NCR18650B)
  • Kabel USB mikro lama (untuk menyambungkan ESP32 ke pelindung bateri)
  • Beberapa wayar pelompat pendek

Perlu tambahan:

  • Penyambung USB ke TTL (gambar)

    https://www.amazon.de/FT232RL-Seriell-Unterst%C3%…

  • Besi pematerian
  • Pencetak 3D (hanya diperlukan untuk casing perumahan)

Langkah 1: Muat naik Kod Arduino ke ESP32-CAM

Muat naik Kod Arduino ke ESP32-CAM
Muat naik Kod Arduino ke ESP32-CAM

Jadi mari kita mulakan!

Untuk memuat naik kod Arduino ke ESP32-CAM, anda harus menyambungkan penyambung USBtoTTL ke ESP32 menggunakan skema di atas.

Kod Arduino adalah:

/ * Hanya sedikit program untuk membaca suhu dan kelembapan dari sensor DHT22 dan

lulus ke MQTT. B. Duijnhouwer June, 8th 2020 * / #include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // kata laluan wifi #define mqtt_server "*** SERVER_NAME ***" // nama pelayan atau IP #define mqtt_user "*** MQTT_USER ***" // nama pengguna #define mqtt_password "*** MQTT_PASSWORD ***" // kata laluan #tentukan topik "rumah kaca / dhtreadings "#define debug_topic" glasshouse / debug "// Topik untuk debug / * definisi untuk deepsleep * / #define uS_TO_S_FACTOR 1000000 / * Faktor penukaran untuk detik mikro hingga saat * / #define TIME_TO_SLEEP 180 / * Waktu ESP32 akan tidur selama 5 minit (dalam beberapa saat) * / bool debug = true; // Paparkan mesej log jika True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; Pelanggan PubSubClient (espClient); data char [80]; persediaan tidak sah () {Serial.begin (115200); persediaan_wifi (); // Sambung ke klien rangkaian Wifi.setServer (mqtt_server, 1883); // Konfigurasikan sambungan MQTT, ubah port jika diperlukan. jika (! client.connected ()) {reconnect (); } // BACA DATA int chk = DHT.read22 (DHT22_PIN); apungan t = Suhu DHT; apungan h = kelembapan DHT; String dhtReadings = "{" suhu / ": \" "+ String (t) +" / ", \" kelembapan / ": \" "+ String (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); jika (debug) {Serial.print ("Temperature:"); Cetakan bersiri (t); Serial.print ("| Kelembapan:"); Bersiri.println (h); } // Terbitkan nilai ke topik MQTT client.publish (topik, data); // Menerbitkan bacaan mengenai topik (glasshouse / dhtreadings) jika (debug) {Serial.println ("Bacaan dihantar ke MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // pergi tidur Serial.println ("Siapkan ESP32 untuk tidur untuk setiap" + Rentetan (TIME_TO_SLEEP) + "Detik"); Serial.println ("Tidur seperti biasa sekarang."); esp_deep_sleep_start (); } // Siapkan sambungan ke wifi void setup_wifi () {delay (20); Bersiri.println (); Serial.print ("Menyambung ke"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); sementara (WiFi.status ()! = WL_CONNECTED) {kelewatan (100); Cetakan bersiri ("."); } Serial.println (""); Serial.println ("WiFi OK"); Serial.print ("=> Alamat IP baru ESP32 ialah:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Sambung semula ke wifi jika sambungan terputus batal sambungkan semula () {while (! Client.connected ()) {Serial.print ("Menyambung ke broker MQTT …"); jika (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } lain {Serial.print ("[Ralat] Tidak disambungkan:"); Serial.print (pelanggan.state ()); Serial.println ("Tunggu 5 saat sebelum mencuba semula."); kelewatan (5000); }}} gelung kosong () {}

Dan sekali lagi, jangan lupa untuk mengganti kelayakan dengan kelayakan anda sendiri

Langkah 2: Wire Up

Wire Up!
Wire Up!

Untuk kekuatan, saya menggunakan kabel USB lama di mana saya memotong penyambung USB-A. Terdapat empat wayar dalam kabel USB, kami hanya memerlukan yang hitam dan yang merah.

Jadi, sambungkan semuanya mengikut jadual di atas.

Langkah 3: Skrip Python3

Skrip Python3 masuk ke tempat di mana ia dapat diakses oleh pengguna root.

Saya menggunakan /root/scripts/glasshouse/glasshouse.py untuk skrip ini. Kandungan skrip python adalah:

# Skrip Python3 untuk menyambung ke MQTT, membaca nilai dan menulisnya ke dalam MySQL

# # B. Duijnhouwer # Jun, 8th 2020 # # versi: 1.0 # # import paho.mqtt.client sebagai mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb dari datetime import datetime db = MySQLdb.connect ("localhost", "localhost", "glasshouse", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") kursor = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** * MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** "#Connection password def on_connect (client, userdata, flags, rc): # Callback untuk ketika klien menyambung ke cetakan broker (" Disambungkan dengan kod hasil {0} ". format (str (rc))) # Hasil cetak percubaan klien.subscribe (" glasshouse / dhtreadings / # ") def on_message (klien, userdata, msg): # Panggilan balik untuk ketika Mesej PUBLISH diterima dari pelayan. 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 ') muatan = json.loads (msg.payload.decode (' utf-8 ')) cetak ("Baris baru:" + str (newrow)) suhu = terapung (muatan ["suhu"]) kelembapan = float (payload ["kelembapan"]) cetak ("Suhu:" + str (suhu)) cetak ("Kelembapan:" + str (kelembapan)) cetak ("DateTime:" + str (formatted_date)) jika ((suhu > -20) dan (suhu = 0) dan (kelembapan <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, suhu, kelembapan, cap waktu) NILAI (" + str (newrow) + "," + str (suhu) + "," + str (kelembapan) + ",% s)", (format_date)) db.commit () cetak ("data diterima dan diimport dalam MySQL") yang lain: print ("data melebihi had dan TIDAK diimport dalam MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (user, password = password) client.on_connect = on_connect # Tentukan fungsi callback untuk klien sambungan yang berjaya.on_message = on_message # Tentukan fungsi panggilan balik untuk penerimaan pesanan pelanggan.connect (broker_address, port = port) #connect to broker client.loop_forever () # Mulakan rangkaian daemon

Jangan lupa ganti nama pengguna dan kata laluan MySQL dan nama pengguna dan kata laluan MQTT ke kelayakan anda sendiri

Anda boleh menjadikan skrip dijalankan sebagai perkhidmatan dengan membuat dua fail.

Yang pertama adalah "/etc/init/glasshouse.conf" dengan kandungan berikut:

mulakan di runlevel [2345]

berhenti di runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Yang kedua ialah “/etc/systemd/system/multi-user.target.wants/glasshouse.serviceassign dengan kandungan berikut:

[Unit]

Penerangan = Perkhidmatan Pemantauan Glasshouse Selepas = multi-user.target [Service] Type = restart sederhana = selalu RestartSec = 1 ExecStart = / usr / bin / python3 /root/scripts/glasshouse/glasshouse.py [Pasang] WantedBy = berbilang pengguna.target

Anda boleh menjalankan ini sebagai perkhidmatan menggunakan arahan berikut:

systemctl membolehkan rumah kaca

dan mulakan dengan menggunakan:

systemctl memulakan rumah kaca

Langkah 4: Pelayan MySQL

Anda harus membuat pangkalan data MySQL baru dengan hanya satu jadual di dalamnya.

Kod untuk membuat jadual adalah:

BUAT JADUAL `sensordata` (`idx` int (11) DEFAULT NULL,` temperature` float DEFAULT NULL, `humidity` float DEFAULT NULL,` timestamp` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Langkah 5: Pelayan Web

Pelayan laman web mempunyai dua fail, fail index.php dan satu fail config.ini

Kandungan fail config.ini adalah:

[pangkalan data]

db_host = "localhost" db_name = "rumah kaca" db_table = "sensordata" db_user = "*** DATABASE_USER ***" db_password = "*** DATABASE_PASSWORD ***"

Di mana jalan keluar anda ganti *** DATABASE_USER *** dan *** DATABASE_PASSWORD *** dengan bukti kelayakan anda sendiri.

google.charts.load ('current', {'package': ['corechart']}); google.charts.setOnLoadCallback (drawChart); fungsi drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], pertanyaan ($ sql); # Sementara ini - format gelung dan masukkan semua data yang diambil ke arah ['cap waktu', 'suhu', 'kelembapan']. sementara ($ baris = $ hasil-> fetch_assoc ()) {$ timestamp_rest = substr ($ baris ["cap waktu"], 10, 6); gema "['". $ timestamp_rest. "',". $ baris ['suhu']. ",". $ baris ['kelembapan']. "],"; // echo "['". $ timestamp_rest. "',". $ baris ['suhu']. ",". $ baris ['kelembapan']. ",". $ baris ['heatindex ']. "],";}?>]); // Pilihan garis lengkung var = {tajuk: 'Suhu dan kelembapan', curveType: 'function', legenda: {posisi: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Carta melengkung var chart = google.visualization. LineChart baru (document.getElementById ('curve_chart')); chart.draw (data, pilihan); } // Kurungan akhir dari drawChart //

Langkah 6: Perumahan Bercetak 3D

Untuk perumahan, saya menggunakan dua kediaman berasingan, satu untuk ESP32-CAM dan DHT22 bersama-sama dan satu untuk pelindung bateri 18650.

Langkah 7: Keputusan Akhir

Keputusan Akhir!
Keputusan Akhir!
Keputusan Akhir!
Keputusan Akhir!
Keputusan Akhir!
Keputusan Akhir!
Keputusan Akhir!
Keputusan Akhir!

Hasil akhir juga ditunjukkan dalam gambar di atas.

Apabila bateri kosong, anda boleh mengecasnya dengan kabel USB mini.

Disyorkan: