Узнайте, как использовать ESP32 для создания метеорологической станции и веб-страницы для отслеживания ее результатов.
Что нам необходимо
В этом проекте мы собираемся создать метеостанцию, используя ESP32. Мы будем использовать датчики DHT22 и BMP180, а затем, используя ESP32, мы создадим веб-страницу, где мы покажем значения.
Нам для реализации проекта нужны:
1 - ESP32
1 - DHT22
1 - BMP180
1 - макетная плата
1 - провода-перемычки
Принципиальная схема
Прежде всего, подключите DHT22 к ESP32. Соединения для DHT22 с ESP32 следующие:
- Контакт 1 DHT22, который является контактом VCC, на 3,3 В от ESP32
- Контакт 2 DHT22, который является штырем данных к D15 ESP32
- Контакт 4 DHT22, который является контактом GND для GND ESP32
Затем подключите датчик давления BMP180 к ESP32. Соединения следующие:
- Vin от BMP180 на 3.3V ESP32
- GND BMP180 на GND ESP32
- SCL BMP180 на вывод 22 ESP32 (контакт 22 ESP32 является контактом SCL)
- SDA BMP180 на штырьковый разъем 21 ESP32 (контакт 21 ESP32 является выводом SDA)
Штыри 22 и 21 ESP32 предназначены для связи I2C.
Код проекта метеостанции
Код проекта можно скачать или скопировать ниже:
#include <WiFi.h> #include <Wire.h> #include <DHT.h> #include <Adafruit_BMP085.h> #define DHTPIN 15 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); Adafruit_BMP085 bmp; char pressure_value[4]; const char* wifi_name = "Tenda_31BC98"; //Your Wifi name const char* wifi_pass = "barcelona"; //Your Wifi password WiFiServer server(80); //Port 80 void setup() { Serial.begin(115200); dht.begin(); bmp.begin(); // Let's connect to wifi network Serial.print("Connecting to "); Serial.print(wifi_name); WiFi.begin(wifi_name, wifi_pass); //Connecting to wifi network while (WiFi.status() != WL_CONNECTED) //Waiting for the responce of wifi network { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Connection Successful"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); //Getting the IP address at which our webserver will be created Serial.println("Type the above IP address into a browser search bar"); server.begin(); //Starting the server } void loop() { String pressure = String(bmp.readPressure()); // convert the reading to a char array pressure.toCharArray(pressure_value, 4); float hum = dht.readHumidity(); float temp = dht.readTemperature(); float fah = dht.readTemperature(true); float heat_index = dht.computeHeatIndex(fah, hum); float heat_indexC = dht.convertFtoC(heat_index); WiFiClient client = server.available(); //Checking for incoming clients if (client) { Serial.println("new client"); String currentLine = ""; //Storing the incoming data in the string while (client.connected()) { if (client.available()) //if there is some client data available { char c = client.read(); // read a byte if (c == '\n') // check for newline character, { if (currentLine.length() == 0) //if line is blank it means its the end of the client HTTP request { client.print("<html><title> ESP32 Weather Station</title></html>"); client.print("<body bgcolor=\"#E6E6FA\"><h1 style=\"text-align: center; color: blue\"> ESP32 Weather Station </h1>"); client.print("<p style=\"text-align: center; font-size:150% \">Temperature in C: "); client.print(temp); client.print("<br/>Temperature in fah: "); client.print(fah); client.print("<br/>Humidity is: "); client.print(hum); client.print("<br/>Heat Index in C: "); client.print(heat_indexC); client.print("<br/>Heat Index in fah: "); client.print(heat_index); client.print("<br/>Pressure is: "); client.print(pressure_value); client.print("hpa"); client.print("</p></body>"); break; // break out of the while loop: } else { // if you got a newline, then clear currentLine: currentLine = ""; } } else if (c != '\r') { // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine } } } } }
Пояснение код проекта метеостанции
Во-первых, вам нужно убедиться, что у вас есть все библиотеки, необходимые для этого проекта. Как только вы это сделаете, мы можем определить контакт к которому мы подключим датчик температуры и влажности DHT22:
#include <WiFi.h> #include <Wire.h> #include <DHT.h> #include <Adafruit_BMP085.h> #define DHTPIN 15 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); Adafruit_BMP085 bmp;
Теперь мы сохраняем имя и пароль Wi-Fi, чтобы позднее мы могли подключиться к нему. Затем мы определяем порт, на котором мы создадим сервер.
const char* wifi_name = "Tenda_31BC98"; //Your Wifi name const char* wifi_pass = "barcelona"; //Your Wifi password WiFiServer server(80); //Port 80
В функции настройки мы подключили ESP32 к нашей сети Wi-Fi, используя предоставленную выше информацию Wi-Fi. Если соединение с сетью Wi-Fi будет успешным, на последовательном мониторе будет показано «соединение успешно». В противном случае он будет продолжать попытки, пока не подключится к сети Wi-Fi.
Serial.print("Connecting to "); Serial.print(wifi_name); WiFi.begin(wifi_name, wifi_pass); //Connecting to wifi network while (WiFi.status() != WL_CONNECTED) { //Waiting for the response of wifi network delay(500); Serial.print("."); } Serial.println(""); Serial.println("Connection Successful");
Команда ниже приведет к отображению IP-адреса на последовательном мониторе.
Serial.println(WiFi.localIP());
Затем мы запускаем сервер, чтобы мы могли получать и отправлять данные в браузер.
server.begin();
В функции цикла мы можем считывать значения из датчиков и сохранять их в переменных, чтобы мы могли показать их на веб-странице.
String pressure = String(bmp.readPressure()); pressure.toCharArray(pressure_value, 4); float hum = dht.readHumidity(); float temp = dht.readTemperature(); float fah = dht.readTemperature(true); float heat_index = dht.computeHeatIndex(fah, hum); float heat_indexC = dht.convertFtoC(heat_index);
Затем мы проверяем, отправил ли какой-либо клиент HTTP-запрос или нет. Если какой-либо клиентский запрос доступен, он будет сохранен и показан на серийном мониторе. В конце запроса мы отправим команды HTML, которые будут печатать данные датчика на веб-странице.
WiFiClient client = server.available(); //Checking for incoming clients if (client) { Serial.println("new client"); String currentLine = ""; //Storing the incoming data in the string while (client.connected()) { if (client.available()) //if there is some client data available { char c = client.read(); // read a byte if (c == '\n') // check for newline character, { if (currentLine.length() == 0) //if line is blank it means it’s the end of the client HTTP request { client.print("<html><title> ESP32 Webserver</title></html>"); client.print("<body bgcolor=\"#E6E6FA\"><h1 style=\"text-align: center; color: blue\"> ESP32 Weather Station </h1>"); client.print("<p style=\"text-align: center; font-size:150% \">Temperature in C: "); client.print(temp); client.print("<br/>Temperature in fah: "); client.print(fah); client.print("<br/>Humidity is: "); client.print(hum);
Как запустить вашу метеостанцию
Во-первых, замените имя и пароль Wi-Fi в коде своими. Затем загрузите код и откройте последовательный монитор. Последовательный монитор покажет вам IP-адрес, как показано на рисунке ниже.
Введите этот IP-адрес в своем браузере.
После ввода IP-адреса веб-страница будет примерно такой.
Таким образом вы сделали передачу данных от датчиков вашей метеостанции на веб-страницу.