תוכן עניינים:

טמפרטורה ולחות באמצעות ESP32-DHT22-MQTT-MySQL-PHP: 7 שלבים
טמפרטורה ולחות באמצעות ESP32-DHT22-MQTT-MySQL-PHP: 7 שלבים

וִידֵאוֹ: טמפרטורה ולחות באמצעות ESP32-DHT22-MQTT-MySQL-PHP: 7 שלבים

וִידֵאוֹ: טמפרטורה ולחות באמצעות ESP32-DHT22-MQTT-MySQL-PHP: 7 שלבים
וִידֵאוֹ: מד טמפרטורה ולחות 03-6323266 2024, נוֹבֶמבֶּר
Anonim
טמפרטורה ולחות באמצעות ESP32-DHT22-MQTT-MySQL-PHP
טמפרטורה ולחות באמצעות ESP32-DHT22-MQTT-MySQL-PHP

חברה שלי רצתה חממה, אז הכנתי לה אחת. אבל רציתי חיישן טמפרטורה ולחות בתוך החממה. אז, חיפשתי דוגמאות והתחלתי להתנסות.

המסקנה שלי הייתה שכל הדוגמאות שמצאתי הן לא בדיוק מה שאני רוצה לבנות. תפסתי הרבה חלקי קוד קטנים ושילבתי אותם. לקח לי די הרבה זמן לסיים את עבודת הבנייה הראשונה שלי מכיוון שהתיעוד של רוב הדוגמאות היה קשה מדי בשביל להבין או שהם הניחו חלק שאני צריך לדעת ?? אבל לא ידעתי כלום (עדיין) ☹

לכן אני בונה את זה להוראה. מדריך "מתחיל עד הסוף" שכל אחד יכול להבין אותו פשוטו כמשמעו. (לפחות אני מקווה?)

איך זה עובד …

המוצר הסופי הוא ESP32-CAM עם חיישן DHT22 המחובר אליו שמספק את הכוח שלו מסוללה של 18650. כל שלוש דקות הוא קורא את הטמפרטורה והלחות ושולח את זה באמצעות WiFi לשרת MQTT חיצוני ואז הולך לישון (במשך שלוש דקות) כדי להשתמש בפחות סוללה לפי הצורך

בשרת Debian, (שיכול להיות גם פאי פטל אני מניח) יש לי 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
  • סוללה 18650 (NCR18650B)
  • כבל מיקרו USB ישן (לחיבור ה- ESP32 למגן הסוללה)
  • כמה חוטי מגשר קצרים

צורך נוסף:

  • מחבר USB ל TTL (תמונה)

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

  • מלחם
  • מדפסת תלת מימד (נחוצה רק למארז דיור)

שלב 1: העלה את קוד ה- Arduino ל- ESP32-CAM

העלה את קוד הארדואינו ל- ESP32-CAM
העלה את קוד הארדואינו ל- ESP32-CAM

אז בואו נתחיל!

כדי להעלות את קוד ה- Arduino ל- ESP32-CAM, עליך לחבר את מחבר USBtoTTL ל- ESP32 באמצעות התרשימים שלמעלה.

קוד הארדואינו הוא:

/*רק תוכנית קטנה לקריאת הטמפרטורה והלחות מחיישן DHT22 ו

העבירו אותו ל- MQTT. B. Duijnhouwer יוני, 8th 2020*/#include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wifi ssid #define wifi_password "*** WIFI_PASSWORD ***" // סיסמת wifi #הגדר mqtt_server "*** SERVER_NAME ***" // שם שרת או כתובת IP #הגדר mqtt_user "*** MQTT_USER ***" // שם משתמש #הגדר mqtt_password "*** MQTT_PASSWORD ***" // סיסמא #הגדר נושא "חממה /dhtreadings "#define debug_topic" חממה /איתור באגים "// נושא לניפוי באגים /* הגדרות עבור deepsleep* /#define uS_TO_S_FACTOR 1000000 /* גורם המרה למיקרו שניות לשניות* /#define TIME_TO_SLEEP 180 /* זמן ESP32 ילך לישון למשך 5 דקות (בשניות) */ bool debug = true; // הצג הודעת יומן אם True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; לקוח PubSubClient (espClient); נתוני צ'אר [80]; הגדרת חלל () {Serial.begin (115200); setup_wifi (); // התחבר לרשת Wifi client.setServer (mqtt_server, 1883); // הגדר חיבור MQTT, שנה יציאה במידת הצורך. אם (! client.connected ()) {התחבר מחדש (); } // READ DATA int chk = DHT.read22 (DHT22_PIN); צף t = DHT.temperature; לצוף h = DHT. לחות; String dhtReadings = "{" טמפרטורה / ": \" " + מחרוזת (t) +" / ", \" לחות / ": \" " + מחרוזת (ח) +" / "}"; dhtReadings.toCharArray (נתונים, (dhtReadings.length () + 1)); if (באגים) {Serial.print ("טמפרטורה:"); Serial.print (t); Serial.print ("| לחות:"); Serial.println (ח); } // פרסם ערכים לנושאי MQTT client.publish (נושא, נתונים); // פרסם קריאות בנושא (glasshouse/dhtreadings) if (debug) {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 () {עיכוב (20); Serial.println (); Serial.print ("מתחבר אל"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); בעוד (WiFi.status ()! = WL_CONNECTED) {עיכוב (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi תקין"); Serial.print ("=> ESP32 כתובת IP חדשה היא:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // התחבר מחדש ל- wifi אם החיבור מתאבד, התחבר מחדש () {while (! Client.connected ()) {Serial.print ("מתחבר לברוקר MQTT …"); 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

סקריפט Python3 נכנס למקום בו הוא נגיש למשתמש הבסיסי.

השתמשתי ב- /root/scripts/glasshouse/glasshouse.py עבור סקריפט זה. התוכן של סקריפט הפיתון הוא:

# סקריפט Python3 להתחבר ל- MQTT, לקרוא ערכים ולכתוב אותם ל- MySQL

# # B. Duijnhouwer # יוני, 8th 2020 # # גרסה: 1.0 # # יבוא paho.mqtt.client כמו mqtt יבוא json יבוא pymysql pymysql.install_as_MySQLdb () ייבא MySQLdb מ- datetime import datetime db = MySQLdb.connect ("localhost", "חממה", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" #יציאת כתובת ברוקר = 1883 #משתמש יציאת ברוקר = "** *MQTT_USERNAME *** "סיסמת שם משתמש #חיבור =" *** MQTT_PASSWORD *** " #סיסמת חיבור מוגדרת on_connect (לקוח, נתוני משתמש, דגלים, rc): #החזרה כאשר הלקוח מתחבר לדפוס המתווך (" מחובר עם קוד התוצאה {0} ". פורמט (str (rc))) # תוצאת הדפסה של ניסיון חיבור client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # החזרה מתי הודעת PUBLISH מתקבלת מהשרת. cursor.execute ("בחר * מתוך sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 עכשיו = datetime.now () format_date = now.strftime ('%Y-%m-%d%H:% M:%S ') payload = json.loads (msg.payload.decode (' utf-8 ')) print ("שורה חדשה:"+str (newrow)) טמפרטורה = float (מטען ["טמפרטורה"]) לחות = float (מטען ["לחות"]) הדפסה ("טמפרטורה:"+סטר (טמפרטורה)) הדפסה ("לחות:"+סטר (לחות)) הדפסה ("DateTime:"+str (format_date)) if ((טמפרטורה > -20) ו- (טמפרטורה = 0) ו- (לחות <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, טמפרטורה, לחות, חותמת זמן) VALUES ("+str (newrow)+","+str (טמפרטורה)+","+str (לחות)+", %s)", (format_date)) db.commit () print ("נתונים שהתקבלו ויובאו ב- MySQL") אחר: print ("הנתונים חרגו מהמגבלות ואינם מיובאים ב- MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (משתמש, סיסמא = סיסמה) client.on_connect = on_connect # הגדר פונקציית התקשרות חוזרת ל חיבור מוצלח client.on_message = on_message # הגדר פונקציית התקשרות חוזרת לקבלת הודעה client.connect (broker_address, port = port) #connect to broker client.loop_forever () # התחל רשת שד

אל תשכח להחליף את שם המשתמש והסיסמה של MySQL ואת שם המשתמש והסיסמה של MQTT לאישורים שלך

אתה יכול לגרום לתסריט לפעול כשירות על ידי יצירת שני קבצים.

הראשון הוא "/etc/init/glasshouse.conf" עם התכנים הבאים:

התחל על רמה רמה [2345]

עצור ב- runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py

השני הוא /etc/systemd/system/multi-user.target.wants/glasshouse.service” עם התכנים הבאים:

[יחידה]

Description = Service Monitoring Glasshouse After = multi-user.target [Service] Type = simple Restart = always RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [התקן] WantedBy = ריבוי משתמשים.יַעַד

אתה יכול להריץ את זה כשירות באמצעות הפקודה הבאה:

systemctl לאפשר חממה

והתחל אותו באמצעות:

חממת systemctl start

שלב 4: שרת MySQL

עליך ליצור מסד נתונים חדש של MySQL ובו רק טבלה אחת.

הקוד ליצירת הטבלה הוא:

צור טבלה `sensordata` (`idx` int (11) DEFAULT NULL,` temperature` float DEFAULT NULL, `לחות` מצוף DEFAULT NULL,` חותם` 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 ('current', {'packages': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['חותמת זמן', 'טמפרטורה', 'לחות', 'מדד חום'], ['חותמת זמן', 'טמפרטורה', 'לחות'], שאילתה ($ sql); # This while - פורמטים בלולאה והכניסו את כל הנתונים שאוחזרו לאתר ['חותמת זמן', 'טמפרטורה', 'לחות']. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); הד "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['לחות']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['לחות']. ",". $ row ['heatindex ']. "],";}?>]); // אפשרויות קו עוקל var = {title: 'טמפרטורה ולחות', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // תרשים מעוגל var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (נתונים, אפשרויות); } // סוגר סיום מתוך drawChart //

שלב 6: דיור בתלת מימד

עבור הדיור השתמשתי בשני בתי מגורים נפרדים, אחד ל- ESP32-CAM ו- DHT22 יחד ואחד למגן הסוללה מ -18650.

שלב 7: התוצאה הסופית

התוצאה הסופית!
התוצאה הסופית!
התוצאה הסופית!
התוצאה הסופית!
התוצאה הסופית!
התוצאה הסופית!
התוצאה הסופית!
התוצאה הסופית!

התוצאה הסופית מוצגת גם בתמונות למעלה.

ובכל פעם שהסוללה ריקה, אתה יכול לטעון אותה באמצעות כבל USB מיני.

מוּמלָץ: