Mündəricat:

ESP32-DHT22-MQTT-MySQL-PHP istifadə edərək temperatur və rütubət: 7 addım
ESP32-DHT22-MQTT-MySQL-PHP istifadə edərək temperatur və rütubət: 7 addım

Video: ESP32-DHT22-MQTT-MySQL-PHP istifadə edərək temperatur və rütubət: 7 addım

Video: ESP32-DHT22-MQTT-MySQL-PHP istifadə edərək temperatur və rütubət: 7 addım
Video: ESP32 Send Temperature and Humidity Data to localhost XAMPP for Absolute Beginners Step by Step 2024, Noyabr
Anonim
ESP32-DHT22-MQTT-MySQL-PHP istifadə edərək temperatur və rütubət
ESP32-DHT22-MQTT-MySQL-PHP istifadə edərək temperatur və rütubət

Sevgilim bir camxana istədi, ona görə də onu tikdim. Ancaq istixananın içərisində bir temperatur və rütubət sensoru istədim. Beləliklə, nümunələr üçün googled və təcrübə etməyə başladım.

Nəticəm bu idi ki, tapdığım bütün nümunələr qurmaq istədiyim kimi deyildi. Kodun bir çox kiçik hissəsini götürüb birləşdirdim. İlk iş quruluşumu başa çatdırmağım xeyli vaxt aldı, çünki əksər nümunələrin sənədləşməsini başa düşməyim çox çətin idi və ya bilməli olduğum bir hissəni qəbul etdilər? Amma heç nə bilmirdim (hələ)

Buna görə də bu təlimatı mən hazırlayıram. Hər kəsin başa düşməsi üçün "başlanğıcdan sona qədər" bir dərslik. (Heç olmasa ümid edirəm?)

Bu necə işləyir …

Son məhsul, 18650 batareyadan güc alan DHT22 sensoru olan bir ESP32-CAM-dır. Hər üç dəqiqədə bir temperatur və rütubəti oxuyur və WiFi üzərindən xarici bir MQTT serverinə göndərir və sonra lazım olduğu qədər az batareya istifadə etmək üçün yuxuya gedir (üç dəqiqə)

Debian serverində (güman ki, moruq pi də ola bilər) python3, MQTT serveri, MySQL serveri və veb serverim var

Python3 skripti bir xidmət olaraq çalışır və bir MQTT mesajı aldıqda əvvəlki giriş sayını (indeks nömrəsini) sayır və bunu bir artırır. Sonra MQTT mesajından temperatur və rütubətin dəyərlərini oxuyur. Yanlış dəyərləri yoxlayır və dəyərlər düzgün olduqda dəyərləri yeni indeks nömrəsi və cari tarix və vaxt ilə birlikdə MySQL serverinə göndərir

Veb serveri, MySQL serverindəki dəyərləri oxuyan və Google Qrafiklərindən istifadə edərək gözəl bir qrafik hazırlayan bir PHP skriptinə malikdir. (nümunə)

Təchizat

İstifadə etdiyim hissələr aşağıdakılardır:

  • ESP32-CAM (Kam versiyasını istifadə etməyimin səbəbi, xarici anten konnektoru olmasıdır. Yəqin ki, istifadə edə biləcəyiniz başqa ESP32 də var)
  • Xarici anten
  • AM2302 DHT22 sensoru (Daxili bir rezistora malikdir, buna görə yalnız üç telə ehtiyacınız var)

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

  • 18650 batareya qalxanı v3
  • 18650 batareya (NCR18650B)
  • Köhnə mikro USB kabeli (ESP32 -ni batareya qalxanına bağlamaq üçün)
  • Bəzi qısa keçid telləri

Əlavə ehtiyac:

  • USB - TTL konnektoru (şəkil)

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

  • Lehimleme dəmir
  • 3D printer (yalnız korpus üçün lazımdır)

Addım 1: Arduino Kodunu ESP32-CAM-a yükləyin

Arduino Kodunu ESP32-CAM-a yükləyin
Arduino Kodunu ESP32-CAM-a yükləyin

Beləliklə, başlayaq!

Arduino kodunu ESP32-CAM-a yükləmək üçün yuxarıdakı sxemlərdən istifadə edərək USBtoTTL konnektorunu ESP32-yə bağlamalısınız.

Arduino kodu belədir:

/*DHT22 sensorundan temperatur və rütubəti oxumaq üçün kiçik bir proqram və

MQTT -ə ötürün. B. Duijnhouwer, 8 iyun 2020*/ #daxil #daxil #daxil # #wifi_ssidini təyin et "*** WIFI_SSID ***" // wifi ssid #wifi_password "*** WIFI_PASSWORD ***" // wifi parol #define mqtt_server "*** SERVER_NAME ***" // server adı və ya IP #define mqtt_user "*** MQTT_USER ***" // istifadəçi adı #define mqtt_password "*** MQTT_PASSWORD ***" // parol #mövzunu təyin et "glasshouse /dhtreadings "#define debug_topic" glasshouse /debug "// Hata ayıklama üçün mövzu /* dərin yuxu üçün təriflər* /#define uS_TO_S_FACTOR 1000000 /* Mikro saniyələr üçün dönüşüm faktoru* /#define TIME_TO_SLEEP 180 /* Time ESP32 yuxuya gedəcək 5 dəqiqə ərzində (saniyələrdə) */ bool debug = true; // Doğru olarsa qeyd mesajını göstər #DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient müştəri (espClient); char məlumatları [80]; void setup () {Serial.begin (115200); setup_wifi (); // Wifi şəbəkəsinə qoşul client.setServer (mqtt_server, 1883); // MQTT bağlantısını konfiqurasiya edin, lazım olduqda portu dəyişdirin. if (! client.connected ()) {reconnect (); } // MƏLUMATLARI oxuyun int chk = DHT.read22 (DHT22_PIN); float t = DHT. temperatur; float h = DHT. nəmlik; String dhtReadings = "{" temperatur / ": \" " + String (t) +" / ", \" rütubət / ": \" " + String (h) +" / "}"; dhtReadings.toCharArray (məlumatlar, (dhtReadings.length () + 1)); if (debug) {Serial.print ("Temperatur:"); Serial. çap (t); Serial.print ("| Nəmlik:"); Serial.println (h); } // MQTT mövzularına dəyərləri dərc edin client.publish (mövzu, məlumatlar); // Mövzuya dair oxunuşlar dərc edin (glasshouse/dhtreadings) if (debug) {Serial.println ("Oxunuşlar MQTT -yə göndərilir."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // yuxuya get Serial.println ("Hər biri üçün yatmaq üçün ESP32 qur" + String (TIME_TO_SLEEP) + "Saniyə"); Serial.println ("İndi normal yuxuya gedirəm."); esp_deep_sleep_start (); } // wifi bağlantısını qurun void setup_wifi () {gecikmə (20); Serial.println (); Serial.print ("Bağlanır"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {gecikmə (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi yaxşıdır"); Serial.print ("=> ESP32 yeni IP ünvanı:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Bağlantı kəsildikdə wifi -yə yenidən qoşulun etibarsız yenidən əlaqə () {while (! Client.connected ()) {Serial.print ("MQTT brokerinə qoşulur…"); əgər (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } başqa {Serial.print ("[Hata] Bağlı deyil:"); Serial.print (client.state ()); Serial.println ("Yenidən cəhd etməzdən əvvəl 5 saniyə gözləyin."); gecikmə (5000); }}} boşluq döngəsi () {}

Yenə də etimadnamənizi öz etimadnamənizlə əvəz etməyi unutmayın

Addım 2: Bağlanın

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

Güc üçün, USB-A konnektorunu kəsdiyim köhnə bir USB kabelindən istifadə etdim. USB kabelində dörd tel var, yalnız qara və qırmızıya ehtiyacımız var.

Beləliklə, hər şeyi yuxarıdakı cədvələ uyğun olaraq bağlayın.

Addım 3: Python3 Script

Python3 skripti, kök istifadəçinin əlçatan olduğu bir yerə daxil olur.

Bu skript üçün /root/scripts/glasshouse/glasshouse.py istifadə etdim. Python skriptinin məzmunu belədir:

MQTT -yə qoşulmaq, dəyərləri oxumaq və MySQL -ə yazmaq üçün # Python3 skripti

# # B. Duijnhouwer # 8 İyun 2020 # # versiya: 1.0 # # mqtt kimi paho.mqtt.client idxal json idxal pymysql pymysql.install_as_MySQLdb () MySQLdb -ni datetime import datetime db = MySQLdb.connect ("localhost", "glasshouse", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") kursor = db.cursor () broker_address = "localhost" #Broker ünvan portu = 1883 #Broker port istifadəçisi = "** *MQTT_USERNAME *** "#Connection istifadəçi adı şifrəsi =" *** MQTT_PASSWORD *** " #Bağlantı şifrəsi on_connect (müştəri, istifadəçi məlumatları, bayraqlar, rc): #Müştəri brokerə qoşulduqda geri çağırma çapı (" Bağlandı nəticə kodu ilə {0} ". format (str (rc))) # Əlaqə cəhdinin nəticəsini yazın client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # A zaman PUBLISH mesajı serverdən alınır. cursor.execute ("sensordatadan * seçin") numrows = int (cursor.rowcount) newrow = numrows + 1 indi = datetime.now () formatatt_date = now.strftime ('%Y-%m-%d%H:% M:%S ') payload = json.loads (msg.payload.decode (' utf-8 ')) print ("New row:"+str (newrow)) temperatur = float (payload ["temperatur"]) rütubət = float (yük ["rütubət"]) çap ("Temperatur:"+str (temperatur)) çap ("Rütubət:"+str (rütubət)) çap ("DateTime:"+str (formatlı_tarix)) əgər ((temperatur > -20) və (temperatur = 0) və (rütubət <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperatur, rütubət, zaman damgası) VALUES ("+str) (newrow)+","+str (temperatur)+","+str (rütubət)+", %s)", (formated_date)) db.commit () print ("MySQL -də alınan və alınan məlumatlar") başqa: çap ("məlumatlar limitləri aşdı və MySQL-də idxal edilmir") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (istifadəçi, parol = parol) client.on_connect = on_connect # Geri çağırma funksiyasını təyin edin üçün uğurlu əlaqə müştəri.on_message = on_message # Bir mesajın alınması üçün geri çağırma funksiyasını təyin edin.

MySQL istifadəçi adınızı və şifrənizi və MQTT istifadəçi adınızı və şifrənizi öz şəxsi məlumatlarınızla əvəz etməyi unutmayın

İki fayl yaradaraq skriptin xidmət olaraq işlədilməsini təmin edə bilərsiniz.

Birincisi, aşağıdakı məzmunlu "/etc/init/glasshouse.conf" dir:

qaçış səviyyəsinə başlayın [2345]

runlevel səviyyəsində dayanın [! 2345] exec /root/scripts/glasshouse/glasshouse.py

İkincisi, "/etc/systemd/system/multi-user.target.wants/glasshouse.service" aşağıdakı məzmundadır:

[Bölmə]

Təsvir = Glasshouse Monitorinq Xidməti Sonra = multi-user.target [Xidmət] Növ = sadə Yenidən Başla = həmişə RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Quraşdır] WantedBy = çox istifadəçi.hədəf

Aşağıdakı əmri istifadə edərək bunu bir xidmət olaraq edə bilərsiniz:

systemctl glasshouse imkan verir

və istifadə edərək başlayın:

systemctl glasshouse işə salın

Addım 4: MySQL Server

İçində yalnız bir masa olan yeni bir MySQL verilənlər bazası yaratmalısınız.

Cədvəl yaratmaq üçün kod:

Cədvəl yaradın `sensordata` (`idx` int (11) DEFAULT NULL,` temperatur` float VARSAYILAN NULL, `nəmlik 'float Varsayılan NULL,` zaman damgası' datetime VARSIZ NULL) ENGINE = InnoDB VARSAYILAN CHARSET = utf8;

Addım 5: Veb server

Veb serverinin iki faylı var, index.php faylı və bir config.ini faylı

Config.ini faylının məzmunu belədir:

[verilənlər bazası]

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

Əlbətdə ki, *** DATABASE_USER *** və *** DATABASE_PASSWORD *** sözlərini öz etimadnamənizlə əvəz edin.

google.charts.load ('cari', {'paketlər': ['corechart']}); google.charts.setOnLoadCallback (drawChart); drawChart () {var data = google.visualization.arrayToDataTable ([// ['Zaman damgası', 'Temperatur', 'Rütubət', 'İstilik İndeksi'], ['Zaman Damgası', 'Temperatur', 'Rütubət'], sorğu ($ sql); # This while - loop formatları və bütün alınan məlumatları ['zaman damgası', 'temperatur', 'rütubət'] üsuluna daxil edin. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ sıra ["zaman damgası"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['temperatur']. ",". $ sıra ['rütubət']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['temperatur']. ",". $ row ['rütubət']. ",". $ sıra ['istilik indeksi ']. "],";}?>]); // Əyri xətt var variantları = {başlıq: 'Temperatur və rütubət', curveType: 'funksiya', işarəsi: {mövqe: 'alt'}, hAxis: {slantedText: doğru, slantedTextAngle: 45}}; // Əyri qrafik var chart = new google.visualization. LineChart (document.getElementById ('curve_chart'))); chart.draw (məlumatlar, seçimlər); } // DrawChart -dan mötərizəni bitir //

Addım 6: 3D çaplı mənzil

Korpus üçün biri ESP32-CAM və DHT22 üçün, biri də 18650 batareya qalxanı üçün iki ayrı yuvadan istifadə etdim.

Addım 7: Son nəticə

Son nəticə!
Son nəticə!
Son nəticə!
Son nəticə!
Son nəticə!
Son nəticə!
Son nəticə!
Son nəticə!

Son nəticə də yuxarıdakı şəkillərdə göstərilmişdir.

Batareya boş olduqda mini USB kabeli ilə şarj edə bilərsiniz.

Tövsiyə: