جدول المحتويات:

درجة الحرارة والرطوبة باستخدام 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 Send Temperature and Humidity Data to localhost XAMPP for Absolute Beginners Step by Step 2024, يوليو
Anonim
درجة الحرارة والرطوبة باستخدام ESP32-DHT22-MQTT-MySQL-PHP
درجة الحرارة والرطوبة باستخدام ESP32-DHT22-MQTT-MySQL-PHP

أرادت صديقتي بيتًا زجاجيًا ، لذلك صنعتها واحدًا. لكنني أردت جهاز استشعار درجة الحرارة والرطوبة داخل البيت الزجاجي. لذلك ، بحثت في Google عن أمثلة وبدأت في التجريب.

كان استنتاجي أن جميع الأمثلة التي وجدتها لم تكن بالضبط ما أردت بناءه. لقد جمعت الكثير من الأجزاء الصغيرة من التعليمات البرمجية وجمعتها. لقد استغرق الأمر بعض الوقت لإنهاء عملي الأول لأن توثيق معظم الأمثلة كان صعبًا جدًا بالنسبة لي لفهمها أو أنها افترضت جزءًا يجب أن أعرفه ؟؟ لكن لم أكن أعرف شيئًا (حتى الآن) ☹

هذا هو السبب في أنني أبني هذا التدريب. برنامج تعليمي "من البداية وحتى النهاية" لكي يفهمه الجميع حرفياً. (على الأقل أتمنى؟)

كيف تعمل …

المنتج النهائي هو ESP32-CAM مع مستشعر DHT22 مرفق به والذي يحصل على الطاقة من بطارية 18650. يقرأ كل ثلاث دقائق درجة الحرارة والرطوبة ويرسل ذلك عبر شبكة WiFi إلى خادم MQTT خارجي ثم ينام (لمدة ثلاث دقائق) لاستخدام بطارية أقل حسب الحاجة

على خادم دبيان (والذي يمكن أن يكون أيضًا raspberry pi على ما أعتقد) لدي python3 وخادم MQTT وخادم MySQL وخادم ويب

يعمل البرنامج النصي python3 كخدمة وعندما يتلقى رسالة MQTT ، فإنه يحسب العدد السابق من الإدخالات (رقم الفهرس) ويزيد هذا بمقدار واحد. ثم يقرأ قيم درجة الحرارة والرطوبة من رسالة MQTT. إنه يتحقق من وجود قيم خاطئة ، وعندما تكون القيم صحيحة ، فإنه يرسل القيم مع رقم الفهرس الجديد والتاريخ والوقت الحاليين إلى خادم MySQL

يحتوي خادم الويب على برنامج نصي PHP يقرأ القيم من خادم MySQL ويقوم بعمل رسم بياني جميل منه باستخدام مخططات Google. (مثال)

اللوازم

الأجزاء التي استخدمتها هي التالية:

  • ESP32-CAM (سبب استخدامي لإصدار الكاميرا هو أنه يحتوي على موصل هوائي خارجي. ربما هناك أيضًا أجهزة ESP32 أخرى يمكنك استخدامها)
  • هوائي خارجي
  • مستشعر AM2302 DHT22 (يحتوي هذا الجهاز على مقاوم مدمج ، لذلك تحتاج فقط إلى ثلاثة أسلاك)

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

  • 18650 بطارية درع v3.0
  • بطارية 18650 (NCR18650B)
  • كبل USB صغير قديم (لتوصيل ESP32 بغطاء البطارية)
  • بعض أسلاك العبور القصيرة

مطلوب اضافية:

  • موصل USB إلى TTL (صورة)

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

  • لحام حديد
  • طابعة ثلاثية الأبعاد (مطلوبة فقط لحالة الغلاف)

الخطوة 1: قم بتحميل كود Arduino إلى ESP32-CAM

قم بتحميل كود Arduino على ESP32-CAM
قم بتحميل كود Arduino على ESP32-CAM

فلنبدأ!

لتحميل كود Arduino إلى ESP32-CAM ، يجب عليك توصيل موصل USBtoTTL بـ ESP32 باستخدام المخططات أعلاه.

كود اردوينو هو:

/ * برنامج صغير فقط لقراءة درجة الحرارة والرطوبة من مستشعر DHT22 و

تمريره إلى MQTT. ب. Duijnhouwer يونيو ، 8th 2020 * / #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // wifi password #define mqtt_server "*** SERVER_NAME ***" // server name or IP #define mqtt_user "*** MQTT_USER ***" // username #define mqtt_password "*** MQTT_PASSWORD ***" // password #define topic "glasshouse / dhtreadings "#define debug_topic" glasshouse / debug "// Topic for debugging / * تعريفات للنوم العميق * / #define uS_TO_S_FACTOR 1000000 / * عامل التحويل للثواني الدقيقة إلى الثواني * / #define TIME_TO_SLEEP 180 / * الوقت سينتقل ESP32 إلى وضع السكون لمدة 5 دقائق (بالثواني) * / bool debug = true ؛ // عرض رسالة السجل إذا كان صحيحًا # تعريف DHT22_PIN 14 dht DHT ؛ WiFiClient espClient ؛ عميل PubSubClient (espClient) ؛ بيانات شار [80] ؛ إعداد باطل () {Serial.begin (115200) ؛ setup_wifi () ، // الاتصال بعميل شبكة Wifi.setServer (mqtt_server ، 1883) ؛ // تكوين اتصال MQTT ، قم بتغيير المنفذ إذا لزم الأمر. إذا (! client.connected ()) {إعادة الاتصال () ؛ } // READ DATA int chk = DHT.read22 (DHT22_PIN) ؛ تعويم ر = دهت. درجة الحرارة ؛ تعويم ح = رطوبة دهت ؛ String dhtReadings = "{" temperature / ": \" "+ String (t) +" / "، \" humidity / ": \" "+ String (h) +" / "}"؛ dhtReadings.toCharArray (البيانات ، (dhtReadings.length () + 1)) ؛ إذا (تصحيح) {Serial.print ("درجة الحرارة:") ؛ Serial.print (t) ؛ Serial.print ("| الرطوبة:") ؛ Serial.println (ح) ؛ } // نشر القيم على موضوعات MQTT client.publish (موضوع ، بيانات) ؛ // نشر قراءات حول الموضوع (بيت زجاجي / dhtreadings) إذا (تصحيح) {Serial.println ("قراءات مرسلة إلى MQTT.") ؛ } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR) ، // اذهب إلى وضع السكون Serial.println ("إعداد ESP32 للنوم لكل" + سلسلة (TIME_TO_SLEEP) + "ثوانٍ") ؛ Serial.println ("الذهاب إلى النوم كالمعتاد الآن.") ؛ esp_deep_sleep_start () ، } // إعداد اتصال بشبكة wifi void setup_wifi () {delay (20)؛ Serial.println () ، Serial.print ("الاتصال بـ") ؛ Serial.println (wifi_ssid) ؛ WiFi.begin (wifi_ssid ، wifi_password) ؛ while (WiFi.status ()! = WL_CONNECTED) {delay (100) ؛ Serial.print (".") ؛ } Serial.println ("") ؛ Serial.println ("WiFi على ما يرام") ؛ Serial.print ("=> عنوان IP الجديد لـ ESP32 هو:")؛ Serial.print (WiFi.localIP ()) ؛ Serial.println ("") ؛ } // أعد الاتصال بشبكة wifi إذا فُقد الاتصال ، أعد الاتصال () {while (! client.connected ()) {Serial.print ("Connecting to MQTT broker…")؛ if (client.connect ("ESP32Client" ، mqtt_user ، mqtt_password)) {Serial.println ("موافق") ؛ } else {Serial.print ("[خطأ] غير متصل:")؛ Serial.print (client.state ()) ؛ Serial.println ("انتظر 5 ثوانٍ قبل إعادة المحاولة.") ؛ تأخير (5000) ؛ } } } حلقة فارغة() { }

ومرة أخرى ، لا تنس استبدال بيانات الاعتماد بأوراق الاعتماد الخاصة بك

الخطوة 2: ربط الأسلاك

اعلى السلك!
اعلى السلك!

من أجل الطاقة ، استخدمت كبل USB قديمًا قمت بقطع موصل USB-A منه. يوجد أربعة أسلاك في كبل USB ، نحتاج فقط إلى الأسلاك السوداء والحمراء.

لذا ، قم بتوصيل كل شيء وفقًا للجدول أعلاه.

الخطوة 3: Python3 Script

ينتقل نص Python3 إلى مكان يمكن للمستخدم الجذر الوصول إليه فيه.

استخدمت /root/scripts/glasshouse/glasshouse.py لهذا البرنامج النصي. محتويات نص Python هي:

# برنامج Python3 للاتصال بـ MQTT ، وقراءة القيم وكتابتها في MySQL

# # B. Duijnhouwer # يونيو ، 8th 2020 # # الإصدار: 1.0 # # import paho.mqtt.client مثل mqtt import json import pymysql pymysql.install_as_MySQLdb () استيراد MySQLdb من datetime import datetime db = MySQLdb.connect ("localhost"، "glasshouse"، "*** MYSQL_USERNAME ***"، "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** * MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** "#Connection password def on_connect (client ، userdata ، flags ، rc): # إعادة الاتصال عندما يتصل العميل بالطباعة الوسيطة (" متصل برمز النتيجة {0} ". format (str (rc))) # طباعة نتيجة محاولة الاتصال client.subscribe (" glasshouse / dhtreadings / # ") def on_message (client ، userdata ، msg): # رد الاتصال عند تم استلام رسالة النشر من الخادم. cursor.execute ("select * from sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datetime.now () formatted_date = now.strftime ('٪ Y-٪ m-٪ d٪ H:٪ M:٪ S ') الحمولة = json.loads (msg.payload.decode (' utf-8 ')) طباعة ("صف جديد:" + str (newrow)) درجة الحرارة = تعويم (الحمولة ["درجة الحرارة"]) الرطوبة = تعويم (الحمولة ["الرطوبة"]) طباعة ("درجة الحرارة:" + str (درجة الحرارة)) طباعة ("الرطوبة:" + str (الرطوبة)) طباعة ("DateTime:" + str (formatted_date)) إذا ((درجة الحرارة > -20) و (درجة الحرارة = 0) و (الرطوبة <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx ، درجة الحرارة ، الرطوبة ، الطابع الزمني) القيم (" + str (newrow) + "،" + str (temperature) + "،" + str (humidity) + "،٪ s)"، (formatted_date)) db.commit () print ("البيانات المستلمة والمستوردة في MySQL") وإلا: طباعة ("تجاوزت البيانات الحدود ولم يتم استيرادها في MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (المستخدم ، كلمة المرور = كلمة المرور) client.on_connect = on_connect # تعريف وظيفة رد الاتصال ل عميل اتصال ناجح.on_message = on_message # تحديد وظيفة رد الاتصال لاستلام عميل الرسالة.

لا تنسَ استبدال اسم مستخدم MySQL وكلمة المرور واسم مستخدم وكلمة مرور MQTT ببيانات الاعتماد الخاصة بك

يمكنك تشغيل البرنامج النصي كخدمة عن طريق إنشاء ملفين.

الأول هو "/etc/init/glasshouse.conf" بالمحتويات التالية:

تبدأ في مستوى التشغيل [2345]

توقف عند مستوى التشغيل [! 2345] exec /root/scripts/glasshouse/glasshouse.py

الثاني هو “/etc/systemd/system/multi-user.target.wants/glasshouse.service” بالمحتويات التالية:

[وحدة]

Description = خدمة مراقبة Glasshouse بعد = multi-user.target [الخدمة] النوع = إعادة تشغيل بسيطة = إعادة التشغيل دائمًا = 1 ExecStart = / usr / bin / python3 /root/scripts/glasshouse/glasshouse.py [تثبيت] WantedBy = متعدد المستخدمين.استهداف

يمكنك تشغيل هذا كخدمة باستخدام الأمر التالي:

systemctl تمكين البيت الزجاجي

وابدأ باستخدام:

systemctl بدء البيت الزجاجي

الخطوة 4: خادم MySQL

يجب عليك إنشاء قاعدة بيانات MySQL جديدة بها جدول واحد فقط.

رمز إنشاء الجدول هو:

إنشاء جدول "sensordata" (`idx` int (11) DEFAULT NULL،` temperature` float DEFAULT NULL، `humidity` float DEFAULT NULL ،` timestamp` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8 ؛

الخطوة 5: خادم الويب

يحتوي خادم الويب على ملفين ، ملف index.php وملف config.ini واحد

محتويات ملف config.ini هي:

[قاعدة البيانات]

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

حيث تستبدل *** DATABASE_USER *** و *** DATABASE_PASSWORD *** ببيانات الاعتماد الخاصة بك.

google.charts.load ('الحالية'، {'الحزم': ['corechart']})؛ google.charts.setOnLoadCallback (drawChart) ؛ function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp'، 'Temperature'، 'Humidity'، 'Heat Index']، ['Timestamp'، 'Temperature'، 'Humidity'] ، الاستعلام ($ sql) ؛ # تنسيقات هذه while - loop ووضع جميع البيانات المسترجعة في طريقة ['timestamp'، 'temperature'، 'humidity']. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"]، 10، 6)؛ صدى "['". $ timestamp_rest. "'،". $ row ['temperature']. "،". $ row ['humidity']. "]،"؛ // echo "['". $ timestamp_rest. "'،". $ row ['temperature']. "،". $ row ['humidity']. "،". $ row ['heatindex ']. "]،"؛}؟>])؛ // Curved line var options = {title: 'temperature and humidity'، curveType: 'function'، legend: {position: 'bottom'}، hAxis: {slantedText: true، slantedTextAngle: 45}}؛ // Curved chart var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')) ؛ رسم بياني (بيانات ، خيارات) ؛ } // قوس نهاية من drawChart //

الخطوة 6: غلاف مطبوع ثلاثي الأبعاد

بالنسبة للإسكان ، استخدمت علبتين منفصلتين ، أحدهما لـ ESP32-CAM و DHT22 معًا والآخر لدرع البطارية 18650.

الخطوة 7: النتيجة النهائية

النتيجة النهائية!
النتيجة النهائية!
النتيجة النهائية!
النتيجة النهائية!
النتيجة النهائية!
النتيجة النهائية!
النتيجة النهائية!
النتيجة النهائية!

تظهر النتيجة النهائية أيضًا في الصور أعلاه.

وعندما تكون البطارية فارغة ، يمكنك شحنها باستخدام كابل USB صغير.

موصى به: