Мазмуну:

Температура жана нымдуулук 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: 8-класс.Диффузия кубулушу.Жылуулук жана температура.Температуралык шкалалар.Термометрлер. 2024, Июль
Anonim
Температура жана нымдуулук ESP32-DHT22-MQTT-MySQL-PHP колдонуу
Температура жана нымдуулук ESP32-DHT22-MQTT-MySQL-PHP колдонуу

Менин сүйлөшкөн кызым теплица алууну каалагандыктан, мен аны жасап бердим. Бирок мен теплицанын ичиндеги температура жана нымдуулук сенсорун кааладым. Ошентип, мен мисалдар үчүн googled жана эксперимент баштадым.

Менин тыянагым, мен тапкан бардык мисалдар так мен кургум келген жок. Мен коддун көптөгөн кичинекей бөлүктөрүн кармап, аларды бириктирдим. Биринчи жумушту бүтүрүү үчүн мага бир топ убакыт керек болду, анткени көпчүлүк мисалдардын документтерин түшүнүү мен үчүн өтө кыйын болгон же алар мен билишим керек деп ойлошконбу? Бирок мен эч нерсени билбедим (азырынча) ☹

Ошондуктан мен муну инструктивдүү кылып түздүм. Баарына түшүнүү үчүн "башынан аягына чейин" окуу куралы. (Жок дегенде үмүттөнөм?)

Бул кантип иштейт …

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

Debian серверинде, (бул да малина пи болушу мүмкүн) менде 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*/ #кошуу #кошуу #кошуу #wifi_ssid "*** WIFI_SSID ***" // wifi ssid #wifi_password "*** WIFI_PASSWORD ***" // wifi сырсөзү #define mqtt_server "*** SERVER_NAME ***" // сервердин аты же IP #define 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 debug = true; // Дисплей журналынын билдирүүсү эгер 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 (); } // REAT DATA int chk = DHT.read22 (DHT22_PIN); float t = DHT.temperature; float h = DHT. humidity; String dhtReadings = "{" температурасы / ": \" " + Сап (t) +" / ", \" нымдуулук / ": \" " + Сап (h) +" / "}"; dhtReadings.toCharArray (маалыматтар, (dhtReadings.length () + 1)); if (debug) {Serial.print ("Температура:"); Serial.print (t); Serial.print ("| Нымдуулук:"); Serial.println (h); } // MQTT темаларына баалуулуктарды жарыялоо client.publish (тема, маалыматтар); // Тема боюнча окууларды жарыялоо (glasshouse/dhtreadings) if (debug) {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га кайра туташыңыз void reconnect () {while (! Client.connected ()) {Serial.print ("MQTT брокерине туташууда…"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Error] Туташкан жок:"); Serial.print (client.state ()); Serial.println ("Кайталоо үчүн 5 секунд күтө туруңуз."); кечигүү (5000); }}} void loop () {}

Жана дагы, ишеним грамоталарын өздүк грамоталарыңыз менен алмаштырууну унутпаңыз

2 -кадам: Wire Up

Wire Up!
Wire Up!

Кубат үчүн, мен эски USB кабелин колдондум, анын USB-A туташтыргычын үзүп салдым. USB кабелинде төрт зым бар, бизге кара жана кызыл гана керек.

Ошентип, бардыгын жогорудагы график боюнча туташтырыңыз.

3 -кадам: Python3 Script

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 username password =" *** MQTT_PASSWORD *** " #Connection password on on_connect (client, userdata, flags, rc): #Кардар брокерге басылганда кайра чалуу (" Туташкан натыйжа коду менен {0} ". формат (str (rc))) # Байланыш аракетинин натыйжасы басып чыгаруу client.subscribe (" glasshouse/dhtreadings/ # ") def on_message (client, userdata, msg): # Кайсы убакта кайра чалуу PUBLISH билдирүүсү серверден алынды. cursor.execute ("sensordata дан тандоо") numrows = int (cursor.rowcount) newrow = numrows + 1 азыр = datetime.now () formatted_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 ["температура]) нымдуулук = float (payload ["нымдуулук"]) print ("Температура:"+str (температура)) print ("Нымдуулук:"+str (нымдуулук)) print ("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 (user, password = password) client.on_connect = on_connect үчүн client.on_message = on_message ийгиликтүү байланыш

MySQL колдонуучунун атын жана сырсөзүн жана MQTT колдонуучунун атын жана сырсөзүн өздүк грамотаңызга алмаштырууну унутпаңыз

Сиз эки файлды түзүү менен сценарийди кызмат катары иштете аласыз.

Биринчиси, "/etc/init/glasshouse.conf" төмөнкүдөй мазмунду камтыйт:

чуркоо деңгээлинен баштоо [2345]

Run деңгээлинде токтотуу [! 2345] exec /root/scripts/glasshouse/glasshouse.py

Экинчиси-"/etc/systemd/system/multi-user.target.wants/glasshouse.service" төмөнкү мазмундагы:

[Бирдик]

Description = Glasshouse Мониторинг кызматы Кийин = multi-user.target [Кызмат] Түрү = жөнөкөй Кайра баштоо = дайыма RestartSec = 1 ExecStart =/usr/bin/python3 /root/scripts/glasshouse/glasshouse.py [Орнотуу] WantedBy = көп колдонуучу.target

Сиз бул буйрукту төмөнкү кызмат катары иштете аласыз:

systemctl glasshouse иштетет

жана аны колдонуп баштаңыз:

systemctl glasshouse баштоо

4 -кадам: MySQL Server

Сиз жаңы MySQL маалымат базасын түзүшүңүз керек, анын ичинде бир гана стол бар.

Таблицаны түзүү коду:

TABLE CREATE `sensordata` (`idx` int (11) DEFAULT NULL,` temperature` float DEFAULT NULL, `moist`` float DEFAULT NULL,` timestamp` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;

5 -кадам: Webserver

Веб -серверде эки файл бар, 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 ([// ['Убакыт белгиси', 'Температура', 'Нымдуулук', 'Жылуулук индекси'], ['Убакыт белгиси', 'Температура', 'Нымдуулук'], query ($ sql); # This while - цикл форматтары жана алынган бардык маалыматтарды ['убакыт белгиси', 'температура', 'нымдуулук'] жолуна коюу. 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 ']. "],";}?>]); // Ийри сызык var options = {аталышы: 'Температура жана нымдуулук', curveType: 'функция', легенда: {позиция: 'асты'}, hAxis: {slantedText: чын, slantedTextAngle: 45}}; // Ийри диаграмма var chart = new google.visualization. LineChart (document.getElementById ('curve_chart'))); chart.draw (маалыматтар, параметрлер); } // DrawChartтан кронштейнди бүтүрүү //

6 -кадам: 3D басылган турак жай

Турак жай үчүн мен эки башка корпусту колдондум, бири ESP32-CAM жана DHT22 үчүн, экинчиси 18650 батарея калканы үчүн.

7 -кадам: Акыркы жыйынтык

Акыркы жыйынтык!
Акыркы жыйынтык!
Акыркы жыйынтык!
Акыркы жыйынтык!
Акыркы жыйынтык!
Акыркы жыйынтык!
Акыркы жыйынтык!
Акыркы жыйынтык!

Акыркы жыйынтык дагы жогорудагы сүрөттөрдө көрсөтүлгөн.

Батарея бош болгондо, аны кичинекей USB кабели менен кубаттай аласыз.

Сунушталууда: