İçindekiler:

ESP32-DHT22-MQTT-MySQL-PHP Kullanarak Sıcaklık ve Nem: 7 Adım
ESP32-DHT22-MQTT-MySQL-PHP Kullanarak Sıcaklık ve Nem: 7 Adım

Video: ESP32-DHT22-MQTT-MySQL-PHP Kullanarak Sıcaklık ve Nem: 7 Adım

Video: ESP32-DHT22-MQTT-MySQL-PHP Kullanarak Sıcaklık ve Nem: 7 Adım
Video: Sıfırdan Akıllı Ev Kurulumu - Bölüm 1: ESP32 ve DHT11 ile sıcaklık ölçümü ve mysql e veri yazma 2024, Kasım
Anonim
ESP32-DHT22-MQTT-MySQL-PHP Kullanarak Sıcaklık ve Nem
ESP32-DHT22-MQTT-MySQL-PHP Kullanarak Sıcaklık ve Nem

Kız arkadaşım bir sera istedi, ben de ona bir tane yaptım. Ama seranın içinde bir sıcaklık ve nem sensörü istedim. Bu yüzden, örnekler için googledim ve denemeye başladım.

Vardığım sonuç, bulduğum tüm örneklerin tam olarak oluşturmak istediğim şey olmadığıydı. Bir sürü küçük kod parçası aldım ve birleştirdim. İlk çalışma yapımı bitirmem epey zaman aldı çünkü çoğu örneğin dokümantasyonu anlamak benim için çok zordu ya da bilmem gereken bir kısmı kabul ettiler mi? Ama hiçbir şey bilmiyordum (henüz) ☹

Bu yüzden bu talimatı inşa ediyorum. Kelimenin tam anlamıyla herkesin anlayabileceği bir "baştan sona" öğretici. (En azından umuyorum?)

Nasıl çalışır …

Nihai ürün, kendisine 18650 pilden güç sağlayan DHT22 sensörlü bir ESP32-CAM'dir. Her üç dakikada bir sıcaklık ve nemi okur ve bunu WiFi üzerinden harici bir MQTT sunucusuna gönderir ve ardından gerektiği kadar daha az pil kullanmak için uyku moduna (üç dakika) geçer

Bir Debian sunucusunda (sanırım ahududu pi de olabilir) python3, bir MQTT sunucusu, bir MySQL sunucusu ve bir web sunucusu var

python3 betiği bir hizmet olarak çalışır ve bir MQTT mesajı aldığında, önceki giriş sayısını (dizin numarası) sayar ve bunu birer birer artırır. Ardından MQTT mesajından sıcaklık ve nem değerlerini okur. Yanlış değerleri kontrol eder ve değerler doğru olduğunda değerleri yeni indeks numarası ve geçerli tarih ve saat ile birlikte bir MySQL sunucusuna gönderir

Web sunucusu, MySQL sunucusundan değerleri okuyan ve Google Charts kullanarak güzel bir grafik oluşturan bir PHP betiğine sahiptir. (örnek)

Gereçler

Kullandığım parçalar şu şekilde:

  • ESP32-CAM (Kam versiyonunu kullanmamın nedeni, üzerinde harici bir anten konektörü bulunmasıdır. Muhtemelen kullanabileceğiniz başka ESP32'ler de vardır)
  • Harici anten
  • AM2302 DHT22 sensör (Bunda yerleşik bir direnç vardır, bu nedenle yalnızca üç kabloya ihtiyacınız vardır)

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

  • 18650 pil kalkanı v3
  • 18650 pil (NCR18650B)
  • Eski mikro USB kablosu (ESP32'yi pil kalkanına bağlamak için)
  • Bazı kısa atlama telleri

Ekstra gerekli:

  • USB'den TTL'ye konektör (resim)

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

  • Havya
  • 3D yazıcı (yalnızca muhafaza çantası için gereklidir)

Adım 1: Arduino Kodunu ESP32-CAM'e Yükleyin

Arduino Kodunu ESP32-CAM'e Yükleyin
Arduino Kodunu ESP32-CAM'e Yükleyin

Öyleyse başlayalım!

Arduino kodunu ESP32-CAM'e yüklemek için, yukarıdaki şemaları kullanarak USBtoTTL konektörünü ESP32'ye bağlamanız gerekir.

Arduino kodu:

/*DHT22 sensöründen sıcaklık ve nemi okumak için küçük bir program ve

MQTT'ye aktarın. B. Duijnhouwer 8 Haziran 2020 */ #include #include #include #define wifi_ssid "***WIFI_SSID***" //wifi ssid #define wifi_password "***WIFI_PASSWORD***" //wifi password #define mqtt_server "***SERVER_NAME***" // sunucu adı veya IP #define mqtt_user "***MQTT_USER***" // kullanıcı adı #define mqtt_password "***MQTT_PASSWORD***" // password #define konu "glasshouse /dhtreadings" #define debug_topic "glasshouse/debug" //Hata ayıklama konusu /* derin uyku için tanımlar */ #define uS_TO_S_FACTOR 1000000 /* Mikro saniyeyi saniyeye çevirme faktörü */ #define TIME_TO_SLEEP 180 /* ESP32 süresi uyku moduna geçecek 5 dakika (saniye olarak) */ bool debug = true; // True ise günlük mesajını görüntüle #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient istemcisi(espClient); karakter verileri[80]; geçersiz kurulum() { Serial.begin(115200); setup_wifi(); //Wifi ağına bağlanın client.setServer(mqtt_server, 1883); // MQTT bağlantısını yapılandırın, gerekirse bağlantı noktasını değiştirin. if (!client.connected()) { reconnect(); } // VERİ OKUYUN int chk = DHT.read22(DHT22_PIN); float t = DHT.sıcaklık; float h = DHT.nem; String dhtReadings = "{"sıcaklık\":\"" + String(t) + "\", \"nem\":\"" + String(h) + "\"}"; dhtReadings.toCharArray(veri, (dhtReadings.length() + 1)); if (hata ayıklama) { Serial.print("Sıcaklık: "); Seri.baskı(t); Serial.print(" | Nem: "); Seri.println(h); } // Değerleri MQTT konularına yayınla client.publish(konu, veri); // Konuyla ilgili okumaları yayınla (glasshouse/dhtreadings) if (debug) { Serial.println("Okumalar MQTT'ye gönderildi."); } esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); // uyu Serial.println("Şimdi normal uykuya geçeceğim."); esp_deep_sleep_start(); } //Wifi void ile bağlantı kur setup_wifi() { delay(20); Seri.println(); Serial.print("Bağlanıyor"); Serial.println(wifi_ssid); WiFi.begin(wifi_ssid, wifi_password); while (WiFi.status() != WL_CONNECTED) { gecikme(100); Seri.print("."); } Serial.println(""); Serial.println("WiFi iyi durumda"); Serial.print("=> ESP32 yeni IP adresi: "); Serial.print(WiFi.localIP()); Seri.println(""); } //Bağlantı kesilirse wifi'ye yeniden bağlanın void reconnect() { while (!client.connected()) { Serial.print("MQTT brokerine bağlanılıyor …"); if (client.connect("ESP32Client", mqtt_user, mqtt_password)) { Serial.println("Tamam"); } else { Serial.print("[Hata] Bağlı değil: "); Serial.print(client.state()); Serial.println("Yeniden denemeden önce 5 saniye bekleyiniz."); gecikme (5000); } } } boşluk döngüsü() { }

Ve yine, kimlik bilgilerini kendi kimlik bilgilerinizle değiştirmeyi unutmayın

Adım 2: Kabloyu Bağlayın

Bağlayın!
Bağlayın!

Güç için USB-A konektörünü kestiğim eski bir USB kablosu kullandım. USB kablosunda dört tel var, sadece siyah ve kırmızı olanlara ihtiyacımız var.

Bu nedenle, her şeyi yukarıdaki programa göre bağlayın.

Adım 3: Python3 Komut Dosyası

Python3 betiği, kök kullanıcının erişebileceği bir yere gider.

Bu betik için /root/scripts/glasshouse/glasshouse.py kullandım. Python betiğinin içeriği:

# MQTT'ye bağlanmak, değerleri okumak ve MySQL'e yazmak için Python3 betiği

# # B. Duijnhouwer # Haziran, 8th 2020 # # version: 1.0 # # paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb() import MySQLdb'yi datetime'dan import datetime db= MySQLdb.connect("localhost", "glasshouse", "***MYSQL_USERNAME***", "***MYSQL_PASSWORD***") imleç=db.cursor() broker_address= "localhost" #Broker adres bağlantı noktası = 1883 #Broker bağlantı noktası kullanıcı = "** *MQTT_USERNAME***" #Connection username password = "***MQTT_PASSWORD***" #Connection password def on_connect(istemci, kullanıcı verileri, bayraklar, rc): # İstemci aracıya bağlandığında yapılacak geri arama print("Bağlandı sonuç koduyla {0}".format(str(rc))) # Bağlantı girişiminin sonucunu yazdır client.subscribe("glasshouse/dhtreadings/#") def on_message(client, userdata, msg): # Bir Sunucudan PUBLISH mesajı alındı. imleç.execute ("sensör verilerinden * seçin") 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("Yeni satır: "+str(newrow)) sıcaklık = float(payload["sıcaklık"]) nem = float(payload["nem"]) print("Sıcaklık: "+str(sıcaklık)) print("Nem: "+str(nem)) print("DateTime: "+str(formatted_date)) if ((sıcaklık) > -20) ve (sıcaklık = 0) ve (nem <= 100)): cur = db.cursor() cur.execute("INSERT INTO glasshouse.sensordata (idx, sıcaklık, nem, zaman damgası) DEĞERLER ("+str (newrow)+", "+str(temperature)+", "+str(nem)+", %s)", (formatted_date)) db.commit() print("MySQL'de alınan ve içe aktarılan veriler") başka: print("veriler limitleri aştı ve MySQL'de içe aktarılmaz") client = mqtt. Client("duijnhouwer-com-glasshouse-script") client.username_pw_set(user, password=password) client.on_connect = on_connect # Geri arama fonksiyonunu tanımlayın için başarılı bağlantı client.on_message = on_message # Bir mesajın alınması için geri arama işlevini tanımlayın client.connect(broker_address, port=port) #broker client.loop_forever()'a bağlanın # Ağ arka plan programını başlat

MySQL kullanıcı adı ve parolasını ve MQTT kullanıcı adı ve parolasını kendi kimlik bilgileriniz ile değiştirmeyi unutmayın

İki dosya oluşturarak betiği bir hizmet olarak çalıştırabilirsiniz.

İlki “/etc/init/glasshouse.conf” olup aşağıdaki içeriklere sahiptir:

çalışma seviyesinde başla [2345]

çalışma seviyesinde dur [!2345] exec /root/scripts/glasshouse/glasshouse.py

İkincisi “/etc/systemd/system/multi-user.target.wants/glasshouse.service” aşağıdaki içeriklerle birlikte:

[Birim]

Description=Glasshouse İzleme Hizmeti Sonra=çok kullanıcılı.target [Hizmet] Tür=basit Restart=her zaman RestartSec=1 ExecStart=/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Yükle] WantedBy=çok kullanıcılı.hedef

Aşağıdaki komutu kullanarak bunu bir hizmet olarak çalıştırabilirsiniz:

systemctl serayı etkinleştir

ve şunu kullanarak başlayın:

systemctl serayı başlat

4. Adım: MySQL Sunucusu

İçinde sadece bir tablo bulunan yeni bir MySQL veritabanı oluşturmanız gerekiyor.

Tabloyu oluşturmak için kod şudur:

CREATE TABLE `sensordata` ('idx' int(11) VARSAYILAN NULL, 'sıcaklık' kayan nokta VARSAYILAN NULL, 'nem' kayan nokta VARSAYILAN NULL, 'timestamp' datetime DEFAULT NULL) ENGINE=InnoDB VARSAYILAN CHARSET=utf8;

Adım 5: Web sunucusu

Web sunucusunun iki dosyası vardır, index.php dosyası ve bir config.ini dosyası

config.ini dosyasının içeriği:

[veri tabanı]

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

Elbette, ***DATABASE_USER*** ve ***DATABASE_PASSWORD***'u kendi kimlik bilgilerinizle değiştirirsiniz.

google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([// ['Zaman Damgası', 'Sıcaklık', 'Nem', 'Isı İndeksi'], ['Zaman Damgası', 'Sıcaklık', 'Nem'], query($sql); # Bu while - döngüsü biçimlendirilir ve alınan tüm verileri ['timestamp', 'temperature', 'nem'] yoluna koyar while ($row = $result->fetch_assoc()) { $timestamp_rest = substr($row["timestamp"], 10, 6); echo "['".$timestamp_rest."', ".$row['sıcaklık'].", ".$row['nem']. "], "; // echo "['".$timestamp_rest."', ".$row['temperature'].", ".$row['nem'].", ".$row['heatindex ']."], "; } ?>]); // Eğri çizgi var options = { başlık: 'Sıcaklık ve nem', eğriTipi: 'fonksiyon', açıklama: { konum: 'alt' }, hAxis: { slantedText:true, slantedTextAngle:45 } }; // Eğri grafik var chart = new google.visualization. LineChart(document.getElementById('curve_chart')); chart.draw(veri, seçenekler); } // DrawChart'tan ayracı sonlandır //

Adım 6: 3D Basılı Muhafaza

Muhafaza için, biri ESP32-CAM ve DHT22 için, diğeri 18650 pil kalkanı için olmak üzere iki ayrı muhafaza kullandım.

Adım 7: Nihai Sonuç

Nihai Sonuç!
Nihai Sonuç!
Nihai Sonuç!
Nihai Sonuç!
Nihai Sonuç!
Nihai Sonuç!
Nihai Sonuç!
Nihai Sonuç!

Nihai sonuç, yukarıdaki resimlerde de gösterilmektedir.

Ve pil boşaldığında mini bir USB kablosuyla şarj edebilirsiniz.

Önerilen: