Բովանդակություն:

ESP32-DHT22-MQTT-MySQL-PHP- ի միջոցով ջերմաստիճան և խոնավություն. 7 քայլ
ESP32-DHT22-MQTT-MySQL-PHP- ի միջոցով ջերմաստիճան և խոնավություն. 7 քայլ

Video: ESP32-DHT22-MQTT-MySQL-PHP- ի միջոցով ջերմաստիճան և խոնավություն. 7 քայլ

Video: ESP32-DHT22-MQTT-MySQL-PHP- ի միջոցով ջերմաստիճան և խոնավություն. 7 քայլ
Video: 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- ի միջոցով ջերմաստիճան և խոնավություն

Իմ ընկերուհին ցանկանում էր ջերմոց օգտագործել, ուստի ես նրան պատրաստեցի: Բայց ես ուզում էի, որ ջերմոցի և խոնավության ցուցիչն ապակու ներսում լիներ: Այսպիսով, ես գուգլեցի օրինակներ և սկսեցի փորձարկել:

Իմ եզրակացությունն այն էր, որ իմ գտած բոլոր օրինակներն այն չէին, ինչ ես ուզում էի կառուցել: Ես բռնեցի կոդի շատ փոքր մասեր և համատեղեցի դրանք: Ինձ բավական ժամանակ պահանջվեց ավարտելու իմ առաջին աշխատանքային կառուցվածքը, քանի որ շատ օրինակների փաստաթղթերը ինձ համար չափազանց դժվար էր հասկանալ, կամ նրանք ենթադրում էին, որ ես պետք է իմանայի: Բայց ես ոչինչ չգիտեի (դեռ)

Ահա թե ինչու ես կառուցում եմ սա ուսանելի: «Սկիզբ-մինչև վերջ» ձեռնարկ ՝ բառացիորեն բոլորի համար հասկանալի: (Գոնե հույս ունե՞մ)

Ինչպես է դա աշխատում …

Վերջնական արտադրանքը ESP32-CAM- ն է, որին կցված է DHT22 սենսոր, որն իր էներգիան ստանում է 18650 մարտկոցից: Ամեն երեք րոպեն մեկ կարդում է ջերմաստիճանը և խոնավությունը և WiFi- ով այն ուղարկում արտաքին MQTT սերվեր, այնուհետև քնում (երեք րոպե) `անհրաժեշտության դեպքում այնքան քիչ մարտկոց օգտագործելու համար:

Debian սերվերի վրա (որը ենթադրաբար կարող է լինել նաև ազնվամորու pi) ես ունեմ python3, MQTT սերվեր, MySQL սերվեր և վեբ սերվեր:

Python3 սցենարը գործում է որպես ծառայություն և ամեն անգամ, երբ ստանում է MQTT հաղորդագրություն, հաշվում է գրառումների նախորդ թիվը (ինդեքսի համարը) և ավելացնում այն մեկով: Այնուհետև այն կարդում է ջերմաստիճանի և խոնավության արժեքները MQTT հաղորդագրությունից: Այն ստուգում է կեղծ արժեքները և երբ արժեքները ճիշտ են, այն արժեքները ուղարկում է նոր ինդեքսի համարի և ընթացիկ ամսաթվի և ժամի հետ MySQL սերվեր:

Վեբ սերվերն ունի PHP սցենար, որը կարդում է MySQL սերվերի արժեքները և դրանից գրաֆիկ է պատրաստում ՝ օգտագործելով Google Charts- ը: (օրինակ)

Պարագաներ

Իմ օգտագործած մասերը հետևյալն են.

  • 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%…

  • Sոդման երկաթ
  • 3D տպիչ (անհրաժեշտ է միայն բնակարանային պատյանների համար)

Քայլ 1: Վերբեռնեք Arduino ծածկագիրը ESP32-CAM- ում

Վերբեռնեք Arduino ծածկագիրը ESP32-CAM- ում
Վերբեռնեք Arduino ծածկագիրը ESP32-CAM- ում

Այսպիսով, եկեք սկսենք!

Arduino ծածկագիրը ESP32-CAM- ում վերբեռնելու համար պետք է USBtoTTL միակցիչը միացնել ESP32- ին ՝ օգտագործելով վերը նշված սխեմաները:

Arduino- ի ծածկագիրն է.

/*Ընդամենը մի փոքր ծրագիր ՝ DHT22 տվիչից ջերմաստիճանը և խոնավությունը կարդալու համար և

փոխանցեք այն MQTT- ին: B. Duijnhouwer Հունիս, 8 -րդ 2020 թ. "*** SERVER_NAME ***" // սերվերի անուն կամ IP #սահմանել mqtt_user "*** MQTT_USER ***" // օգտվողի անուն #սահմանել mqtt_password "*** MQTT_PASSWORD ***" // գաղտնաբառ #թեմայի սահմանում "ջերմոցի /dhtreadings "#define debug_topic" glasshouse /debug "// Topb debugging /* definitions for deepsleep* / #սահմանել uS_TO_S_FACTOR 1000000 /* Փոխակերպման գործոնը միկրո վայրկյաններից վայրկյանների համար* / #սահմանել TIME_TO_SLEEP 180 /* Timeամանակը ESP32- ը քնելու է 5 րոպե (վայրկյանների ընթացքում) */ bool debug = true; // Displayուցադրել տեղեկամատյանային հաղորդագրություն, եթե True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient հաճախորդ (espClient); char տվյալներ [80]; void setup () {Serial.begin (115200); setup_wifi (); // Միացեք Wifi ցանցի client.setServer- ին (mqtt_server, 1883); // Կարգավորեք MQTT կապը, անհրաժեշտության դեպքում փոխեք պորտը: if (! client.connected ()) {նորից միանալ (); } // ԿԱՐԴԱԼ ՏՎՅԱԼՆԵՐ int chk = DHT.read22 (DHT22_PIN); բոց t = DHT. ջերմաստիճան; բոց h = DHT. խոնավություն; String dhtReadings = "{" ջերմաստիճան / ": \" " + Լար (t) +" / ", \" խոնավություն / ": \" " + Լար (h) +" / "}"; dhtReadings.toCharArray (տվյալներ, (dhtReadings.length () + 1)); if (կարգաբերում) {Serial.print ("Temերմաստիճանը."); Serial.print (t); Serial.print ("| Խոնավություն."); Serial.println (h); } // Հրապարակել արժեքներ 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 () {հետաձգում (20); Serial.println (); Serial.print («Միացում»); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {ուշացում (100); Serial.print ("."); } Serial.println (""); Serial.println («WiFi- ն կարգին է»); Serial.print ("=> ESP32 նոր IP հասցեն է` "); Serial.print (WiFi.localIP ()); Serial.println (""); } // Միացեք wifi- ին, եթե կապը կորել է, անվավեր միացեք () {մինչ (! Client.connected ()) {Serial.print ("Միացում MQTT բրոքերին …"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Սխալ] Միացված չէ."); Serial.print (client.state ()); Serial.println («Սպասեք 5 վայրկյան ՝ նորից փորձելուց առաջ»); ուշացում (5000); }}} void loop () {}

Եվ կրկին, մի մոռացեք հավատարմագրերը փոխարինել ձեր հավատարմագրերով:

Քայլ 2: Լարվիր:

Wire Up!
Wire Up!

Էլեկտրաէներգիայի համար ես օգտագործեցի հին USB մալուխ, որից կտրեցի USB-A միակցիչը: USB մալուխի մեջ կա չորս լար, մեզ պետք են միայն սևերն ու կարմիրները:

Այսպիսով, ամեն ինչ միացրեք վերը նշված ժամանակացույցի համաձայն:

Քայլ 3: Python3 Script

Python3 սցենարը մտնում է այնպիսի վայր, որտեղ այն հասանելի է արմատային օգտագործողին:

Այս սցենարի համար ես օգտագործել եմ /root/scripts/glasshouse/glasshouse.py: Պիթոնի սցենարի բովանդակությունը հետևյալն է.

# Python3 սցենար ՝ MQTT- ին միանալու, արժեքները կարդալու և դրանք MySQL- ում գրելու համար

# # B. Duijnhouwer # հունիսի, 8 -րդ 2020 # # տարբերակ ՝ 1.0 # # import paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb from datetime import datetime db = MySQLdb.connect ("local "glasshouse", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") կուրսորը = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Միջնորդ նավահանգստի օգտվող = "** *MQTT_USERNAME *** " #Միացման օգտվողի գաղտնաբառ =" *** MQTT_PASSWORD *** " #Միացման գաղտնաբառ def_connect- ում (հաճախորդ, օգտվողի տվյալներ, դրոշներ, rc). արդյունքի կոդով {0} ". ձևաչափ (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 () formatatted_date = now.strftime ('%Y-%m-%d%H:% M:%S ') payload = json.loads (msg.payload.decode (' utf-8 ')) print ("New row:"+str (newrow)) temperature = float (payload ["temperature"]) խոնավություն = float (payload ["խոնավություն"]) print ("Temperature:"+str (temperature)) print ("Humidity:"+str (խոնավություն)) print ("DateTime:"+str (formatatted_date)) if ((temperature > -20) և (ջերմաստիճան = 0) և (խոնավություն <= 100)). (newrow)+","+str (ջերմաստիճան)+","+str (խոնավություն)+", %s)", (formatted_date)) db.commit () print ("MySQL- ում ստացված և ներմուծված տվյալները") այլ: print ("տվյալները գերազանցել են սահմանները և ՉԻ ներմուծվում MySQL- ում") հաճախորդ = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (օգտվող, գաղտնաբառ = գաղտնաբառ) client.on_connect = on_connect # Սահմանել հետադարձ կապի գործառույթը համար հաջողակ կապի client.on_message = on_message # Սահմանել հետադարձ կապի գործառույթը ՝ հաղորդագրություն ստանալու հաճախորդի համար: միացեք (միջնորդի հասցե, նավահանգիստ = նավահանգիստ) # միացեք բրոքերային հաճախորդին: loop_forever () # Սկսեք ցանցային դև

Մի մոռացեք MySQL օգտվողի անունն ու գաղտնաբառը և MQTT օգտվողի անունն ու գաղտնաբառը փոխարինել ձեր սեփական հավատարմագրերին:

Դուք կարող եք այնպես անել, որ սցենարը գործարկվի որպես ծառայություն ՝ ստեղծելով երկու ֆայլ:

Առաջինը «/etc/init/glasshouse.conf» - ն է ՝ հետևյալ բովանդակությամբ.

սկսել runlevel- ից [2345]

կանգ առնել runlevel- ում [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Երկրորդը «/etc/systemd/system/multi-user.target.wants/glasshouse.service» է ՝ հետևյալ բովանդակությամբ.

[Միավոր]

Նկարագրություն = Glasshouse Monitoring Service After = multi-user.target [Service] Type = simple Restart = always RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy = multi-user.թիրախ

Դուք կարող եք այն գործարկել որպես ծառայություն ՝ օգտագործելով հետևյալ հրամանը.

systemctl միացնել ջերմոցը

և սկսեք օգտագործել ՝

systemctl start glasshouse

Քայլ 4: MySQL Server

Դուք պետք է ստեղծեք նոր MySQL տվյալների բազա ՝ ընդամենը մեկ աղյուսակով:

Աղյուսակի ստեղծման ծածկագիրն է.

Ստեղծել աղյուսակ `sensordata` (`idx` int (11) ՄԱՍՆԱԳԻՏԱԿԱՆ ՆՈLԼ,« ջերմաստիճանը »բոց ՊԱՇՏՊԱՆԱԿԱՆ ՆՈLԼ,« խոնավությունը »լողում է ՊԱՇՏՊԱՆՈULԹՅԱՆ ՆՈLԼ,« ժամանակային դրոշմակնիքի »ամսաթվերը ՝ ՀԵՌԱԳՈՐ ԱՌԱՆՈ)ԹՅՈՆ) Շարժիչ = InnoDB ՊԱՇՏՊԱՆՈARԹՅՈARՆ ARԱՐԳ = 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); # This while - հանգույցի ձևաչափեր և տեղադրված բոլոր տվյալները տեղադրեք ['timestamp', 'temperature', 'խոնավություն'] way. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['խոնավություն']: "],"; // echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['խոնավություն']. ",". $ row ['heatindex ']. "],";}?>]); // Curved line var options = {title: 'Temperature and խոնավություն', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Curved chart var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (տվյալներ, ընտրանքներ); } // ավարտի փակագծերը drawChart- ից //

Քայլ 6: 3D տպագիր բնակարան

Բնակարանի համար ես օգտագործել եմ երկու առանձին պատյան ՝ մեկը ESP32-CAM- ի և DHT22- ի համար միասին, և մեկը 18650 մարտկոցի վահանի համար:

Քայլ 7: Վերջնական արդյունքը:

Վերջնական Արդյունք!
Վերջնական Արդյունք!
Վերջնական Արդյունք!
Վերջնական Արդյունք!
Վերջնական Արդյունք!
Վերջնական Արդյունք!
Վերջնական Արդյունք!
Վերջնական Արդյունք!

Վերջնական արդյունքը ցուցադրվում է նաև վերևի նկարներում:

Եվ երբ մարտկոցը դատարկ է, այն կարող եք լիցքավորել մինի USB մալուխով:

Խորհուրդ ենք տալիս: