Mundarija:

ESP32-DHT22-MQTT-MySQL-PHP yordamida harorat va namlik: 7 qadam
ESP32-DHT22-MQTT-MySQL-PHP yordamida harorat va namlik: 7 qadam

Video: ESP32-DHT22-MQTT-MySQL-PHP yordamida harorat va namlik: 7 qadam

Video: ESP32-DHT22-MQTT-MySQL-PHP yordamida harorat va namlik: 7 qadam
Video: ESP32 Send Temperature and Humidity Data to localhost XAMPP for Absolute Beginners Step by Step 2024, Iyul
Anonim
ESP32-DHT22-MQTT-MySQL-PHP yordamida harorat va namlik
ESP32-DHT22-MQTT-MySQL-PHP yordamida harorat va namlik

Mening qiz do'stim glasshausni xohlardi, shuning uchun men uni shunday qildim. Lekin men issiqxona ichidagi harorat va namlik sensori kerak edi. Shunday qilib, men misollar uchun googledan o'tdim va tajriba qila boshladim.

Mening xulosam shuki, men topgan barcha misollar men qurmoqchi bo'lgan narsa emas edi. Men kodning ko'plab kichik qismlarini oldim va ularni birlashtirdim. Birinchi ishimni tugatishimga ancha vaqt kerak bo'ldi, chunki ko'pgina misollarni hujjatlashtirish men uchun juda qiyin edi yoki ular men bilishim kerak deb o'ylashdi. Lekin men hech narsani bilmasdim (hali)

