विषयसूची:

ESP32-DHT22-MQTT-MySQL-PHP का उपयोग कर तापमान और आर्द्रता: 7 कदम
ESP32-DHT22-MQTT-MySQL-PHP का उपयोग कर तापमान और आर्द्रता: 7 कदम

वीडियो: ESP32-DHT22-MQTT-MySQL-PHP का उपयोग कर तापमान और आर्द्रता: 7 कदम

वीडियो: ESP32-DHT22-MQTT-MySQL-PHP का उपयोग कर तापमान और आर्द्रता: 7 कदम
वीडियो: ESP32 DHT11/DHT22 Asynchronous Web Server (auto updates Temperature and Humidity) 2024, नवंबर
Anonim
ESP32-DHT22-MQTT-MySQL-PHP का उपयोग करके तापमान और आर्द्रता
ESP32-DHT22-MQTT-MySQL-PHP का उपयोग करके तापमान और आर्द्रता

मेरी प्रेमिका को कांच का घर चाहिए था, इसलिए मैंने उसे बना दिया। लेकिन मुझे ग्लासहाउस के अंदर एक तापमान और आर्द्रता सेंसर चाहिए था। इसलिए, मैंने उदाहरणों के लिए गुगल किया और प्रयोग करना शुरू कर दिया।

मेरा निष्कर्ष यह था कि मुझे जो भी उदाहरण मिले, वे ठीक वैसे नहीं थे जैसा मैं बनाना चाहता था। मैंने कोड के बहुत से छोटे हिस्सों को पकड़ा और उन्हें जोड़ दिया। मुझे अपना पहला वर्किंग बिल्ड पूरा करने में काफी समय लगा क्योंकि अधिकांश उदाहरणों के दस्तावेज़ीकरण को समझना मेरे लिए बहुत मुश्किल था या उन्होंने ऐसा हिस्सा मान लिया जो मुझे पता होना चाहिए ?? लेकिन मुझे कुछ नहीं पता था (अभी तक)

इसलिए मैं इस निर्देश का निर्माण करता हूं। शाब्दिक रूप से सभी को समझने के लिए एक "शुरुआत-अंत तक" ट्यूटोरियल। (कम से कम मुझे आशा है?)

यह काम किस प्रकार करता है …

अंतिम उत्पाद एक ESP32-CAM है जिसमें एक DHT22 सेंसर जुड़ा हुआ है जो इसे 18650 बैटरी से शक्ति प्राप्त करता है। हर तीन मिनट में यह तापमान और आर्द्रता को पढ़ता है और इसे वाईफाई पर बाहरी एमक्यूटीटी सर्वर पर भेजता है और फिर आवश्यकतानुसार कम बैटरी का उपयोग करने के लिए सो जाता है (तीन मिनट के लिए)।

एक डेबियन सर्वर पर, (जो मुझे लगता है कि एक रास्पबेरी पाई भी हो सकता है) मेरे पास python3, एक MQTT सर्वर, एक MySQL सर्वर और एक वेबसर्वर है।

पायथन 3 स्क्रिप्ट एक सेवा के रूप में चलती है और जब भी इसे एमक्यूटीटी संदेश प्राप्त होता है, तो यह पिछली प्रविष्टियों (इंडेक्स नंबर) की गणना करता है और इसे एक से बढ़ाता है। फिर यह MQTT संदेश से तापमान और आर्द्रता के मूल्यों को पढ़ता है। यह झूठे मानों की जांच करता है और जब भी मान सही होते हैं, तो यह मूल्यों को नए इंडेक्स नंबर और वर्तमान दिनांक और समय के साथ एक MySQL सर्वर पर भेजता है।

वेबसर्वर के पास एक PHP स्क्रिप्ट है जो MySQL सर्वर से मानों को पढ़ती है और Google चार्ट का उपयोग करके इससे एक अच्छा ग्राफ बनाती है। (उदाहरण)

आपूर्ति

मेरे द्वारा उपयोग किए जाने वाले भाग निम्नलिखित हैं:

  • ESP32-CAM (इसका कारण मैंने कैम संस्करण का उपयोग किया है क्योंकि इसमें एक बाहरी एंटीना कनेक्टर है। संभवतः अन्य ESP32 भी हैं जिनका आप उपयोग कर सकते हैं)
  • बाहरी एंटीना
  • AM2302 DHT22 सेंसर (इसमें एक अंतर्निर्मित अवरोधक है, इसलिए आपको केवल तीन तारों की आवश्यकता है)

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

  • १८६५० बैटरी शील्ड v3
  • 18650 बैटरी (NCR18650B)
  • पुराना माइक्रो USB केबल (ESP32 को बैटरी शील्ड से जोड़ने के लिए)
  • कुछ छोटे जम्पर तार

अतिरिक्त आवश्यकता:

  • यूएसबी से टीटीएल कनेक्टर (चित्र)

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

  • सोल्डरिंग आयरन
  • 3D प्रिंटर (केवल हाउसिंग केस के लिए आवश्यक)

चरण 1: Arduino कोड को ESP32-CAM. पर अपलोड करें

Arduino कोड को ESP32-CAM में अपलोड करें
Arduino कोड को ESP32-CAM में अपलोड करें

तो चलिए शुरू करते हैं!

Arduino कोड को ESP32-CAM में अपलोड करने के लिए, आपको ऊपर दिए गए स्कीमैटिक्स का उपयोग करके USBtoTTL कनेक्टर को ESP32 से कनेक्ट करना होगा।

Arduino कोड है:

/* DHT22 सेंसर से तापमान और आर्द्रता को पढ़ने के लिए बस एक छोटा सा कार्यक्रम और

इसे एमक्यूटीटी को पास करें। बी. डुइजनहौवर जून, ८, २०२० */ #include #include #include #define wifi_ssid "****WIFI_SSID***" //wifi ssid #define wifi_password "****WIFI_PASSWORD***" //wifi पासवर्ड #define mqtt_server "***SERVER_NAME***" // सर्वर का नाम या IP #define mqtt_user "****MQTT_USER***" // यूजरनेम #define mqtt_password "***MQTT_PASSWORD***" // पासवर्ड #डिफाइन टॉपिक "ग्लासहाउस" /dhtreadings" #define debug_topic "ग्लासहाउस/डीबग" // डिबगिंग के लिए विषय /* डीपस्लीप के लिए परिभाषाएं */ #डिफाइन uS_TO_S_FACTOR 1000000 /* माइक्रो सेकेंड से सेकेंड के लिए कन्वर्जन फैक्टर */ #define TIME_TO_SLEEP 180 /* Time ESP32 सो जाएगा 5 मिनट के लिए (सेकंड में) */ बूल डिबग = सच; // लॉग संदेश प्रदर्शित करें यदि सही है #DHT22_PIN 14 dht DHT को परिभाषित करें; वाईफाई क्लाइंट एस्प क्लाइंट; PubSubClient क्लाइंट (espClient); चार डेटा [८०]; शून्य सेटअप () {Serial.begin(११५२००); setup_wifi (); // वाईफाई नेटवर्क क्लाइंट से कनेक्ट करें। सेटसेवर (mqtt_server, 1883); // MQTT कनेक्शन कॉन्फ़िगर करें, यदि आवश्यक हो तो पोर्ट बदलें। अगर (! क्लाइंट। कनेक्टेड ()) {फिर से कनेक्ट करें (); } // डेटा पढ़ें int chk = DHT.read22 (DHT22_PIN); फ्लोट टी = डीएचटी। तापमान; फ्लोट एच = डीएचटी। आर्द्रता; स्ट्रिंग dhtReadings = "{"तापमान\":\"" + स्ट्रिंग (टी) + "\", \"आर्द्रता\":\"" + स्ट्रिंग (एच) + "\"}"; dhtReadings.toCharArray (डेटा, (dhtReadings.length () + 1)); अगर (डीबग) { सीरियल.प्रिंट ("तापमान:"); सीरियल.प्रिंट (टी); सीरियल.प्रिंट ("| आर्द्रता:"); सीरियल.प्रिंट्लन (एच); } // MQTT विषयों क्लाइंट के लिए मान प्रकाशित करें। प्रकाशित करें (विषय, डेटा); // विषय पर रीडिंग प्रकाशित करें (ग्लासहाउस / dhtreadings) अगर (डीबग) {Serial.println ("एमक्यूटीटी को रीडिंग भेजी गई।"); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // सो जाओ Serial.println ("सेटअप ESP32 प्रत्येक के लिए सोने के लिए" + स्ट्रिंग (TIME_TO_SLEEP) + "सेकंड"); Serial.println ("अब सामान्य रूप से सोने जा रहे हैं।"); esp_deep_sleep_start (); } // वाईफाई शून्य से सेटअप कनेक्शन setup_wifi () {देरी (20); सीरियल.प्रिंट्लन (); Serial.print ("कनेक्ट कर रहा है"); Serial.println (wifi_ssid); वाईफाई.बेगिन (वाईफाई_एसएसआईडी, वाईफाई_पासवर्ड); जबकि (WiFi.status() != WL_CONNECTED) {देरी (100); सीरियल.प्रिंट ("।"); } सीरियल.प्रिंट्लन (""); Serial.println ("वाईफाई ठीक है"); Serial.print ("=> ESP32 नया IP पता है:"); सीरियल.प्रिंट (वाईफाई.लोकलआईपी ()); सीरियल.प्रिंट्लन (""); } // अगर कनेक्शन खो गया है तो वाईफाई से फिर से कनेक्ट करें शून्य फिर से कनेक्ट करें () {जबकि (! क्लाइंट। कनेक्टेड ()) {सीरियल.प्रिंट ("एमक्यूटीटी ब्रोकर से कनेक्ट हो रहा है …"); if (client.connect("ESP32Client", mqtt_user, mqtt_password)) { Serial.println ("OK"); } और { सीरियल.प्रिंट ("[त्रुटि] कनेक्ट नहीं है:"); सीरियल.प्रिंट (क्लाइंट.स्टेट ()); Serial.println ("पुन: प्रयास करने से पहले 5 सेकंड प्रतीक्षा करें।"); देरी (5000); } } } शून्य लूप () { }

और फिर, क्रेडेंशियल्स को अपने क्रेडेंशियल्स से बदलना न भूलें

चरण 2: तार ऊपर

जुड़ गया!
जुड़ गया!

बिजली के लिए, मैंने एक पुराने यूएसबी केबल का इस्तेमाल किया, जिसमें से मैंने यूएसबी-ए कनेक्टर को काट दिया। यूएसबी केबल में चार तार होते हैं, हमें केवल काले और लाल तार चाहिए।

तो, ऊपर दिए गए शेड्यूल के अनुसार सब कुछ कनेक्ट करें।

चरण 3: Python3 स्क्रिप्ट

Python3 स्क्रिप्ट उस स्थान पर जाती है जहाँ यह रूट उपयोगकर्ता के लिए सुलभ है।

मैंने इस स्क्रिप्ट के लिए /root/scripts/glasshouse/glasshouse.py का उपयोग किया। पायथन लिपि की सामग्री है:

# Python3 स्क्रिप्ट MQTT से कनेक्ट करने के लिए, मान पढ़ें और उन्हें MySQL में लिखें

# # बी डुइजनहौवर # जून, 8 वीं 2020 # # संस्करण: 1.0 # # आयात paho.mqtt.client के रूप में mqtt आयात json आयात pymysql pymysql.install_as_MySQLdb () डेटाटाइम आयात डेटाटाइम से MySQLdb आयात करें db= MySQLdb.connect("localhost", "ग्लासहाउस", "***MYSQL_USERNAME***", "***MYSQL_PASSWORD***") कर्सर = db.cursor () ब्रोकर_एड्रेस = "लोकलहोस्ट" # ब्रोकर एड्रेस पोर्ट = 1883 # ब्रोकर पोर्ट यूजर = "** *MQTT_USERNAME***" #कनेक्शन यूजरनेम पासवर्ड = "***MQTT_PASSWORD***" #कनेक्शन पासवर्ड def on_connect (क्लाइंट, यूजरडेटा, फ्लैग, आरसी): # क्लाइंट ब्रोकर प्रिंट से कनेक्ट होने पर कॉलबैक ("कनेक्टेड" परिणाम कोड के साथ {0}.format(str(rc))) # कनेक्शन प्रयास क्लाइंट का प्रिंट परिणाम। सर्वर से प्रकाशित संदेश प्राप्त होता है। कर्सर.निष्पादन ("सेंसरडेटा से * चुनें") अंक = इंट (कर्सर.रोकाउंट) न्यूरो = अंक + 1 अब = डेटाटाइम। अब () formatted_date = now.strftime('%Y-%m-%d %H:% M:%S') पेलोड = json.loads(msg.payload.decode('utf-8')) प्रिंट ("नई पंक्ति:"+str(newrow)) तापमान = फ्लोट (पेलोड ["तापमान"]) आर्द्रता = फ्लोट (पेलोड ["आर्द्रता"]) प्रिंट ("तापमान:" + str (तापमान)) प्रिंट ("आर्द्रता:" + str (आर्द्रता)) प्रिंट ("दिनांक समय:" + str (formatted_date)) अगर ((तापमान) > -20) और (तापमान = 0) और (आर्द्रता <= 100)): cur = db.cursor() cur.execute("INSERT INTO Glasshouse.sensordata (idx, तापमान, आर्द्रता, टाइमस्टैम्प) VALUES ("+str" (newrow)+", "+str(temperature)+", "+str(humidity)+", %s)", (formatted_date)) db.commit () प्रिंट ("डेटा प्राप्त और MySQL में आयात किया गया") अन्य: प्रिंट ("डेटा सीमा से अधिक है और MySQL में आयात नहीं किया गया है") क्लाइंट = mqtt. Client ("duijnhouwer-com-ग्लासहाउस-स्क्रिप्ट") क्लाइंट.username_pw_set (उपयोगकर्ता, पासवर्ड = पासवर्ड) क्लाइंट। on_connect = on_connect # कॉलबैक फ़ंक्शन को परिभाषित करें के लिये सफल कनेक्शन client.on_message = on_message # संदेश प्राप्त करने के लिए कॉलबैक फ़ंक्शन को परिभाषित करें क्लाइंट। कनेक्ट (ब्रोकर_एड्रेस, पोर्ट = पोर्ट) # ब्रोकर क्लाइंट से कनेक्ट करें। लूप_फॉरएवर () # नेटवर्किंग डेमॉन शुरू करें

MySQL यूज़रनेम और पासवर्ड और MQTT यूज़रनेम और पासवर्ड को अपने क्रेडेंशियल में बदलना न भूलें

आप दो फाइलें बनाकर स्क्रिप्ट को एक सेवा के रूप में चला सकते हैं।

निम्नलिखित सामग्री के साथ पहला "/etc/init/glasshouse.conf" है:

रनलेवल पर शुरू करें [2345]

रनलेवल पर रुकें [!2345] निष्पादन /रूट/स्क्रिप्ट/ग्लासहाउस/ग्लासहाउस.py

दूसरा निम्नलिखित सामग्री के साथ "/etc/systemd/system/multi-user.target.wants/glasshouse.service" है:

[इकाई]

विवरण=ग्लासहाउस निगरानी सेवा के बाद=multi-user.target [सेवा] प्रकार=सरल पुनरारंभ=हमेशा पुनरारंभ करेंसेक=1 ExecStart=/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [इंस्टॉल करें] वांटेडबाय=मल्टी-यूजर.लक्ष्य

आप निम्न आदेश का उपयोग करके इसे सेवा के रूप में चला सकते हैं:

systemctl ग्लासहाउस सक्षम करें

और इसका उपयोग शुरू करें:

systemctl ग्लासहाउस शुरू करें

चरण 4: MySQL सर्वर

आपको इसमें सिर्फ एक टेबल के साथ एक नया MySQL डेटाबेस बनाना है।

तालिका बनाने के लिए कोड है:

तालिका बनाएं `सेंसरडेटा` (`idx` int(११) डिफॉल्ट न्यूल, `तापमान` फ्लोट डिफॉल्ट न्यूल, `आर्द्रता` फ्लोट डिफॉल्ट न्यूल, `टाइमस्टैम्प` डेटाटाइम डिफॉल्ट न्यूल) इंजन = इनो डीबी डिफॉल्ट चार्ट = utf8;

चरण 5: वेबसर्वर

वेबसर्वर में दो फ़ाइलें होती हैं, index.php फ़ाइल और एक config.ini फ़ाइल

config.ini फ़ाइल की सामग्री है:

[डेटाबेस]

db_host = "लोकलहोस्ट" db_name = "ग्लासहाउस" db_table = "सेंसरडेटा" db_user = "***DATABASE_USER***" db_password = "***DATABASE_PASSWORD ***"

जहां ऑफकोर्स आप ***DATABASE_USER*** और ***DATABASE_PASSWORD*** को अपने स्वयं के क्रेडेंशियल से प्रतिस्थापित करते हैं।

google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawChart); फ़ंक्शन ड्रॉचार्ट () { var डेटा = google.visualization.arrayToDataTable ([// ['टाइमस्टैम्प', 'तापमान', 'आर्द्रता', 'हीट इंडेक्स'], ['टाइमस्टैम्प', 'तापमान', 'आर्द्रता'], query($sql); # इस समय - लूप प्रारूप और सभी पुनर्प्राप्त डेटा को ['टाइमस्टैम्प', 'तापमान', 'आर्द्रता'] रास्ते में डाल दें। जबकि ($row = $result->fetch_assoc()) { $timestamp_rest = सबस्ट्र ($ पंक्ति ["टाइमस्टैम्प"], 10, 6); गूंज "['"। $ टाइमस्टैम्प_रेस्ट।"', "। $ पंक्ति ['तापमान']।", "। $ पंक्ति ['आर्द्रता']। "], "; // गूंज "['".$timestamp_rest।"', ".$row['temperature'].", ".$row['humidity'].", ".$row['heatindex ']।"], "; } ?>]); // घुमावदार रेखा var विकल्प = {शीर्षक: 'तापमान और आर्द्रता', वक्र प्रकार: 'फ़ंक्शन', किंवदंती: {स्थिति: 'नीचे'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // घुमावदार चार्ट वर चार्ट = नया google.visualization. LineChart (दस्तावेज़.getElementById ('वक्र_चार्ट')); चार्ट। ड्रा (डेटा, विकल्प); } // ड्रॉचार्ट से अंत ब्रैकेट //

चरण 6: 3डी प्रिंटेड हाउसिंग

आवास के लिए, मैंने दो अलग-अलग आवासों का उपयोग किया, एक ESP32-CAM और DHT22 के लिए एक साथ और एक 18650 बैटरी शील्ड के लिए।

चरण 7: अंतिम परिणाम

अंतिम परिणाम!
अंतिम परिणाम!
अंतिम परिणाम!
अंतिम परिणाम!
अंतिम परिणाम!
अंतिम परिणाम!
अंतिम परिणाम!
अंतिम परिणाम!

अंतिम परिणाम ऊपर की तस्वीरों में भी दिखाया गया है।

और जब भी बैटरी खाली हो, आप इसे मिनी यूएसबी केबल से चार्ज कर सकते हैं।

सिफारिश की: