Мазмұны:

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 көмегімен температура мен ылғалдылық

Менің дос қызым глазхана алғысы келді, сондықтан мен оны жасадым. Бірақ мен жылыжайдың ішіндегі температура мен ылғалдылық сенсорын алғым келді. Сонымен, мен мысалдар іздеп, тәжірибе жасай бастадым.

Менің ойымша, мен тапқан барлық мысалдар дәл мен салғым келген нәрсе емес. Мен кодтың көптеген кішкене бөліктерін алып, оларды біріктірдім. Менің алғашқы жұмысымды аяқтау үшін маған біраз уақыт қажет болды, себебі көптеген мысалдардың құжаттамасын түсіну маған тым қиын болды немесе олар менің білуім керек деп ойлады ма? Бірақ мен әлі ештеңе білмедім

Сондықтан мен бұл нұсқаулықты құрдым. Барлығына түсінуге болатын «басынан аяғына дейін» оқулық. (Кем дегенде үміттенемін?)

Бұл қалай жұмыс істейді …

Соңғы өнім-бұл ESP32-CAM, оған DHT22 датчигі бекітілген, ол 18650 батареясынан қуат алады. Ол әр үш минут сайын температура мен ылғалдылықты оқиды және WiFi арқылы сыртқы MQTT серверіне жібереді, содан кейін қажет болғанша батареяны аз пайдалану үшін ұйқыға кетеді (үш минутқа)

Debian серверінде (менің ойымша, бұл таңқурай 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
  • 18650 батарея (NCR18650B)
  • Ескі микро USB кабелі (ESP32 батарея қалқанына қосу үшін)
  • Кейбір қысқа секіргіш сымдар

Қосымша қажет:

  • USB - 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 ж.*/ #Include #include #include #define wifi_ssid «*** WIFI_SSID ***» // wifi ssid #wifi_password «*** WIFI_PASSWORD ***» анықтаңыз // wifi құпия сөзі #mqtt_server анықтаңыз «*** SERVER_NAME ***» // сервер атауы немесе IP #deqine mqtt_user «*** MQTT_USER ***» // пайдаланушы аты #define mqtt_password «*** MQTT_PASSWORD ***» // пароль #тақырыпты анықтау «glasshouse /dhtreadings «#define debug_topic» glasshouse /debug «// Отладкаға арналған тақырып /* терең ұйқының анықтамалары* /#define uS_TO_S_FACTOR 1000000 /* Микро секундқа түрлендіру коэффициенті* /#define TIME_TO_SLEEP 180 /* Уақыт ESP32 ұйықтайды. 5 минут ішінде (секундтарда) */ bool отладка = ақиқат; // Журнал хабарын көрсету, егер 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 ()) {reconnect (); } // ДЕРЕКТЕРДІ ОҚУ int chk = DHT.read22 (DHT22_PIN); float t = DHT.температурасы; float h = DHT. ылғалдылық; DhtReadings жолы = «{» температура / «: \» « + Жол (t) +» / «, \» ылғалдылық / «: \» « + Жол (h) +» / «}»; dhtReadings.toCharArray (деректер, (dhtReadings.length () + 1)); if (отладка) {Serial.print («Температура:»); Serial.print (t); Serial.print («| Ылғалдылық:»); Serial.println (h); } // MQTT тақырыптарына мәндерді жариялау client.publish (тақырып, деректер); // Тақырып бойынша оқуларды жариялау (glasshouse/dhtreadings) if (отладка) {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) {кешігу (100); Serial.print («.»); } Serial.println («»); Serial.println («WiFi жақсы»); Serial.print («=> ESP32 жаңа IP мекенжайы:»); Serial.print (WiFi.localIP ()); Serial.println («»); } // Егер байланыс үзілсе, Wi -Fi желісіне қайта қосылыңыз. Қайта қосылыңыз () {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 қолдандым. Python сценарийінің мазмұны:

# Python3 сценарийі MQTT -ге қосылуға, мәндерді оқуға және оларды MySQL -ге жазуға арналған

# # B. Duijnhouwer # 8 маусым, 2020 жыл # # нұсқа: 1.0 # # импорт paho.mqtt.client mqtt импорт json импорт pymysql pymysql.install_as_MySQLdb () импорт MySQLdb datetime импорт datetime db = MySQLdb.connect («localhost», «Glasshouse», «*** MYSQL_USERNAME ***», «*** MYSQL_PASSWORD ***») курсор = db.cursor () broker_address = «localhost» #Брокер адресінің порты = 1883 #Брокер портының пайдаланушысы = «** *MQTT_USERNAME *** «#Connection пайдаланушы аты құпия сөзі =» *** MQTT_PASSWORD *** « #Байланыс құпия сөзі_коннектінде (клиент, пайдаланушы деректері, жалаушалар, rc): #Клиент брокерге қосылған кезде кері байланыс (» Қосылған нәтиже кодымен {0} «. формат (str (rc))) # Қосылу әрекетінің нәтижесін басып шығару client.subscribe (» glasshouse/dhtreadings/ # «) def on_message (клиент, пайдаланушы деректері, хабар): # PUBLISH хабарламасы серверден алынады. cursor.execute («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 (форматталған_күн)) if ((температура) > -20) және (температура = 0) және (ылғалдылық <= 100)): cur = db.cursor () cur.execute («INSERT INTO glasshouse.sensordata (idx, температура, ылғалдылық, уақыт белгісі) VALUES (»+str) (newrow)+«,»+str (температура)+«,»+str (ылғалдылық)+«, %s)», (форматталған_күн)) db.commit () басып шығару («MySQL -те алынған және импортталған деректер») басқа: басып шығару («деректер шегінен асып кетті және MySQL-де импортталмайды») client = mqtt. Client («duijnhouwer-com-glasshouse-script») client.username_pw_set (пайдаланушы, құпия сөз = пароль) client.on_connect = on_connect # Қайта қоңырау шалу функциясын анықтау үшін client.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”.

[Бірлік]

Сипаттама = Glasshouse бақылау қызметі кейін = multi-user.target [Қызмет] Түрі = қарапайым Қайта бастау = әрқашан RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Орнату] WantedBy = көп қолданушы.мақсат

Сіз бұл пәрменді қызмет ретінде іске қосуға болады:

systemctl Glasshouse қосады

және оны пайдаланып бастаңыз:

systemctl glasshouse іске қосыңыз

4 -қадам: MySQL сервері

Сізде тек бір кесте бар жаңа MySQL мәліметтер базасын құру қажет.

Кестені құрудың коды:

КЕСТЕ ЖАСАУ `sensordata` (`idx` int (11) DEFAULT NULL,` temperatur` 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); # Бұл уақыт - цикл пішімдейді және барлық алынған деректерді ['уақыт белгісі', 'температура', 'ылғалдылық'] әдісіне қояды. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row [«timestamp»], 10, 6); echo «['». $ timestamp_rest. «',». $ row ['температура']. «,». $ қатар ['ылғалдылық']. «],»; // echo «['». $ timestamp_rest. «',». $ row ['temperature']. «,». $ row ['ылғалдылық']. «,». $ row ['heatindex ']. «],»;}?>]); // қисық сызық var options = {тақырып: 'Температура мен ылғалдылық', curveType: 'функция', белгі: {позиция: 'төменгі'}, 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 кабелімен зарядтауға болады.

Ұсынылған: