İçindekiler:
- Gereçler
- Adım 1: Arduino Kodunu ESP32-CAM'e Yükleyin
- Adım 2: Kabloyu Bağlayın
- Adım 3: Python3 Komut Dosyası
- 4. Adım: MySQL Sunucusu
- Adım 5: Web sunucusu
- Adım 6: 3D Basılı Muhafaza
- Adım 7: Nihai Sonuç
Video: ESP32-DHT22-MQTT-MySQL-PHP Kullanarak Sıcaklık ve Nem: 7 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:17
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
Ö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
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ç, yukarıdaki resimlerde de gösterilmektedir.
Ve pil boşaldığında mini bir USB kablosuyla şarj edebilirsiniz.
Önerilen:
M5STACK Visuino Kullanarak M5StickC ESP32 Üzerinde Sıcaklık, Nem ve Basıncı Görüntüleme - Yapması Kolay: 6 Adım
M5STACK Visuino Kullanarak M5StickC ESP32 Üzerinde Sıcaklık, Nem ve Basıncı Görüntüleme - Yapması Kolay: Bu eğitimde, ESP32 M5Stack StickC'yi Arduino IDE ve Visuino ile ENV sensörünü (DHT12, BMP280, BMM150)
NODE MCU AND BLYNK Kullanarak Sıcaklık ve Nem İzleme: 5 Adım
NODE MCU AND BLYNK Kullanarak Sıcaklık ve Nem İzleme: Merhaba Arkadaşlar Bu talimatta, Node MCU ve BLYNK uygulamasını kullanarak DHT11-Sıcaklık ve Nem sensörünü kullanarak atmosferin sıcaklığını ve nemini nasıl elde edeceğimizi öğrenelim
AWS ve ESP32 Kullanarak Sıcaklık ve Nem Uyarısı: 11 Adım
AWS ve ESP32 Kullanarak Sıcaklık ve Nem Uyarısı: Bu eğitimde, Sıcaklık ve nem sensörünü kullanarak farklı sıcaklık ve nem verilerini ölçeceğiz. Bu verileri AWS'ye nasıl göndereceğinizi de öğreneceksiniz
AWS-ESP32 kullanarak-Sıcaklık-ve-Nem İzleme: 8 Adım
AWS-ESP32 kullanarak-Sıcaklık-ve-Nem-İzleme: Bu eğitimde, Sıcaklık ve nem sensörünü kullanarak farklı sıcaklık ve nem verilerini ölçeceğiz. Bu verileri AWS'ye nasıl göndereceğinizi de öğreneceksiniz
Arduino Uno ile LM35 Sıcaklık Sensörü Kullanarak Sıcaklık Okuma: 4 Adım
Arduino Uno ile LM35 Sıcaklık Sensörü Kullanarak Sıcaklık Okuma: Merhaba arkadaşlar bu derste LM35'i Arduino ile nasıl kullanacağımızı öğreneceğiz. Lm35, -55 °C ile 150 °C arasındaki sıcaklık değerlerini okuyabilen bir sıcaklık sensörüdür. Sıcaklıkla orantılı analog voltaj sağlayan 3 terminalli bir cihazdır. Yüksek