Нужна помощь в доработке скетча

WAHC

✩✩✩✩✩✩✩
5 Дек 2022
1
0
Доброго времени суток форумчане. Есть приведенный ниже скетч который я собрал из несколько других найденных на просторах интернета и примеров к библиотекам. Сам я только начал свой путь в программировании и пока самому с нуля писать что-то не получается. Есть плата WeMos D1 mini. К ней подключены 3 датчика: 2 DS18B20, 1 HTU21Dx и экранчик OLED SSD1315. Питается это все от телефонной зарядки через USB разъем платы. Вопроса собственно два: 1) И самый критичный в том, что если платка не может подключиться к Wi-Fi то и экранчик не выводит никак данных. 2) Частота обновления данных на экранчике - если подключился к Wi-Fi то данные выводятся на экранчик, но по какому то мне непонятному алгоритму. Пока смотришь на страничку вэбсервиса это примерно 1 раз в секунду как и на самой страничке, но стоит закрыть страничку то тут начинаются варианты от 1 раза в секунду до 1 раза в несколько минут.

скетч:
#include <ESP8266WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <GyverOLED.h>
#include <GyverHTU21D.h>

// Шина данных подключена к выводу D4 на ESP8266
#define ONE_WIRE_BUS D4

GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
GyverHTU21D htu;

// Настройка объекта oneWire для связи с любыми устройствами OneWire
OneWire oneWire(ONE_WIRE_BUS);

// Передаем ссылку на объект oneWire объекту Dallas Temperature.
DallasTemperature sensors(&oneWire);

float tempSensor1, tempSensor2, tempSensor3, humd;

uint8_t sensor1[8] = { 0x28, 0xFF, 0x64, 0x1E, 0x85, 0x55, 0x3D, 0xF7  };
uint8_t sensor2[8] = { 0x28, 0xFF, 0x64, 0x1E, 0x85, 0x5E, 0xDD, 0x3D  };


/* Введите SSID и пароль от вашей сети*/
const char* ssid = "iot24";   // SSID
const char* password = "12345678";  // пароль

ESP8266WebServer server(80);
 
void setup(){
  Serial.begin(115200);
  delay(1000);

  oled.init();                                                        // инициализация OLED SSD1315
  if (!sensors.begin()) Serial.println(F("DS18B20 error"));           // инициализация датчиков DS18B20
  if (!htu.begin()) Serial.println(F("HTU21D error"));                // инициализация датчика HTU21D

  Serial.println("Connecting to ");
  Serial.println(ssid);

  // подключение к локальной wi-fi сети
  WiFi.begin(ssid, password);

  // проверить, выполнено ли подключение wi-fi сети
  while (WiFi.status() != WL_CONNECTED){
    delay(1000);
    Serial.print(".");
  }
 
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: "); 
  Serial.println(WiFi.localIP());                 //какой адрес получил

  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);

  server.begin();
  Serial.println("HTTP server started");
 
}

void loop(){
  server.handleClient();
  OLEDText();
   if (htu.readTick()) {
    Serial.println(htu.getTemperature());
    Serial.println(htu.getHumidity());
    Serial.println();
  }
}

void handle_OnConnect(){
  sensors.requestTemperatures();
  tempSensor1 = sensors.getTempC(sensor1); // Получить значение температуры
  tempSensor2 = sensors.getTempC(sensor2); // Получить значение температуры
  tempSensor3 = htu.getTemperature();
  humd = htu.getHumidity();
  server.send(200, "text/html", SendHTML(tempSensor1, tempSensor2, tempSensor3, humd));
}

void OLEDText(){
  oled.clear();
  oled.setCursor(6, 0);
  oled.print("IP: ");
  oled.print(WiFi.localIP());
  oled.setCursor(2, 2);
  oled.print("Темп 1: ");
  oled.print(tempSensor1);
  oled.print(" C");
  oled.setCursor(2, 3);
  oled.print("Темп 2: ");
  oled.print(tempSensor2);
  oled.print(" C");
  oled.setCursor(2, 4);
  oled.print("Темп 3: ");
  oled.print(tempSensor3);
  oled.print(" C");
  oled.setCursor(2, 5);
  oled.print("Влажн 3: ");
  oled.print(humd);
  oled.print(" %");
  oled.update();
  delay(1000);
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(float tempSensor1, float tempSensor2, float tempSensor3, float humd){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\">\n";
 
  ptr +="<title>TEMPA</title>\n";

  ptr +="<style>html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #333333;}\n";
  ptr +="body{margin-top: 50px;}\n";
  ptr +="h1 {margin: 50px auto 30px;}\n";
  ptr +=".side-by-side{display: inline-block;vertical-align: middle;position: relative;}\n";
  ptr +=".temperature-icon{background-color: #ff0000;width: 30px;height: 30px;border-radius: 50%;line-height: 40px;}\n";
  ptr +=".temperature-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n";
  ptr +=".temperature{font-weight: 300;font-size: 60px;color: #f39c12;}\n";
  ptr +=".humidity-icon{background-color: #008cf0;width: 30px;height: 30px;border-radius: 50%;line-height: 36px;}\n";
  ptr +=".humidity-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n";
  ptr +=".humidity{font-weight: 300;font-size: 60px;color: #008cf0;}\n";
  ptr +=".superscript{font-size: 17px;font-weight: 600;position: absolute;right: -20px;top: 15px;}\n";
  ptr +=".data{padding: 10px;}\n";
  ptr +="</style>\n";
  ptr +="<script>\n";
  ptr +="setInterval(loadDoc,200);\n";
  ptr +="function loadDoc() {\n";
  ptr +="var xhttp = new XMLHttpRequest();\n";
  ptr +="xhttp.onreadystatechange = function() {\n";
  ptr +="if (this.readyState == 4 && this.status == 200) {\n";
  ptr +="document.getElementById(\"webpage\").innerHTML =this.responseText}\n";
  ptr +="};\n";
  ptr +="xhttp.open(\"GET\", \"/\", true);\n";
  ptr +="xhttp.send();\n";
  ptr +="}\n";
  ptr +="</script>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
 
  ptr +="<h1>ESP8266 + DS18B20 + HTU21D</h1>\n";
  ptr +="<h1>Показания</h1>\n";
 
  ptr +="<div class=\"data\">\n";
  ptr +="<div class=\"side-by-side temperature-icon\">\n";
  ptr +="<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n";
  ptr +="width=\"9.915px\" height=\"22px\" viewBox=\"0 0 9.915 22\" enable-background=\"new 0 0 9.915 22\" xml:space=\"preserve\">\n";
  ptr +="<path fill=\"#FFFFFF\" d=\"M3.498,0.53c0.377-0.331,0.877-0.501,1.374-0.527C5.697-0.04,6.522,0.421,6.924,1.142\n";
  ptr +="c0.237,0.399,0.315,0.871,0.311,1.33C7.229,5.856,7.245,9.24,7.227,12.625c1.019,0.539,1.855,1.424,2.301,2.491\n";
  ptr +="c0.491,1.163,0.518,2.514,0.062,3.693c-0.414,1.102-1.24,2.038-2.276,2.594c-1.056,0.583-2.331,0.743-3.501,0.463\n";
  ptr +="c-1.417-0.323-2.659-1.314-3.3-2.617C0.014,18.26-0.115,17.104,0.1,16.022c0.296-1.443,1.274-2.717,2.58-3.394\n";
  ptr +="c0.013-3.44,0-6.881,0.007-10.322C2.674,1.634,2.974,0.955,3.498,0.53z\"/>\n";
  ptr +="</svg>\n";
  ptr +="</div>\n";
 
  ptr +="<div class=\"side-by-side temperature-text\">Температура 1</div>\n";

  ptr +="<div class=\"side-by-side temperature\">";
  ptr +=tempSensor1;
  ptr +="<span class=\"superscript\">°C</span></div>\n";
  ptr +="</div>\n";


  ptr +="<div class=\"data\">\n";
  ptr +="<div class=\"side-by-side temperature-icon\">\n";
  ptr +="<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n";
  ptr +="width=\"9.915px\" height=\"22px\" viewBox=\"0 0 9.915 22\" enable-background=\"new 0 0 9.915 22\" xml:space=\"preserve\">\n";
  ptr +="<path fill=\"#FFFFFF\" d=\"M3.498,0.53c0.377-0.331,0.877-0.501,1.374-0.527C5.697-0.04,6.522,0.421,6.924,1.142\n";
  ptr +="c0.237,0.399,0.315,0.871,0.311,1.33C7.229,5.856,7.245,9.24,7.227,12.625c1.019,0.539,1.855,1.424,2.301,2.491\n";
  ptr +="c0.491,1.163,0.518,2.514,0.062,3.693c-0.414,1.102-1.24,2.038-2.276,2.594c-1.056,0.583-2.331,0.743-3.501,0.463\n";
  ptr +="c-1.417-0.323-2.659-1.314-3.3-2.617C0.014,18.26-0.115,17.104,0.1,16.022c0.296-1.443,1.274-2.717,2.58-3.394\n";
  ptr +="c0.013-3.44,0-6.881,0.007-10.322C2.674,1.634,2.974,0.955,3.498,0.53z\"/>\n";
  ptr +="</svg>\n";
  ptr +="</div>\n";
 
  ptr +="<div class=\"side-by-side temperature-text\">Температура 2</div>\n";

  ptr +="<div class=\"side-by-side temperature\">";
  ptr +=tempSensor2;
  ptr +="<span class=\"superscript\">°C</span></div>\n";
  ptr +="</div>\n";

 
  ptr +="<div class=\"data\">\n";
  ptr +="<div class=\"side-by-side temperature-icon\">\n";
  ptr +="<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n";
  ptr +="width=\"9.915px\" height=\"22px\" viewBox=\"0 0 9.915 22\" enable-background=\"new 0 0 9.915 22\" xml:space=\"preserve\">\n";
  ptr +="<path fill=\"#FFFFFF\" d=\"M3.498,0.53c0.377-0.331,0.877-0.501,1.374-0.527C5.697-0.04,6.522,0.421,6.924,1.142\n";
  ptr +="c0.237,0.399,0.315,0.871,0.311,1.33C7.229,5.856,7.245,9.24,7.227,12.625c1.019,0.539,1.855,1.424,2.301,2.491\n";
  ptr +="c0.491,1.163,0.518,2.514,0.062,3.693c-0.414,1.102-1.24,2.038-2.276,2.594c-1.056,0.583-2.331,0.743-3.501,0.463\n";
  ptr +="c-1.417-0.323-2.659-1.314-3.3-2.617C0.014,18.26-0.115,17.104,0.1,16.022c0.296-1.443,1.274-2.717,2.58-3.394\n";
  ptr +="c0.013-3.44,0-6.881,0.007-10.322C2.674,1.634,2.974,0.955,3.498,0.53z\"/>\n";
  ptr +="</svg>\n";
  ptr +="</div>\n";
 
  ptr +="<div class=\"side-by-side temperature-text\">Температура 3</div>\n";

  ptr +="<div class=\"side-by-side temperature\">";
  ptr +=tempSensor3;
  ptr +="<span class=\"superscript\">°C</span></div>\n";
  ptr +="</div>\n";

 
  ptr +="<div class=\"data\">\n";
  ptr +="<div class=\"side-by-side humidity-icon\">\n";
  ptr +="<svg version=\"1.1\" id=\"Layer_2\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n";
  ptr +="width=\"12px\" height=\"17.955px\" viewBox=\"0 0 13 17.955\" enable-background=\"new 0 0 13 17.955\" xml:space=\"preserve\">\n";
  ptr +="<path fill=\"#FFFFFF\" d=\"M1.819,6.217C3.139,4.064,6.5,0,6.5,0s3.363,4.064,4.681,6.217c1.793,2.926,2.133,5.05,1.571,7.057\n";
  ptr +="c-0.438,1.574-2.264,4.681-6.252,4.681c-3.988,0-5.813-3.107-6.252-4.681C-0.313,11.267,0.026,9.143,1.819,6.217\"></path>\n";
  ptr +="</svg>\n";
  ptr +="</div>\n";
  ptr +="<div class=\"side-by-side humidity-text\">Влажность 3</div>\n";
  ptr +="<div class=\"side-by-side humidity\">";
  ptr +=(int)humd;
  ptr +="<span class=\"superscript\">%</span></div>\n";
  ptr +="</div>\n";
 

  ptr +="</div>\n";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,262
1,300
Москва
1) В setup начиная с 45 строки крутится бесконечный цикл ожидания подключения к сети. Если не ждать, то код будет работать и без подключения. Но все что с 51 строки есть обработка подключения. Тогда саму обработку надо перенести в цикл loop. И сделать так, что бы выводилась информация только 1-ый раз при подключении, а не каждый цикл.
2) OLEDText будет выводить информацию на экран туеву хучу раз в секунду - этого не надо. Имеет смысл выводить только если были получены данные с датчика (датчиков). Отсюда 3:
3) С какой периодичностью хочется получать данные ? И с какой точностью ? Соотв. надо организовать эту периодичность, если она будет возможна. Например ds18b20 на максимальную точность затрачивает чуть менее 800мс, т.е. он довольно медленный. А
4) Еще по датчикам. Не стоит напрямую читать датчики (любые) для организации веб страницы. Надо завести нужное кол-во переменных, для каждого типа данных и с периодичностью из п .3 обновлять эти переменные. И уже если было обновление, то перерисовать экран дисплея. А веб данные будут обновляться по обращению к странице.
 
  • Лойс +1
Реакции: WAHC