Оглавление:
- Запасы
- Шаг 1. Загрузите код Arduino в ESP32-CAM
- Шаг 2: Подключитесь
- Шаг 3: скрипт Python3
- Шаг 4: сервер MySQL
- Шаг 5: веб-сервер
- Шаг 6: корпус, напечатанный на 3D-принтере
- Шаг 7: Окончательный результат
Видео: Температура и влажность с использованием ESP32-DHT22-MQTT-MySQL-PHP: 7 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:50
Моя девушка хотела оранжерею, поэтому я построил ее. Но мне нужен был датчик температуры и влажности внутри теплицы. Итак, я поискал примеры в Google и начал экспериментировать.
Я пришел к выводу, что все примеры, которые я нашел, не совсем то, что я хотел построить. Я собрал много маленьких частей кода и объединил их. Мне потребовалось довольно много времени, чтобы закончить свою первую рабочую сборку, потому что документация по большинству примеров была слишком сложной для меня, или они предполагали часть, которую я должен знать ?? Но я ничего не знал (пока) ☹
Вот почему я делаю это поучительно. Учебник «от начала до конца» для понимания буквально каждого. (По крайней мере, я надеюсь?)
Как это работает …
Конечным продуктом является ESP32-CAM с прикрепленным к нему датчиком DHT22, который получает питание от батареи 18650. Каждые три минуты он считывает температуру и влажность и отправляет их по Wi-Fi на внешний сервер MQTT, а затем переходит в спящий режим (на три минуты), чтобы использовать как можно меньше батареи
На сервере Debian (который, я полагаю, также может быть raspberry pi) у меня есть python3, сервер MQTT, сервер MySQL и веб-сервер
Сценарий python3 работает как служба, и всякий раз, когда он получает сообщение MQTT, он подсчитывает предыдущее количество записей (номер индекса) и увеличивает его на единицу. Затем он считывает значения температуры и влажности из сообщения MQTT. Он проверяет ложные значения и, когда значения верны, отправляет значения вместе с новым номером индекса, текущей датой и временем на сервер MySQL
На веб-сервере есть сценарий PHP, который считывает значения с сервера MySQL и строит из них красивый график с помощью Google Charts. (пример)
Запасы
Я использовал следующие части:
- ESP32-CAM (я использовал версию cam, потому что на ней есть разъем для внешней антенны. Возможно, вы также можете использовать другие ESP32)
- Внешняя антенна
-
Датчик AM2302 DHT22 (у этого есть встроенный резистор, поэтому вам нужно всего три провода)
https://www.amazon.de/gp/product/B07CM2VLBK/ref=p…
- 18650 аккумулятор щит v3
- 18650 аккумулятор (NCR18650B)
- Старый кабель micro USB (для подключения ESP32 к экрану аккумулятора)
- Короткие перемычки
Дополнительно необходимо:
-
Разъем USB в TTL (рисунок)
https://www.amazon.de/FT232RL-Seriell-Unterst%C3%…
- Паяльник
- 3D-принтер (нужен только для корпуса)
Шаг 1. Загрузите код Arduino в ESP32-CAM
Итак, приступим!
Чтобы загрузить код Arduino в ESP32-CAM, вам необходимо подключить разъем USBtoTTL к ESP32, используя схемы выше.
Код Arduino:
/ * Небольшая программа для считывания температуры и влажности с датчика DHT22 и
передать его в MQTT. Б. Дуйнхауэр, 8 июня 2020 г. * / #include #include #include #define wifi_ssid "*** WIFI_SSID ***" // Wi-Fi ssid #define wifi_password "*** WIFI_PASSWORD ***" // пароль Wi-Fi #define mqtt_server "*** SERVER_NAME ***" // имя сервера или IP-адрес #define mqtt_user "*** MQTT_USER ***" // имя пользователя #define mqtt_password "*** MQTT_PASSWORD ***" // пароль #define topic "оранжерея / 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); символьные данные [80]; void setup () {Serial.begin (115200); setup_wifi (); // Подключаемся к сети Wifi client.setServer (mqtt_server, 1883); // Настраиваем MQTT-соединение, при необходимости меняем порт. если (! client.connected ()) {reconnect (); } // ЧТЕНИЕ ДАННЫХ int chk = DHT.read22 (DHT22_PIN); float t = DHT. температура; float h = DHT. влажность; String dhtReadings = "{" температура / ": \" "+ String (t) +" / ", \" влажность / ": \" "+ String (h) +" / "}"; dhtReadings.toCharArray (данные, (dhtReadings.length () + 1)); если (отладка) {Serial.print ("Температура:"); Serial.print (t); Serial.print ("| Влажность:"); Serial.println (h); } // Публикуем значения в темах MQTT client.publish (topic, data); // Публикуем показания по теме (glasshouse / dhtreadings) if (debug) {Serial.println ("Показания отправлены в MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // засыпаем Serial.println ("Настроить ESP32 на спящий режим для каждого" + String (TIME_TO_SLEEP) + "Seconds"); Serial.println ("Сейчас засыпаю как обычно."); esp_deep_sleep_start (); } // Настраиваем подключение к Wi-Fi void setup_wifi () {delay (20); Serial.println (); Serial.print («Подключение к»); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); в то время как (WiFi.status ()! = WL_CONNECTED) {задержка (100); Serial.print ("."); } Serial.println (""); Serial.println («WiFi в порядке»); Serial.print ("=> Новый IP-адрес ESP32:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Повторно подключаемся к Wi-Fi, если соединение потеряно void reconnect () {while (! Client.connected ()) {Serial.print ("Подключение к брокеру MQTT…"); если (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("ОК"); } 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 г. # # version: 1.0 # # import paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb from datetime import datetime db = MySQLdb.connect ("localhost", "glasshouse", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" # Порт адреса брокера = 1883 # Порт брокера user = "** * MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** "#Connection password def on_connect (client, userdata, flags, rc): # Обратный вызов, когда клиент подключается к брокеру print (" Connected с кодом результата {0} ". format (str (rc))) # Распечатать результат попытки подключения client.subscribe (" glasshouse / dhtreadings / # ") def on_message (client, userdata, msg): # Обратный вызов, когда Сообщение PUBLISH получено с сервера. cursor.execute ("выбрать * из сенсорных данных") numrows = int (cursor.rowcount) newrow = numrows + 1 now = 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 ["temperature"]) влажность = float (payload ["влажность"]) print ("Temperature:" + str (температура)) print ("Humidity:" + str (влажность)) print ("DateTime:" + str (formatted_date)) if ((temperature > -20) и (температура = 0) и (влажность <= 100)): cur = db.cursor () cur.execute ("ВСТАВИТЬ INTO glasshouse.sensordata (idx, температура, влажность, временная метка) VALUES (" + str (newrow) + "," + str (температура) + "," + str (влажность) + ",% s)", (formatted_date)) db.commit () print ("данные получены и импортированы в MySQL") иначе: print ("данные превышают пределы и НЕ импортируются в 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 # Определить функцию обратного вызова для получения сообщения 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 [Служба] Тип = простой Restart = всегда RestartSec = 1 ExecStart = / usr / bin / python3 /root/scripts/glasshouse/glasshouse.py [Установить] WantedBy = многопользовательский.цель
Вы можете запустить это как службу, используя следующую команду:
systemctl включить теплицу
и запустите его, используя:
systemctl start теплица
Шаг 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); function drawChart () {var data = google.visualization.arrayToDataTable ([// [«Отметка времени», «Температура», «Влажность», «Индекс тепла»], [«Отметка времени», «Температура», «Влажность»], query ($ sql); # Этот цикл while форматирует и помещает все полученные данные в способ ['timestamp', 'temperature', 'влажность']. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["отметка времени"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['температура']. ",". $ row ['влажность']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['temperature']. ",". $ row ['влажность']. ",". $ row ['heatindex ']. "],";}?>]); // Изогнутая линия var options = {title: 'Температура и влажность', 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: Окончательный результат
Окончательный результат также показан на картинках выше.
А когда аккумулятор разряжен, вы можете зарядить его с помощью кабеля mini-USB.
Рекомендуемые:
Автоматизация теплицы с помощью LoRa! (Часть 1) -- Датчики (температура, влажность, влажность почвы): 5 шагов
Автоматизация теплицы с помощью LoRa! (Часть 1) || Датчики (температура, влажность, влажность почвы): в этом проекте я покажу вам, как я автоматизировал теплицу. Это означает, что я покажу вам, как я построил теплицу и как я подключил силовую и автоматическую электронику. Также я покажу вам, как программировать плату Arduino, которая использует L
Метеостанция Arduino с использованием BMP280-DHT11 - температура, влажность и давление: 8 шагов
Метеостанция Arduino с использованием BMP280-DHT11 - Температура, влажность и давление: в этом уроке мы узнаем, как создать метеостанцию, которая будет отображать ТЕМПЕРАТУРУ, ВЛАЖНОСТЬ И ДАВЛЕНИЕ на ЖК-дисплее TFT 7735Посмотрите демонстрационное видео
THINGSPEAK ТЕМПЕРАТУРА И ВЛАЖНОСТЬ ПРИЛОЖЕНИЕ, ИСПОЛЬЗУЯ ESP8266: 9 шагов
THINGSPEAK ТЕМПЕРАТУРА И ВЛАЖНОСТЬ ПРИЛОЖЕНИЕ С ИСПОЛЬЗОВАНИЕМ ESP8266: Когда я возился со своими электронными устройствами, у меня возникла идея сделать веб-приложение для погоды. Это веб-приложение использует датчик SHT31 для получения данных о температуре и влажности в реальном времени. Мы развернули наш проект на WiFi-модуле ESP8266. Онлайн или офли
Esp32-Ubidots-Wireless-Long-Range Температура и влажность: 6 шагов
Esp32-Ubidots-Wireless-long-range Температура и влажность: в этом руководстве мы будем измерять различные данные о температуре и влажности с помощью датчика температуры и влажности. Вы также узнаете, как отправить эти данные в Ubidots. Чтобы вы могли анализировать его из любого места для разных приложений
ThingSpeak, ESP32 и температура и влажность беспроводного соединения на большом расстоянии: 5 шагов
ThingSpeak, ESP32 и температура и влажность в беспроводной сети дальнего действия: в этом руководстве мы будем измерять различные данные о температуре и влажности с помощью датчика температуры и влажности. Вы также узнаете, как отправить эти данные в ThingSpeak. Чтобы вы могли анализировать его из любого места для разных приложений