Talaan ng mga Nilalaman:

Temperatura at Humidity Gamit ang ESP32-DHT22-MQTT-MySQL-PHP: 7 Mga Hakbang
Temperatura at Humidity Gamit ang ESP32-DHT22-MQTT-MySQL-PHP: 7 Mga Hakbang

Video: Temperatura at Humidity Gamit ang ESP32-DHT22-MQTT-MySQL-PHP: 7 Mga Hakbang

Video: Temperatura at Humidity Gamit ang ESP32-DHT22-MQTT-MySQL-PHP: 7 Mga Hakbang
Video: ANO ANG TAMANG HUMIDITY NG INCUBATOR/WHAT IS THE BEST HUMIDITY IN INCUBATING CHICKEN EGGS#incubator 2024, Nobyembre
Anonim
Temperatura at Humidity Gamit ang ESP32-DHT22-MQTT-MySQL-PHP
Temperatura at Humidity Gamit ang ESP32-DHT22-MQTT-MySQL-PHP

Gusto ng girlfriend ko ng isang glasshouse, kaya ginawa ko siya. Ngunit nais ko ang isang sensor ng temperatura at kahalumigmigan sa loob ng glasshouse. Kaya, nag-google ako para sa mga halimbawa at nagsimulang mag-eksperimento.

Ang aking konklusyon ay ang lahat ng mga halimbawa na nahanap ko ay hindi eksakto kung ano ang nais kong buuin. Kumuha ako ng maraming maliliit na bahagi ng code at pinagsama ang mga ito. Medyo natagalan ako upang matapos ang aking unang nagtatrabaho build dahil ang dokumentasyon ng karamihan sa mga halimbawa ay masyadong mahirap para sa akin na maunawaan o ipinalagay nila ang bahagi na dapat kong malaman ?? Ngunit wala akong alam (wala pa) ☹

Iyon ang dahilan kung bakit itinuturo ko ito. Isang tutorial na "simula-hanggang sa katapusan" para sa literal na maunawaan ng lahat. (Hindi bababa sa inaasahan ko?)

Paano ito gumagana …

Ang end-product ay isang ESP32-CAM na may DHT22 sensor na nakakabit dito na makakakuha ng lakas mula sa isang 18650 na baterya. Tuwing tatlong minuto binabasa nito ang temperatura at halumigmig at ipinapadala ito sa paglipas ng WiFi sa isang panlabas na server ng MQTT at pagkatapos ay matulog (para sa tatlong minuto) upang magamit ang mas kaunting baterya kung kinakailangan

Sa isang Debian server, (na maaaring maging isang raspberry pi hulaan ko) Mayroon akong python3, isang MQTT server, isang MySQL server at isang webserver

Ang script ng python3 ay tumatakbo bilang isang serbisyo at tuwing nakakatanggap ito ng isang mensahe ng MQTT, binibilang nito ang nakaraang bilang ng mga entry (numero ng index) at pinaparito ito ng isa. Pagkatapos ay binabasa nito ang mga halaga ng temperatura at halumigmig mula sa mensahe ng MQTT. Sinusuri nito ang mga maling halaga at tuwing wasto ang mga halaga, ipinapadala nito ang mga halaga kasama ang bagong numero ng index at ang kasalukuyang petsa at oras sa isang MySQL server

Ang webserver ay may isang PHP script na binabasa ang mga halaga mula sa MySQL server at gumagawa ng isang magandang grap mula rito gamit ang Google Charts. (halimbawa)

Mga gamit

Ang mga ginamit kong bahagi ay ang mga sumusunod:

  • ESP32-CAM (Ang dahilan kung bakit ginamit ko ang bersyon ng cam ay dahil mayroon itong panlabas na konektor ng antena dito. Marahil ay mayroon ding ibang mga ESP32 na maaari mong gamitin)
  • Panlabas na antena
  • AM2302 DHT22 sensor (Ang isang ito ay may built-in na risistor, kaya kailangan mo lamang ng tatlong mga wire)

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

  • 18650 kalasag ng baterya v3
  • 18650 na baterya (NCR18650B)
  • Lumang micro USB cable (para sa pagkonekta sa ESP32 sa kalasag ng baterya)
  • Ang ilang mga maiikling jumper wires

Kailangan ng labis:

  • Konektor ng USB sa TTL (larawan)

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

  • Panghinang
  • 3D printer (kailangan lang para sa case ng pabahay)

Hakbang 1: I-upload ang Arduino Code sa ESP32-CAM

I-upload ang Arduino Code sa ESP32-CAM
I-upload ang Arduino Code sa ESP32-CAM

Kaya't magsimula tayo!

Upang mai-upload ang Arduino code sa ESP32-CAM, kailangan mong ikonekta ang konektor ng USBtoTTL sa ESP32 gamit ang mga eskematiko sa itaas.

Ang Arduino code ay:

/ * Isang maliit na programa lamang upang basahin ang temperatura at halumigmig mula sa isang sensor na DHT22 at

ipasa ito sa MQTT. B. Duijnhouwer Hunyo, ika-8 ng 2020 * / # isama ang # isama ang # isama #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 "// Paksa para sa pag-debug / * mga kahulugan para sa deeps Sleep * / #define uS_TO_S_FACTOR 1000000 / * factor ng Conversion para sa mga segundo ng segundo hanggang segundo * / #define TIME_TO_SLEEP 180 / * Ang oras ng ESP32 ay makakatulog para sa 5 minuto (sa segundo) * / bool debug = totoo; // Ipakita ang mensahe sa pag-log kung Tama # tukuyin DHT22_PIN 14 dht DHT; WiFiClient espClient; PubSubClient client (espClient); data ng char [80]; void setup () {Serial.begin (115200); setup_wifi (); // Kumonekta sa Wifi network client.setServer (mqtt_server, 1883); // I-configure ang koneksyon sa MQTT, palitan ang port kung kinakailangan. kung (! client.connected ()) {muling magkonekta (); } // READ DATA int chk = DHT.read22 (DHT22_PIN); float t = DHT.temperature; float h = DHT.humidity; String dhtReadings = "{" temperatura / ": \" "+ String (t) +" / ", \" halumigmig / ": \" "+ String (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); kung (debug) {Serial.print ("Temperatura:"); Serial.print (t); Serial.print ("| Humidity:"); Serial.println (h); } // I-publish ang mga halaga sa mga paksa ng MQTT client.publish (paksa, data); // I-publish ang mga pagbasa sa paksa (glasshouse / dhtreadings) kung (debug) {Serial.println ("Ipinadala ang mga pagbasa sa MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // matulog Serial.println ("I-setup ang ESP32 upang matulog para sa bawat" + String (TIME_TO_SLEEP) + "Mga Segundo"); Serial.println ("Matutulog nang normal ngayon."); esp_deep_sleep_start (); } // Pag-setup ng koneksyon sa wifi void setup_wifi () {pagkaantala (20); Serial.println (); Serial.print ("Kumokonekta sa"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); habang (WiFi.status ()! = WL_CONNected) {pagkaantala (100); Serial.print ("."); } Serial.println (""); Serial.println ("OK ang WiFi"); Serial.print ("=> ESP32 bagong IP address ay:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Muling kumonekta sa wifi kung ang koneksyon ay nawala void reconnect () {habang (! Client.connected ()) {Serial.print ("Kumokonekta sa MQTT broker …"); kung (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } iba pa {Serial.print ("[Error] Hindi konektado:"); Serial.print (client.state ()); Serial.println ("Maghintay ng 5 segundo bago subukang muli."); pagkaantala (5000); }}} void loop () {}

At muli, huwag kalimutang palitan ang mga kredensyal sa iyong sariling mga kredensyal

Hakbang 2: Wire Up

Wire Up!
Wire Up!

Para sa lakas, gumamit ako ng isang lumang USB cable kung saan pinutol ko ang konektor ng USB-A. Mayroong apat na mga wire sa USB cable, kailangan lamang namin ang mga itim at pula.

Kaya, ikonekta ang lahat alinsunod sa iskedyul sa itaas.

Hakbang 3: Python3 Script

Ang script ng Python3 ay papunta sa isang lugar kung saan naa-access ito sa root user.

Gumamit ako ng /root/scripts/glasshouse/glasshouse.py para sa script na ito. Ang mga nilalaman ng python script ay:

# Python3 script upang kumonekta sa MQTT, basahin ang mga halaga at isulat ang mga ito sa MySQL

# # B. Duijnhouwer # Hunyo, ika-8 ng 2020 # # bersyon: 1.0 # # import paho.mqtt.client bilang mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb mula sa datime import datime 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): # Ang callback para kapag nag-uugnay ang client sa print ng broker (" Nakakonekta na may code ng resulta {0} ". format (str (rc))) # I-print ang resulta ng pagtatangka ng kliyente sa koneksyon.subscribe (" glasshouse / dhtreadings / # ") def on_message (client, userdata, msg): # Ang callback para sa kung kailan LARAP ng mensahe ay natanggap mula sa server. cursor.execut ("select * from sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datime.now () formatted_date = now.strftime ('% Y-% m-% d% H:% M:% S ') payload = json.loads (msg.payload.decode (' utf-8 ')) print ("New row:" + str (newrow)) temperatura = float (payload ["temperatura"]) halumigmig = float (payload ["halumigmig"]) print ("Temperatura:" + str (temperatura)) print ("Humidity:" + str (halumigmig)) print ("DateTime:" + str (formatted_date)) kung ((temperatura > -20) at (temperatura = 0) at (halumigmig <= 100)): cur = db.cursor () cur.execut ("INSERT INTO glasshouse.sensordata (idx, temperatura, halumigmig, timestamp) VALUES (" + str (newrow) + "," + str (temperatura) + "," + str (halumigmig) + ",% s)", (formatted_date)) db.commit () print ("natanggap at na-import na data sa MySQL") iba pa: print ("lumampas sa mga limitasyon ang data at HINDI na-import sa MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (user, password = password) client.on_connect = on_connect # Define callback function para sa matagumpay na koneksyon client.on_message = on_message # Tukuyin ang function ng callback para sa pagtanggap ng isang mensahe client.connect (broker_address, port = port) #nagkonekta sa broker client.loop_forever () # Simulan ang networking daemon

Huwag kalimutang palitan ang MySQL username at password at ang MQTT username at password sa iyong sariling mga kredensyal

Maaari mong patakbuhin ang script bilang isang serbisyo sa pamamagitan ng paglikha ng dalawang mga file.

Ang una ay ang "/etc/init/glasshouse.conf" na may mga sumusunod na nilalaman:

magsimula sa runlevel [2345]

huminto sa runlevel [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Ang pangalawang isa ay ang /etc/systemd/system/multi-user.target.wants/glasshouse.servicezonia kasama ang mga sumusunod na nilalaman:

[Yunit]

Paglalarawan = Serbisyo sa Pagsubaybay sa Glasshouse Pagkatapos = multi-user.target [Serbisyo] Uri = simpleng Restart = laging RestartSec = 1 ExecStart = / usr / bin / python3 /root/scripts/glasshouse/glasshouse.py [I-install] WantedBy = multi-user.target

Maaari mong patakbuhin ito bilang isang serbisyo gamit ang sumusunod na utos:

paganahin ng systemctl ang glasshouse

at simulang gamitin ito:

systemctl simulan ang glasshouse

Hakbang 4: MySQL Server

Kailangan mong lumikha ng isang bagong database ng MySQL na may isang talahanayan lamang dito.

Ang code para sa paglikha ng talahanayan ay:

GUMAWA NG TABLE `sensordata` (`idx` int (11) DEFAULT Null,` temperatura` float DEFAULT NULL, `halumigmig` float DEFAULT Null,` timestamp` datime DEFAULT Null) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Hakbang 5: Webserver

Ang webserver ay may dalawang mga file, ang index.php file at isang config.ini file

Ang mga nilalaman ng config.ini file ay:

[database]

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

Kung saan pinalitan mo ng offcourse ang *** DATABASE_USER *** at *** DATABASE_PASSWORD *** gamit ang iyong sariling mga kredensyal.

google.charts.load ('kasalukuyang', {'packages': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], query ($ sql); # Ito habang - loop format at ilagay ang lahat ng mga nakuhang data sa paraan ng '' timestamp ',' temperatura ',' halumigmig ']. habang ($ row = $ resulta-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['temperatura']. ",". $ row ['halumigmig']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['temperatura']. ",". $ row ['halumigmig']. ",". $ row ['heatindex ']. "],";}?>]); // Curved line var options = {title: 'Temperatura at halumigmig', curveType: 'function', legend: {posisyon: 'ilalim'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Curved chart var chart = bagong google.visualization. LineChart (document.getElementById ('curve_chart')); tsart.draw (data, mga pagpipilian); } // Tapusin ang bracket mula sa drawChart //

Hakbang 6: 3D Naka-print na Pabahay

Para sa pabahay, gumamit ako ng dalawang magkakahiwalay na bahay, isa para sa ESP32-CAM at DHT22 magkasama at isa para sa 18650 na kalasag ng baterya.

Hakbang 7: Ang Huling Resulta

Ang Huling Resulta!
Ang Huling Resulta!
Ang Huling Resulta!
Ang Huling Resulta!
Ang Huling Resulta!
Ang Huling Resulta!
Ang Huling Resulta!
Ang Huling Resulta!

Ang huling resulta ay ipinapakita rin sa mga larawan sa itaas.

At tuwing walang laman ang baterya, maaari mo itong singilin gamit ang isang mini USB cable.

Inirerekumendang: