Სარჩევი:

ტემპერატურა და ტენიანობა ESP32-DHT22-MQTT-MySQL-PHP გამოყენებით: 7 ნაბიჯი
ტემპერატურა და ტენიანობა ESP32-DHT22-MQTT-MySQL-PHP გამოყენებით: 7 ნაბიჯი

ვიდეო: ტემპერატურა და ტენიანობა ESP32-DHT22-MQTT-MySQL-PHP გამოყენებით: 7 ნაბიჯი

ვიდეო: ტემპერატურა და ტენიანობა ESP32-DHT22-MQTT-MySQL-PHP გამოყენებით: 7 ნაბიჯი
ვიდეო: ESP8266 + DHT22 + Blynk ტენიანობის და ტემპერატურის სენსრორი ქლაუდზე და ტელეფონში. ჩუქდება მულტიმეტრი 2024, ივლისი
Anonim
ტემპერატურა და ტენიანობა ESP32-DHT22-MQTT-MySQL-PHP გამოყენებით
ტემპერატურა და ტენიანობა ESP32-DHT22-MQTT-MySQL-PHP გამოყენებით

ჩემს შეყვარებულს მინდოდა სათბურის სახლი, ამიტომ მე ის გავაკეთე. მე მინდოდა ტემპერატურისა და ტენიანობის სენსორი სათბურის შიგნით. ასე რომ, მე გუგლში მოვიძიე მაგალითები და დავიწყე ექსპერიმენტები.

ჩემი დასკვნა იყო, რომ ყველა მაგალითი, რაც მე ვიპოვე, არ იყო ზუსტად ის, რისი აშენებაც მინდოდა. მე ავიღე კოდის ბევრი პატარა ნაწილი და გავაერთიანე ისინი. საკმაოდ დიდი დრო დამჭირდა, რომ დამემთავრებინა ჩემი პირველი სამუშაო სტრუქტურა, რადგან ბევრი მაგალითის დოკუმენტაცია ჩემთვის ძნელი გასაგები იყო, ან მათ ჩათვალეს ნაწილი, რომელიც უნდა ვიცოდე ?? მაგრამ მე ჯერ არაფერი ვიცოდი (ჯერ)

ამიტომაც ვაშენებ ამას სასწავლო. "დასაწყისიდან ბოლომდე" სამეურვეო სიტყვასიტყვით ყველას გასაგები. (მაინც იმედი მაქვს?)

Როგორ მუშაობს …

საბოლოო პროდუქტი არის ESP32-CAM, რომელსაც აქვს DHT22 სენსორი, რომელსაც აქვს ძალა 18650 ბატარეიდან. ყოველ სამ წუთში ის კითხულობს ტემპერატურასა და ტენიანობას და აგზავნის მას WiFi- ით გარე MQTT სერვერზე და შემდეგ იძინებს (სამი წუთის განმავლობაში) რათა საჭიროებისამებრ ნაკლები ბატარეა გამოიყენოს

დებიანის სერვერზე, (რომელიც ასევე შეიძლება ჟოლოს პი იყოს) მე მაქვს 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 to TTL კონექტორი (სურათი)

    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 სენსორის ტემპერატურისა და ტენიანობის წასაკითხად და

გადაეცი მას MQTT– ში. B. Duijnhouwer, 8 ივნისი, 2020 წ "*** SERVER_NAME ***" // სერვერის სახელი ან IP #განსაზღვრეთ mqtt_user "*** MQTT_USER ***" // მომხმარებლის სახელი #განსაზღვრეთ mqtt_password "*** MQTT_PASSWORD ***" // პაროლი #განსაზღვრეთ თემა "glasshouse /dhtreadings "#define debug_topic" glasshouse /debug "// თემა გამართვის /* განმარტებები ღრმა ძილში* / #განსაზღვრეთ uS_TO_S_FACTOR 1000000 /* კონვერტაციის ფაქტორი მიკრო წამებში წამებში* / #განსაზღვრეთ TIME_TO_SLEEP 180 /* დრო ESP32 დაიძინებს 5 წუთის განმავლობაში (წამში) */ bool debug = true; // აჩვენეთ ჟურნალის შეტყობინება თუ True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient კლიენტი (espClient); char მონაცემები [80]; void setup () {Serial.begin (115200); setup_wifi (); // დაკავშირება Wifi ქსელის კლიენტთან. SetServer (mqtt_server, 1883); // MQTT კავშირის კონფიგურაცია, საჭიროების შემთხვევაში პორტის შეცვლა. if (! client.connected ()) {ხელახლა დაკავშირება (); } // წაიკითხეთ მონაცემები int chk = DHT.read22 (DHT22_PIN); float t = DHT.temperature; float h = DHT. ტენიანობა; სიმებიანი dhtReadings = "{" ტემპერატურა / ": \" " + სიმებიანი (t) +" / ", \" ტენიანობა / ": \" " + სიმებიანი (თ) +" / "}"; dhtReadings.toCharArray (მონაცემები, (dhtReadings.length () + 1)); if (გამართვა) {Serial.print ("ტემპერატურა:"); სერიული. ბეჭდვა (t); Serial.print ("| ტენიანობა:"); სერიული. ბეჭდვა (თ); } // ღირებულებების გამოქვეყნება MQTT თემებზე client.publish (თემა, მონაცემები); // საკითხების გამოქვეყნება თემაზე (glasshouse/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. დასაწყისი (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– სთან კავშირის დაკარგვის შემთხვევაში ბათილია ხელახლა დაკავშირება () {while (! 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: გათიშეთ

მავთული!
მავთული!

სიმძლავრისთვის გამოვიყენე ძველი USB კაბელი, რომლისგანაც შეწყვიტა USB-A კონექტორი. USB კაბელში არის ოთხი მავთული, ჩვენ გვჭირდება მხოლოდ შავი და წითელი.

ასე რომ, შეაერთეთ ყველაფერი ზემოთ მოცემული გრაფიკის მიხედვით.

ნაბიჯი 3: Python3 სკრიპტი

Python3 სკრიპტი გადადის იმ ადგილას, სადაც ის ხელმისაწვდომია root მომხმარებლისთვის.

მე გამოვიყენე /root/scripts/glasshouse/glasshouse.py ამ სკრიპტისთვის. პითონის სკრიპტის შინაარსია:

# Python3 სკრიპტი MQTT– თან დასაკავშირებლად, მნიშვნელობების წასაკითხად და ჩაწერისთვის MySQL– ში

# # B. Duijnhouwer # ივნისი, 8 2020 "glasshouse", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") კურსორი = db.cursor () broker_address = "localhost" #საბროკერო მისამართის პორტი = 1883 #საბროკერო პორტის მომხმარებელი = "** *MQTT_USERNAME *** " #კავშირის მომხმარებლის სახელის პაროლი =" *** MQTT_PASSWORD *** " #დაკავშირების პაროლი def_connect (კლიენტი, მომხმარებლის მონაცემები, დროშები, rc): #გამოძახება, როდესაც კლიენტი დაუკავშირდება საბროკერო ბეჭდვას (" დაკავშირებულია შედეგის კოდით {0} ". ფორმატი (str (rc))) # ამობეჭდეთ შედეგი მცდელობა client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # გამოძახება როდესაც PUBLISH შეტყობინება მიიღება სერვერისგან. 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 ("ტემპერატურა:"+str (ტემპერატურა)) print ("Humidity:"+str (ტენიანობა)) print ("DateTime:"+str (ფორმატირებული_თარიღი)) თუ ((ტემპერატურა > -20) და (ტემპერატურა = 0) და (ტენიანობა <= 100)): cur = db.cursor () cur.ececute ("INSERT INTO glasshouse.sensordata (idx, ტემპერატურა, ტენიანობა, დროის ნიშნული) ღირებულებები ("+str. (newrow)+","+str (ტემპერატურა)+","+str (ტენიანობა)+", %s)", (ფორმატირებული თარიღი)) 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" შემდეგი შინაარსით:

დაწყება გაშვების დონეზე [2345]

გაჩერება runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py

მეორე არის “/etc/systemd/system/multi-user.target.wants/glasshouse.service” შემდეგი შინაარსით:

[ერთეული]

აღწერა = სათბურის მონიტორინგის სერვისი შემდეგ = multi-user.target [სერვისი] ტიპი = მარტივი გადატვირთვა = ყოველთვის გადატვირთვაSec = 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, `ტენიანობა` 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); ფუნქცია drawChart () {var data = google.visualization.arrayToDataTable ([// ["დროის ნიშნული", "ტემპერატურა", "ტენიანობა", "სითბოს ინდექსი"], ["დროის ნიშნული", "ტემპერატურა", "ტენიანობა"], შეკითხვა ($ sql); # ამ დროს - მარყუჟის ფორმატში და ჩადეთ ყველა მოძიებული მონაცემი ['დროის ნიშნული', 'ტემპერატურა', 'ტენიანობა'] გზაში. ხოლო ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['ტენიანობა']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['ტემპერატურა']. ",". $ row ["ტენიანობა"]. ",". $ row ['heatindex ']. "],";}?>]); // Curved line var options = {title: 'Temperature and ტენიანობა', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // მრუდი დიაგრამა var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (მონაცემები, პარამეტრები); } // ფრჩხილის დასრულება drawChart– დან //

ნაბიჯი 6: 3D დაბეჭდილი საცხოვრებელი

საცხოვრებლისთვის მე გამოვიყენე ორი ცალკეული კორპუსი, ერთი ESP32-CAM და DHT22 ერთად და ერთი 18650 ბატარეის ფარისთვის.

ნაბიჯი 7: საბოლოო შედეგი

საბოლოო შედეგი!
საბოლოო შედეგი!
საბოლოო შედეგი!
საბოლოო შედეგი!
საბოლოო შედეგი!
საბოლოო შედეგი!
საბოლოო შედეგი!
საბოლოო შედეგი!

საბოლოო შედეგი ასევე ნაჩვენებია ზემოთ მოცემულ სურათებში.

და როდესაც ბატარეა ცარიელია, შეგიძლიათ დატენოთ მინი USB კაბელით.

გირჩევთ: