<-- назад

Теперь решим предыдущую задачу (проект мониторинга показаний датчиков) на плате "ESP32", но следить за изменением параметров мы будем (с компьютера или мобильного устройства) посредством технологии WiFi связи с созданным нами Web-сервером.

    Построим проект решения следующего варианта этой задачи:
    а) подключим к плате "ESP32" датчик температуры и давления BMP180 и датчик освещенности (фоторезистор):

    b) напишем программу, согласно которой плата будет читать показания датчиков и передавать их по каналам WiFi связи и посредством нашего Web-сервера на экраны браузеров удаленных компьютеров или мобильных устройств;
    c) в этой программе организуем автоматическое включение желтого светодиода (или реле) при уменьшении освещенности ниже определенного уровня И включение красного светодиода (или реле) при повышении температуры выше определенного значения;
    d) предусмотрим в программе также дистанционное включение и выключение зеленого светодиода по командам (нажатию кнопок) с экранов браузеров удаленных компьютеров или мобильных устройств.

Программа (внимательно читайте комментарии):
Все приводимые в этой книге программы бесплатные, разработаны различными энтузиастами, размещены на различных открытых ресурсах в Интернете, ОПРОБОВАНЫ, отредактированы и ДОПОЛНЕНЫ автором данного пособия, и предлагаются в качестве опоры при изучении основ программирования по методу - 'посмотри, пойми, повтори, сделай сам и по-своему'.

//32WEB bmp180-3leds.ino 
#include <Adafruit_BMP085.h>
#include <WiFi.h>
#include <Wire.h>

#include <Adafruit_Sensor.h> 
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BMP085 bmp;
 
const char* ssid     = "...........";
const char* password = "...........";
 
WiFiServer server(80);
 
const int led1 =  18;      // g
const int led2 =  19;      // r
const int led3 =  15;      // y
// переменные для web-сервера
char linebuf[80];
int charcount=0;
 
void setup() {
  pinMode(led1, OUTPUT); //g
  pinMode(led2, OUTPUT); //r
  pinMode(led3, OUTPUT); //y
  Serial.begin(115200);
  bool status;
 
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
   // подключение к WiFi сети
  while(!Serial) {
    ; 
  }
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");  
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
    while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");    
  Serial.println(WiFi.localIP());
 
  server.begin(); //запуск сервера
}
 
void loop() {
  delay(1000);
   float sv = analogRead(34)/10; //sensor light
       if (sv > 215){
       digitalWrite(led3, LOW);  //switch on ledY-15 
       } else {
       digitalWrite(led3, HIGH);  
       }
 
  
  Serial.print("t C= ");
  Serial.print(bmp.readTemperature());
  Serial.print(" |P mmHg= ");
  Serial.println(bmp.readPressure() / 100.0F*0.7500634);
  Serial.print("");
  Serial.print(sv); 
  Serial.println(" lum");
 ///////автоматическое включение красного led, если t_C>=29 градусов  
  if (bmp.readTemperature()>=29) {digitalWrite(led2, HIGH);} 
  else {digitalWrite(led2, LOW);};
 ///////////////////////////////////////////////////////////
 // вывод данных на Web-сайт 
    WiFiClient client = server.available();
  if (client) {
    Serial.println("New client");  
    memset(linebuf,0,sizeof(linebuf));
    charcount=0;
     boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        linebuf[charcount]=c;
 if (charcount<sizeof(linebuf)-1) charcount++;
     if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");  
          client.println("Connection: close");
          client.println();
     // сайт
 client.println("<!DOCTYPE HTML><html><head>");
 client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>");
 client.println("<style>body { text-align: center; font-family: \"Trebuchet MS\", Arial;}");
 client.println("table { border-collapse: collapse; width:35%; margin-left:auto; margin-right:auto; }");
 client.println("th { padding: 12px; background-color: #0043af; color: white; }");
 client.println("tr { border: 1px solid #ddd; padding: 12px; }");
 client.println("tr:hover { background-color: #bcbcbc; }");
 client.println("td { border: none; padding: 12px; }");
 client.println(".sensor { color:white; font-weight: bold; background-color: #bcbcbc; padding: 1px; }");
                  
     // на экран браузера
 client.println("</style></head><body><h1>ESP32 with BMP180</h1>");
 client.println("<p>LED Gr <a href=\"on1\"><button><b>ON</button></a>-//соединить со след.строкой
 -   <a href=\"off1\"><button><b>OFF</button></a></p>");
          
            
client.println("<br><table><tr><th>MEASUREMENT</th><th>VALUE</th></tr>");
 client.println("<tr><td>Temp. Celsius</td><td><span class=\"sensor\">");
 client.println(bmp.readTemperature());
 client.println(" *C</span></td></tr>");  
 client.println("<tr><td>Pressure</td><td><span class=\"sensor\">");
 client.println(bmp.readPressure() / 100.0F*0.7500634);
 client.println(" mmHg</span></td></tr>");
 client.println("<tr><td>Svet</td><td><span class=\"sensor\">");
 client.println(sv);
 client.println(" lum</span></td></tr>");
            
   client.println("</body></html>"); 
      
              break;
        }
        if (c == '\n') {
          // нажатие кнопoк 'ON' и 'OFF'
          currentLineIsBlank = true;
          if (strstr(linebuf,"GET /on1") > 0){
            //Serial.println("LED 1 ON");
            digitalWrite(led1, HIGH); 
          }
          else if (strstr(linebuf,"GET /off1") > 0){
            //Serial.println("LED 1 OFF");
            digitalWrite(led1, LOW);
          }
            // обработка запросов
          currentLineIsBlank = true;
          memset(linebuf,0,sizeof(linebuf));
          charcount=0;
        } else if (c != '\r') {
         
          currentLineIsBlank = false;
        }
      }
    }
    
    delay(1);
 
    client.stop();
    Serial.println("client disconnected"); 
  }
}

Пишем (переносим) эту программу в новый файл в "Arduino IDE":

Выбираем плату (ESP32 Dev Module), определяем и выбираем 'порт', запускаем компиляцию и затем загрузку файла, после начала загрузки нажимаем и удерживаем 3-4 сек кнопку 'BOOT' на плате, если все нормально -> по окончании загрузки увидим сообщение:

Теперь открываем "инструменты" и "Монитор порта" и видим данные датчиков (температуры, давления и освещенности):

Для того, чтобы увидеть показания датчиков на Web-странице в браузере, нажмем (коротко) на кнопку 'EN' на плате:

появится указание - на каком адресе находится наш сервер:

Набрав в любом браузере этот адрес - увидим:

Данные на экране браузера (сайта) будут обновляться при каждом перезапуске этой страницы:


На сайте мы также видим две кнопки 'ON' и 'OFF', с помощью которых мы можем дистанционно включать и выключать зеленый светодиод.



Итак, мы решили этот вариант задачи типовой автоматизации - дистанционный (WiFi и Web-сервер) мониторинг показаний датчиков и управление светодиодами (или РЕЛЕ).

! Повторите описанные действия и постройте аналогичный проект мониторинга параметров посредством технологии WiFi связи !



<-- назад