Daftar Isi:

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

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

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

Pacar saya menginginkan rumah kaca, jadi saya membuatnya. Tapi saya ingin sensor suhu dan kelembaban di dalam rumah kaca. Jadi, saya mencari contoh di Google dan mulai bereksperimen.

Kesimpulan saya adalah bahwa semua contoh yang saya temukan tidak persis seperti yang ingin saya bangun. Saya mengambil banyak bagian kecil dari kode dan menggabungkannya. Butuh waktu cukup lama untuk menyelesaikan pekerjaan pertama saya karena dokumentasi sebagian besar contoh terlalu sulit untuk saya pahami atau mereka menganggap bagian yang harus saya ketahui?? Tapi saya tidak tahu apa-apa (belum)

Itu sebabnya saya membuat instruksi ini. Tutorial "awal-sampai akhir" untuk dipahami semua orang secara harfiah. (Setidaknya saya berharap?)

Bagaimana itu bekerja …

Produk akhir adalah ESP32-CAM dengan sensor DHT22 yang terpasang padanya yang mendapatkan daya dari baterai 18650. Setiap tiga menit membaca suhu dan kelembaban dan mengirimkan ini melalui WiFi ke server MQTT eksternal dan kemudian pergi tidur (selama tiga menit) untuk menggunakan lebih sedikit baterai yang diperlukan

Di server Debian, (yang juga bisa menjadi raspberry pi saya kira) saya memiliki python3, server MQTT, server MySQL, dan server web

Skrip python3 berjalan sebagai layanan dan setiap kali menerima pesan MQTT, ia menghitung jumlah entri sebelumnya (nomor indeks) dan menambahkannya satu per satu. Kemudian membaca nilai suhu dan kelembaban dari pesan MQTT. Ia memeriksa nilai-nilai palsu dan setiap kali nilainya benar, ia mengirimkan nilai-nilai bersama dengan nomor indeks baru dan tanggal dan waktu saat ini ke server MySQL

Server web memiliki skrip PHP yang membaca nilai dari server MySQL dan membuat grafik yang bagus darinya menggunakan Google Charts. (contoh)

Perlengkapan

Bagian-bagian yang saya gunakan adalah sebagai berikut:

  • ESP32-CAM (Alasan saya menggunakan versi cam adalah karena memiliki konektor antena eksternal di atasnya. Mungkin ada juga ESP32 lain yang bisa Anda gunakan)
  • Antena eksternal
  • Sensor AM2302 DHT22 (Yang ini memiliki resistor bawaan, jadi Anda hanya perlu tiga kabel)

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

  • 18650 pelindung baterai v3
  • Baterai 18650 (NCR18650B)
  • Kabel micro USB lama (untuk menghubungkan ESP32 ke pelindung baterai)
  • Beberapa kabel jumper pendek

Tambahan yang dibutuhkan:

  • Konektor USB ke TTL (gambar)

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

  • Besi solder
  • Printer 3D (hanya diperlukan untuk casing rumah)

Langkah 1: Unggah Kode Arduino ke ESP32-CAM

Unggah Kode Arduino ke ESP32-CAM
Unggah Kode Arduino ke ESP32-CAM

Jadi mari kita mulai!

Untuk mengunggah kode Arduino ke ESP32-CAM, Anda harus menghubungkan konektor USBtoTTL ke ESP32 menggunakan skema di atas.

Kode Arduinonya adalah:

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

meneruskannya ke MQTT. B. Duijnhouwer, 8 Juni 2020 */ #include #include #include #define wifi_ssid "***WIFI_SSID***" //wifi ssid #define wifi_password "***WIFI_PASSWORD***" //wifi password #define mqtt_server "***SERVER_NAME***" // nama server atau IP #define mqtt_user "***MQTT_USER***" // nama pengguna #define mqtt_password "***MQTT_PASSWORD***" // kata sandi #define topik "rumah kaca /dhtreadings" #define debug_topic "glasshouse/debug" //Topik untuk debugging /* definisi untuk deepsleep */ #define uS_TO_S_FACTOR 1000000 /* Faktor konversi untuk mikro detik ke detik */ #define TIME_TO_SLEEP 180 /* Waktu ESP32 akan tidur selama 5 menit (dalam detik) */ bool debug = true; //Menampilkan pesan log jika Benar #define DHT22_PIN 14 dht DHT; WiFiClient espClient; klien PubSubClient (espClient); data karakter[80]; void setup() { Serial.begin(115200); setup_wifi(); //Hubungkan ke jaringan Wifi client.setServer(mqtt_server, 1883); // Konfigurasi koneksi MQTT, ubah port jika diperlukan. if (!client.connected()) { hubungkan kembali(); } // BACA DATA int chk = DHT.read22(DHT22_PIN); float t = DHT.suhu; float h = DHT.kelembaban; String dhtReadings = "{"suhu\":\"" + String(t) + "\", \"kelembaban\":\"" + String(h) + "\"}"; dhtReadings.toCharArray(data, (dhtReadings.length() + 1)); if (debug) { Serial.print("Suhu: "); Serial.print(t); Serial.print(" | Kelembaban: "); Serial.println(h); } // Publikasikan nilai ke topik MQTT client.publish(topic, data); // Publikasikan bacaan tentang topik (rumah kaca/dhtreadings) if (debug) { Serial.println("Bacaan dikirim ke MQTT."); } esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); //pergi ke tidur Serial.println("Setup ESP32 untuk tidur untuk setiap " + String(TIME_TO_SLEEP) + " Detik"); Serial.println("Sekarang tidur seperti biasa."); esp_deep_sleep_start(); } //Setup koneksi ke wifi void setup_wifi() { delay(20); Serial.println(); Serial.print("Menghubungkan ke "); 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("=> Alamat IP baru ESP32 adalah: "); Serial.print(WiFi.localIP()); Serial.println(""); } //Sambungkan kembali ke wifi jika koneksi terputus void reconnect() { while (!client.connected()) { Serial.print("Menghubungkan ke broker MQTT …"); if (client.connect("ESP32Client", mqtt_user, mqtt_password)) { Serial.println("OK"); } else { Serial.print("[Error] Tidak terhubung: "); Serial.print(klien.status()); Serial.println("Tunggu 5 detik sebelum mencoba lagi."); penundaan(5000); } } } batal loop() {}

Dan sekali lagi, jangan lupa untuk mengganti kredensial dengan kredensial Anda sendiri

Langkah 2: Hubungkan

Hubungkan!
Hubungkan!

Untuk daya, saya menggunakan kabel USB lama yang saya putuskan konektor USB-A-nya. Ada empat kabel di kabel USB, kita hanya perlu yang hitam dan yang merah.

Jadi, hubungkan semuanya sesuai jadwal di atas.

Langkah 3: Skrip Python3

Skrip Python3 masuk ke tempat yang dapat diakses oleh pengguna root.

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

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

# # B. Duijnhouwer #, 8 Juni 2020 # # versi: 1.0 # # import paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb() import MySQLdb from 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***" #Connection username password = "***MQTT_PASSWORD***" #Connection password def on_connect(client, userdata, flags, rc): # Callback ketika klien terhubung ke broker print("Connected dengan kode hasil {0}".format(str(rc))) # Cetak hasil percobaan koneksi client.subscribe("glasshouse/dhtreadings/#") def on_message(client, userdata, msg): # Panggilan balik ketika a PUBLISH pesan diterima dari server. 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("Baris baru: "+str(baris baru)) temperature = float(payload["temperature"]) kelembaban = float(payload["humidity"]) print("Temperature: "+str(temperature)) print("Humidity: "+str(humidity)) print("DateTime: "+str(formatted_date)) if ((temperature > -20) dan (suhu = 0) dan (kelembaban <= 100)): cur = db.cursor() cur.execute("INSERT INTO glasshouse.sensordata (idx, temperature, moisture, timestamp) VALUES ("+str (baris baru)+", "+str(suhu)+", "+str(kelembaban)+", %s)", (tanggal_format)) db.commit() print("data diterima dan diimpor ke MySQL") else: print("data melebihi batas dan TIDAK diimpor ke MySQL") client = mqtt. Client("duijnhouwer-com-glasshouse-script") client.username_pw_set(user, password=password) client.on_connect = on_connect # Tentukan fungsi callback untuk koneksi sukses client.on_message = on_message # Tentukan fungsi panggilan balik untuk menerima pesan client.connect(broker_address, port=port) #connect to broker client.loop_forever() # Mulai daemon jaringan

Jangan lupa untuk mengganti nama pengguna dan kata sandi MySQL dan nama pengguna dan kata sandi MQTT dengan kredensial Anda sendiri

Anda dapat membuat skrip berjalan sebagai layanan dengan membuat dua file.

Yang pertama adalah “/etc/init/glasshouse.conf” dengan isi sebagai berikut:

mulai pada runlevel [2345]

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

Yang kedua adalah “/etc/systemd/system/multi-user.target.wants/glasshouse.service” dengan isi sebagai berikut:

[Satuan]

Description=Layanan Pemantauan Rumah Kaca Setelah=multi-pengguna.target [Layanan] Jenis=simple Restart=selalu RestartSec=1 ExecStart=/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Instal] WantedBy=multi-pengguna.target

Anda dapat menjalankan ini sebagai layanan menggunakan perintah berikut:

systemctl mengaktifkan rumah kaca

dan mulai menggunakan:

systemctl mulai rumah kaca

Langkah 4: Server MySQL

Anda harus membuat database MySQL baru hanya dengan satu tabel di dalamnya.

Kode untuk membuat tabel adalah:

BUAT TABEL `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: Server web

Server web memiliki dua file, file index.php dan satu file config.ini

Isi dari file config.ini adalah:

[basis data]

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

Dimana offcourse Anda mengganti ***DATABASE_USER*** dan ***DATABASE_PASSWORD*** dengan kredensial Anda sendiri.

google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], query($sql); # Ini while - format loop dan masukkan semua data yang diambil ke dalam cara ['timestamp', 'temperature', 'humidity'] while ($row = $result->fetch_assoc()) { $timestamp_rest = substr($row["timestamp"], 10, 6); echo "['".$timestamp_rest."', ".$row['temperature'].", ".$row['humidity']. "], "; // echo "['".$timestamp_rest."', ".$row['temperature'].", ".$row['humidity'].", ".$row['heatindex ']."], "; } ?>]); // Garis lengkung var options = { title: 'Temperature and moisture', curveType: 'function', legend: { position: 'bottom' }, hAxis: { slantedText:true, slantedTextAngle:45 } }; // Bagan lengkung var bagan = new google.visualization. LineChart(document.getElementById('curve_chart')); chart.draw(data, opsi); } // Akhiri braket dari drawChart //

Langkah 6: Perumahan Cetak 3D

Untuk casing, saya menggunakan dua casing terpisah, satu untuk ESP32-CAM dan DHT22 bersama-sama dan satu untuk pelindung baterai 18650.

Langkah 7: Hasil Akhir

Hasil akhir!
Hasil akhir!
Hasil akhir!
Hasil akhir!
Hasil akhir!
Hasil akhir!
Hasil akhir!
Hasil akhir!

Hasil akhir juga ditunjukkan pada gambar di atas.

Dan setiap kali baterai kosong, Anda dapat mengisinya dengan kabel mini USB.

Direkomendasikan: