Создаем метеостанцию на основе ESP32 и датчиков

Узнайте, как использовать 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-адреса веб-страница будет примерно такой.

Таким образом вы сделали передачу данных от датчиков вашей метеостанции на веб-страницу.

Ардуино+