Shuning uchun men bu ko'rsatmalarni yarataman. Hamma tushunishi mumkin bo'lgan "boshidan oxirigacha" darslik. (Hech bo'lmaganda umid qilamanmi?)

U qanday ishlaydi …

Yakuniy mahsulot-bu ESP32-CAM, unga DHT22 sensori o'rnatilgan, u 18650 batareyadan quvvat oladi. Har uch daqiqada u harorat va namlikni o'qiydi va Wi -Fi orqali tashqi MQTT serveriga yuboradi va kerak bo'lganda batareyani kamroq sarflash uchun uxlab qoladi (uch daqiqa)

Debian serverida (menimcha, bu malina pi ham bo'lishi mumkin) menda python3, MQTT serveri, MySQL -server va veb -server bor

Python3 skript xizmati sifatida ishlaydi va har safar MQTT xabarini olganida, u oldingi yozuvlar sonini (indeks raqami) hisoblab chiqadi va uni birma -bir oshiradi. Keyin u MQTT xabaridan harorat va namlik qiymatlarini o'qiydi. U noto'g'ri qiymatlarni tekshiradi va qiymatlar to'g'ri bo'lganda, u yangi indeks raqami va joriy sana va vaqtni MySQL serveriga yuboradi

Veb -server PHP skriptiga ega, u MySQL -server qiymatlarini o'qiydi va undan Google grafiklari yordamida yaxshi grafik hosil qiladi. (misol)

Ta'minotlar

Men ishlatgan qismlar quyidagilar:

  • ESP32-CAM (Kamera versiyasini ishlatganimning sababi shundaki, u erda tashqi antenna ulagichi bor. Siz ishlatadigan boshqa ESP32 ham bo'lishi mumkin)
  • Tashqi antenna
  • AM2302 DHT22 sensori (bu o'rnatilgan rezistorga ega, shuning uchun sizga faqat uchta sim kerak bo'ladi)

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

  • 18650 batareya qalqoni v3
  • 18650 batareya (NCR18650B)
  • Eski mikro USB kabeli (ESP32 -ni batareya ekraniga ulash uchun)
  • Ba'zi qisqa o'tish simlari

Qo'shimcha kerak:

  • USB -TTL ulagichi (rasm)

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

  • Lehimlash temir
  • 3D printer (faqat korpus uchun kerak)

1-qadam: Arduino kodini ESP32-CAM-ga yuklang

Arduino kodini ESP32-CAM-ga yuklang
Arduino kodini ESP32-CAM-ga yuklang

Shunday qilib, boshlaylik!

Arduino kodini ESP32-CAM-ga yuklash uchun yuqoridagi sxemalar yordamida USBtoTTL ulagichini ESP32-ga ulashingiz kerak.

Arduino kodi:

/*DHT22 sensoridan harorat va namlikni o'qish uchun kichik dastur

uni MQTT ga o'tkazing. B. Duijnhouwer, 8 -iyun, 2020*/#include #include #include #deifine wifi_ssid "*** WIFI_SSID ***" // wifi ssid #wifi_password "*** WIFI_PASSWORD ***" // wifi paroli #mqtt_serverni belgilang "*** SERVER_NAME ***" // server nomi yoki IP #define mqtt_user "*** MQTT_USER ***" // foydalanuvchi nomi #define mqtt_password "*** MQTT_PASSWORD ***" // parol #mavzuni belgilash "glasshouse /dhtreadings "#define debug_topic" glasshouse /debug "// Tuzatish uchun mavzu /* chuqur uyqu uchun ta'riflar* /#define uS_TO_S_FACTOR 1000000 /* Mikro soniyalar soniyasiga konversiya faktori* /#define TIME_TO_SLEEP 180 /* Vaqt ESP32 uxlab qoladi. 5 daqiqa davomida (soniyalarda) */ bool disk raskadrovka = rost; // Jurnal xabarini ko'rsatish True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient mijozi (espClient); char ma'lumotlari [80]; void setup () {Serial.begin (115200); o'rnatish_wifi (); // Wifi tarmog'iga ulanish client.setServer (mqtt_server, 1883); // MQTT ulanishini sozlang, agar kerak bo'lsa portni o'zgartiring. if (! client.connected ()) {reconnect (); } // O'QING DATA int chk = DHT.read22 (DHT22_PIN); float t = DHT.harorat; float h = DHT. namlik; Qator dhtReadings = "{" harorat / ": \" " + String (t) +" / ", \" namlik / ": \" " + String (h) +" / "}"; dhtReadings.toCharArray (ma'lumotlar, (dhtReadings.length () + 1)); if (disk raskadrovka) {Serial.print ("Harorat:"); Ketma -ket chop etish (t); Serial.print ("| Namlik:"); Serial.println (h); } // MQTT mavzulariga qiymatlarni chop etish client.publish (mavzu, ma'lumotlar); // Mavzu bo'yicha o'qishlarni nashr etish (glasshouse/dhtreadings) if (debug) {Serial.println ("O'qishlar MQTTga yuborilgan."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // uyquga ket Serial.println ("ESP32 ni har bir kishi uchun uxlash uchun sozlash" + String (TIME_TO_SLEEP) + "Sekund"); Serial.println ("Hozir odatdagidek uxlayman."); esp_deep_sleep_start (); } // Wi -Fi ulanishini sozlash void setup_wifi () {delay (20); Serial.println (); Serial.print ("Ulanish"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {kechiktirish (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi yaxshi"); Serial.print ("=> ESP32 yangi IP -manzili:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Agar ulanish uzilib qolsa, Wi -Fi tarmog'iga qayta ulanish bekor qilinadi () {while (! Client.connected ()) {Serial.print ("MQTT brokeriga ulanmoqda …"); agar (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Xato] Ulanmagan:"); Serial.print (client.state ()); Serial.println ("Qayta urinishdan oldin 5 soniya kuting."); kechikish (5000); }}} void loop () {}

Va yana, ishonchnoma ma'lumotlarini o'zingizning shaxsiy ma'lumotlaringiz bilan almashtirishni unutmang

2 -qadam: Quvvatlaning

Quvvatlang!
Quvvatlang!

Quvvat uchun men USB-A ulagichini uzib tashlagan eski USB kabelidan foydalandim. USB kabelida to'rtta sim bor, bizga faqat qora va qizil simlar kerak.

Shunday qilib, hamma narsani yuqoridagi jadvalga muvofiq ulang.

3 -qadam: Python3 skript

Python3 skripti ildiz foydalanuvchisi kira oladigan joyga kiradi.

Men bu skript uchun /root/scripts/glasshouse/glasshouse.py dan foydalandim.

MQTT -ga ulanish, qiymatlarni o'qish va ularni MySQL -ga yozish uchun # Python3 skript

# # B. Duijnhouwer # 8 iyun, 2020 yil # # versiya: 1.0 # # import paho.mqtt.client mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb datetime import datetime db = MySQLdb.connect ("localhost", "Glasshouse", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") kursor = db.cursor () broker_address = "localhost" #Broker manzili porti = 1883 #Broker porti foydalanuvchisi = "** *MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** " #Connection parol on_connect (mijoz, foydalanuvchi ma'lumotlari, bayroqlar, rc): #Mijoz brokerga ulanganda qayta qo'ng'iroq qilish (" Ulangan natija kodi bilan {0} ". format (str (rc))) # Ulanish urinishining natijasi client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # Qachonki PUBLISH xabari serverdan qabul qilindi. cursor.execute ("sensordata-dan * tanlang") numrows = int (cursor.rowcount) newrow = numrows + 1 hozir = datetime.now () formatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') yuk = json.loads (msg.payload.decode (' utf-8 '))) chop etish ("Yangi qator:"+str (yangidan)) harorat = suzuvchi (yuk ["harorat"]) namlik = float (yuk ["namlik"]) chop etish ("Harorat:"+str (harorat)) chop etish ("Namlik:"+str (namlik)) chop etish ("DateTime:"+str (formatlangan_date)) agar ((harorat > -20) va (harorat = 0) va (namlik <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, harorat, namlik, vaqt tamg'asi) VALUES ("+str) (newrow)+","+str (harorat)+","+str (namlik)+", %s)", (formatlangan_data)) db.commit () chop etish ("MySQL -da olingan va import qilingan ma'lumotlar") boshqa: chop etish ("ma'lumotlar chegaralar oshdi va MySQL-ga import qilinmaydi") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (foydalanuvchi, parol = parol) client.on_connect = on_connect # Qayta qo'ng'iroq qilish funktsiyasini belgilang uchun Muvaffaqiyatli aloqa client.on_message = on_message # Xabarni qabul qilish uchun qayta qo'ng'iroq qilish funktsiyasini aniqlang. mijoz (ulanish_ manzili, port = port).

MySQL foydalanuvchi nomi va parolini hamda MQTT foydalanuvchi nomi va parolini o'z shaxsiy ma'lumotlaringizga almashtirishni unutmang

Siz ikkita fayl yaratish orqali skriptni xizmat sifatida ishga tushirishingiz mumkin.

Birinchisi, "/etc/init/glasshouse.conf" bo'lib, quyidagi tarkibga ega:

yugurish darajasidan boshlang [2345]

yugurish darajasida to'xtating [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Ikkinchisi, "/etc/systemd/system/multi-user.target.wants/glasshouse.service" quyidagi tarkibga ega:

[Birlik]

Tavsif = Glasshouse monitoring xizmati keyin = multi-user.target [Service] Type = oddiy qayta ishga tushirish = har doim RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [O'rnatish] WantedBy = ko'p foydalanuvchilar. maqsad

Siz buni quyidagi buyruq yordamida xizmat sifatida bajarishingiz mumkin:

systemctl glasshouse -ni yoqadi

va uni ishlatib boshlang:

systemctl glasshouse -ni ishga tushiring

4 -qadam: MySQL -server

Siz faqat bitta jadval bilan yangi MySQL ma'lumotlar bazasini yaratishingiz kerak.

Jadvalni yaratish kodi:

Jadval yaratish 'sensordata' (`idx` int (11) DEFAULT NULL,` temperatur` float DEFAULT NULL, `namlik` float DEFAULT NULL,` timestamp` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;

5 -qadam: veb -server

Veb -serverda ikkita fayl bor: index.php va bitta config.ini fayli

Config.ini faylining tarkibi:

[ma'lumotlar bazasi]

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

Qaerda bo'lmasin, *** DATABASE_USER *** va *** DATABASE_PASSWORD *** ni o'z shaxsiy ma'lumotlaringiz bilan almashtiring.

google.charts.load ('joriy', {'paketlar': ['korechart']}); google.charts.setOnLoadCallback (drawChart); drawChart () {var data = google.visualization.arrayToDataTable ([// ['Vaqt tamg'asi' ',' Harorat ',' Namlik ',' Issiqlik indeksi '], [' Vaqt tamg'asi ',' Harorat ',' Namlik '], so'rov ($ sql); # Bu vaqt - pastadir formatlari va olingan barcha ma'lumotlarni ['vaqt tamg'asi', 'harorat', 'namlik'] usuliga qo'ying. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ qator ["vaqt tamg'asi"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['harorat']. ",". $ qator ['namlik']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['harorat']. ",". $ row ['namlik']. ",". $ row ['issiqlik indeksi ']. "],";}?>]); // Egri chiziq var variantlari = {sarlavha: 'Harorat va namlik', curveType: 'funksiya', afsona: {pozitsiya: 'pastki'}, hAxis: {slantedText: to'g'ri, slantedTextAngle: 45}}; // egri grafik var chart = new google.visualization. LineChart (document.getElementById ('curve_chart'))); chart.draw (ma'lumotlar, variantlar); } // DrawChart -dan qavsni tugatish //

6 -qadam: 3D bosma uy

Uy-joy uchun men ikkita alohida korpusdan foydalandim, biri ESP32-CAM va DHT22 uchun, ikkinchisi 18650 batareya qalqoni uchun.

7 -qadam: Yakuniy natija

Yakuniy natija!
Yakuniy natija!
Yakuniy natija!
Yakuniy natija!
Yakuniy natija!
Yakuniy natija!
Yakuniy natija!
Yakuniy natija!

Yakuniy natija yuqoridagi rasmlarda ham ko'rsatilgan.

Qachonki batareya bo'sh bo'lsa, uni mini USB kabeli bilan zaryadlashingiz mumkin.

Tavsiya: