В этой статье мы соединим датчик влажности и температуры SHT31 с платой ESP32. Таким образом, используя ESP32 и SHT31, мы создадим асинхронный веб-сервер и отобразим значение температуры и влажности на веб-странице. Веб-сервер, который мы создадим, будет автоматически обновлять показания без необходимости обновления веб-страницы.
Существуют различные датчики влажности и температуры, такие как DHT11 и HTU21D. Но если говорить о точности, ни один из них не подходит для промышленного контроля температуры и влажности из-за точности и прецизионности. У них сравнительно низкие точность и чувствительность. Поэтому здесь мы будем использовать датчик температуры и влажности SHT31. Это самые точные и высокоточные устройства, которые вы можете получить. Это цифровой датчик с интерфейсом I2C, который обеспечивает легкое считывание влажности и температуры. Датчик SHT31 имеет превосходную точность измерения относительной влажности ±2% и температуры ±0,3°C для большинства применений.
В этом проекте мы соединим датчик температуры и влажности SHT31 с модулем ESP32. Мы узнаем, как считывать значения влажности и температуры с помощью SHT31 и ESP32 . Мы также создадим асинхронный веб-сервер ESP32, используя библиотеку ESPAsyncWebServer с SHT31, который отображает температуру и влажность с помощью Arduino IDE . Веб-сервер, который мы создадим, автоматически обновляет показания без необходимости обновления веб-страницы.
Ранее на нашем сайте мы рассматривали подключение датчика SHT31 к плате Arduino.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Датчик влажности и температуры SHT31 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик влажности и температуры SHT31
SHT31 — это следующее поколение датчиков температуры и влажности Sensirion. SHT31 обладает улучшенными характеристиками интеллекта, надежности и точности по сравнению со своим предшественником. Его функциональность включает улучшенную обработку сигнала, температуру и влажность, которые можно считывать с помощью связи по интерфейсу I2C. Этот мини-модуль I2C упрощает считывание температуры и влажности с помощью модуля интерфейса Particle, который предоставляет доступ к облаку из любой точки мира.
Все мини-модули I2C рассчитаны на работу при напряжении 5 В постоянного тока. Используя удобный 4-контактный разъем, устройства можно последовательно подключать к шине I2C, устраняя необходимость в пайке. Просто подключите вместе устройства, необходимые для вашего следующего приложения автоматизации.
Характеристики датчика SHT31
1. Датчик температуры и влажности двойного назначения.
2. Точность относительной влажности ±2%.
3. Диапазон измерения влажности 0–100%.
4. Рабочая температура от -40 до +125 °C (от -40 до +257 °F).
5. Время отклика датчика 8 секунд.
6. Начальный адрес 0x44.
7. Модульная коммутационная плата SHT31.
Схема проекта
Схема подключения датчика влажности и температуры SHT31 к модулю ESP32 представлена на следующем рисунке.
Подключите вывод VCC датчика SHT31 к контакту 3,3 В ESP32, а GND датчика - к GND модуля. Подключите выводы SCL и SDA SHT31 к выводам SCL (GPIO22) и SDA (GPIO21) ESP32 соответственно, как показано на рисунке выше.
Асинхронный веб-сервер
Для создания веб-сервера мы будем использовать библиотеку ESPAsyncWebServer, которая обеспечивает простой способ создания асинхронного веб-сервера. Создание асинхронного веб-сервера имеет несколько преимуществ, как указано ниже:
1. Обработка более одного соединения одновременно.
2. Когда вы отправляете ответ, вы немедленно готовы обрабатывать другие соединения, в то время как сервер занимается отправкой ответа в фоновом режиме.
3. Простой механизм обработки шаблонов для обработки шаблонов.
4. И многое другое.
Исходный код программы
Исходный код для веб-сервера на ESP32 и SHT31 приведен ниже. Вы можете скопировать этот код и загрузить его на плату ESP32. Но перед этим вам понадобятся несколько библиотек. Поэтому загрузите библиотеки по ссылкам ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
#include "WiFi.h" #include "ESPAsyncWebServer.h" #include <Arduino.h> #include <Wire.h> #include "Adafruit_SHT31.h" // Replace with your network credentials const char* ssid = "BYNARK"; const char* password = "bynark@123"; Adafruit_SHT31 sht31 = Adafruit_SHT31(); // Create AsyncWebServer object on port 80 AsyncWebServer server(80); String readSHT31Temperature(){ float t = sht31.readTemperature(); if (! sht31.begin(0x44)) // Set to 0x45 for alternate i2c addr { Serial.println("SHT31 test"); while (1) delay(1); } if (isnan(t)) { Serial.println("Failed to read temperature!"); return "--"; } else { Serial.print(""); Serial.print("Temperature: "); Serial.println(t); return String(t); } } String readSHT31Humidity() { float h = sht31.readHumidity(); if (isnan(h)) { Serial.println("Failed to read Humidity!"); return "--"; } else { Serial.print("Humidity: "); Serial.println(h); Serial.println(""); return String(h); } } const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML><html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> <style> html { font-family: Arial; display: inline-block; margin: 0px auto; text-align: center; } h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; } .sht31-labels{ font-size: 1.5rem; vertical-align:middle; padding-bottom: 15px; } </style> </head> <body> <h2>ESP32 SHT31 Web Server</h2> <p> <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> <span class="sht31-labels">Temperature</span> <span id="temperature">%TEMPERATURE%</span> <sup class="units">°C</sup> </p> <p> <i class="fas fa-tint" style="color:#00add6;"></i> <span class="sht31-labels">Humidity</span> <span id="humidity">%HUMIDITY%</span> <sup class="units">%</sup> </p> </body> <script> setInterval(function ( ) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("temperature").innerHTML = this.responseText; } }; xhttp.open("GET", "/temperature", true); xhttp.send(); }, 10000 ) ; setInterval(function ( ) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("humidity").innerHTML = this.responseText; } }; xhttp.open("GET", "/humidity", true); xhttp.send(); }, 10000 ) ; </script> </html>)rawliteral"; // Replaces placeholder with sht31 values String processor(const String& var){ //Serial.println(var); if(var == "TEMPERATURE"){ return readSHT31Temperature(); } else if(var == "HUMIDITY"){ return readSHT31Humidity(); } return String(); } void setup(){ // Serial port for debugging purposes Serial.begin(115200); // Connect to Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); } // Print ESP32 Local IP Address Serial.println(WiFi.localIP()); // Route for root / web page server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html, processor); }); server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", readSHT31Temperature().c_str()); }); server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", readSHT31Humidity().c_str()); }); // Start server server.begin(); } void loop(){ } |
Демонстрация работы веб-сервера на ESP32 и SHT31
После загрузки откройте последовательный монитор на скорости 115200 бод. Нажмите кнопку сброса ESP32. IP-адрес ESP32 должен быть напечатан в последовательном мониторе вместе со значением влажности и температуры.
Теперь скопируйте IP-адрес, а затем откройте браузер и введите IP-адрес ESP32. Ваш веб-сервер должен отображать последние показания датчика. Вы заметите, что показания температуры и влажности обновляются автоматически без необходимости обновления веб-страницы.