Съдържание:

Температура и влажност с помощта на ESP32-DHT22-MQTT-MySQL-PHP: 7 стъпки
Температура и влажност с помощта на ESP32-DHT22-MQTT-MySQL-PHP: 7 стъпки

Видео: Температура и влажност с помощта на ESP32-DHT22-MQTT-MySQL-PHP: 7 стъпки

Видео: Температура и влажност с помощта на ESP32-DHT22-MQTT-MySQL-PHP: 7 стъпки
Видео: Zigbee датчик освещенности, температуры и влажности с экраном на электронных чернилах Moes 2024, Юли
Anonim
Температура и влажност с помощта на ESP32-DHT22-MQTT-MySQL-PHP
Температура и влажност с помощта на ESP32-DHT22-MQTT-MySQL-PHP

Приятелката ми искаше оранжерия, затова я направих. Но аз исках датчик за температура и влажност в оранжерията. И така, потърсих в Google за примери и започнах да експериментирам.

Моят извод беше, че всички примери, които намерих, не бяха точно това, което исках да изградя. Взех много малки части от кода и ги комбинирах. Отне ми доста време, за да завърша първата си работна компилация, защото документацията на повечето примери беше твърде трудна за разбиране или те предположиха част, която трябва да знам ?? Но нищо не знаех (все още) ☹

Ето защо изграждам тази инструкция. Урок „от началото до края“, който буквално всеки ще разбере. (Поне се надявам?)

Как работи …

Крайният продукт е 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%…

  • Поялник
  • 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 #define wifi_password "*** WIFI_PASSWORD ***" // парола за wifi #дефинирайте mqtt_server "*** SERVER_NAME ***" // име на сървъра или IP #дефинирайте mqtt_user "*** MQTT_USER ***" // потребителско име #дефинирайте mqtt_password "*** MQTT_PASSWORD ***" // парола #дефинирайте тема "оранжерия /dhtreadings "#define debug_topic" оранжерия /отстраняване на грешки "// Тема за отстраняване на грешки /* дефиниции за дълбок сън* /#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); char данни [80]; void setup () {Serial.begin (115200); setup_wifi (); // Свържете се с клиент на Wifi мрежа.setServer (mqtt_server, 1883); // Конфигуриране на MQTT връзка, промяна на порта, ако е необходимо. if (! client.connected ()) {повторно свързване (); } // ПРОЧЕТЕТЕ ДАННИ int chk = DHT.read22 (DHT22_PIN); поплавък t = DHT.температура; поплавък h = DHT.влажност; String dhtReadings = "{" temperature / ": \" " + String (t) +" / ", \" влажност / ": \" " + String (h) +" / "}"; dhtReadings.toCharArray (данни, (dhtReadings.length () + 1)); if (отстраняване на грешки) {Serial.print ("Температура:"); Serial.print (t); Serial.print ("| Влажност:"); Serial.println (h); } // Публикуване на стойности в MQTT теми client.publish (тема, данни); // Публикуване на четения по темата (оранжерия/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 (""); } // Повторно свързване с wifi, ако връзката се загуби. 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 за този скрипт. Съдържанието на скрипта на python е:

# Python3 скрипт за свързване към MQTT, четене на стойности и записване в MySQL

# # B. Duijnhouwer #, 8 юни 2020 г. # # версия: 1.0 # # import paho.mqtt.client като mqtt import json import pymysql pymysql.install_as_MySQLdb () импортиране на MySQLdb от datetime внос datetime db = MySQLdb.connect ("localhost", "оранжерия", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") курсор = db.cursor () broker_address = "localhost" #Broker адрес порт = 1883 #Broker порт потребител = "** *MQTT_USERNAME *** " #парола за потребителско име за връзка =" *** MQTT_PASSWORD *** " #Парола за връзка def on_connect (клиент, потребителски данни, флагове, rc): #Обратното повикване, когато клиентът се свърже с брокера печат (" Свързан с код на резултат {0} ". format (str (rc))) # Отпечатайте резултата от опит за връзка client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # Обратното повикване, когато a Публикувано съобщение се получава от сървъра. cursor.execute ("select * from 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 ')) print ("Нов ред:"+str (newrow)) температура = поплавък (полезен товар ["температура"]) влажност = float (полезен товар ["влажност"]) print ("Температура:"+str (температура)) print ("Влажност:"+str (влажност)) print ("DateTime:"+str (formatted_date)) if ((температура > -20) и (температура = 0) и (влажност <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, температура, влажност, времева маркировка) VALUES ("+str (newrow)+","+str (температура)+","+str (влажност)+", %s)", (formatted_date)) db.commit () print ("данни получени и импортирани в MySQL") else: 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]

спрете на ниво ниво [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Вторият е „/etc/systemd/system/multi-user.target.wants/glasshouse.service със следното съдържание:

[Мерна единица]

Описание = Услуга за наблюдение на Glasshouse 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 старт оранжерия

Стъпка 4: MySQL сървър

Трябва да създадете нова MySQL база данни само с една таблица в нея.

Кодът за създаване на таблицата е:

CREATE TABLE `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 = "оранжерия" 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); функция drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], query ($ sql); # This while - цикъл форматира и поставя всички извлечени данни в ['timestamp', 'temperature', 'влажност'] начин. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['влажност']. "],"; // ехо "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['влажност']. ",". $ row ['heatindex ']. "],";}?>]); // Опции за извита линия = {title: 'Температура и влажност', curveType: 'function', легенда: {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 кабел.

Препоръчано: