• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Умный дом для чайника

nikolz

Well-known member
Из опыта - ЕСП очень капризно к питанию.
Из последнего - "Метеостанция" (ESP+sht10+MH-Z19+BME280) питание на LM1117. На входе 5,2В. Периодически пропадал, не всегда передергивание и резет помогали. Поменял на питание 6В и все стабилизировалось, работает как часы.
Выкиньте 1117 и поставьте импульсный стабилизатор, будет больше кпд, меньше падение напряжения на стабилизаторе и в результате будет работать от 5 вольт.
 

shuraf

Member
Выкиньте 1117 и поставьте импульсный стабилизатор, будет больше кпд, меньше падение напряжения на стабилизаторе и в результате будет работать от 5 вольт.
Логично, но "мы не ищем легких путей" ©
*Блок питания на 6в есть. Горсть 1117 (3.3, 5.0, adj) есть. Почему же использовать?
** 360-е тоже парочка есть, но жалко, когда без дела 1117-е лежат
 

Alexey N

Member
Перенес метеостанцию на плату с отдельным источником питания. Блок питания поставил HLK-PM01. Стало сильно лучше. Работает вторые сутки. Хотя время от времени ЕСП пропадает. Это не зависание как раньше, а просто почему то отсутствует доступ к ЕСП. Через какое-то время (минут 10-15) снова появляется доступ. Возможно проблема в бюджетном ZTE роутере от Ростелекома?
 

nikolz

Well-known member
Перенес метеостанцию на плату с отдельным источником питания. Блок питания поставил HLK-PM01. Стало сильно лучше. Работает вторые сутки. Хотя время от времени ЕСП пропадает. Это не зависание как раньше, а просто почему то отсутствует доступ к ЕСП. Через какое-то время (минут 10-15) снова появляется доступ. Возможно проблема в бюджетном ZTE роутере от Ростелекома?
уже писал, повторю попробуйте поставить две функции из SDK ( п.23 и п.28 в документации)
 

Alexey N

Member
Насколько я понял речь идет о функциях wifi_station_set_reconnect_policy и wifi_softap_set_config_current?
И что-то у меня не получается вызвать SDK функции. Хотя пример CallSDKFunctions я смотрел. Ничего вроде сложного.
Подключаю файл заголовков для работы с WiFi SDK функциями:
#ifdef ESP8266
extern "C" {
#include "user_interface.h"
}
#endif

А в сетапе перед запуском WiFi прописываю такой код:

#ifdef ESP8266
wifi_station_set_auto_connect(1);
wifi_station_set_reconnect_policy(1);
wifi_softap_set_config_current(1);
#endif

Копиляция падает на вызовах функций с ошибкой:
invalid conversion from 'int' to 'softap_config*' [-fpermissive]
 

nikolz

Well-known member
Насколько я понял речь идет о функциях wifi_station_set_reconnect_policy и wifi_softap_set_config_current?
И что-то у меня не получается вызвать SDK функции. Хотя пример CallSDKFunctions я смотрел. Ничего вроде сложного.
Подключаю файл заголовков для работы с WiFi SDK функциями:
#ifdef ESP8266
extern "C" {
#include "user_interface.h"
}
#endif

А в сетапе перед запуском WiFi прописываю такой код:

#ifdef ESP8266
wifi_station_set_auto_connect(1);
wifi_station_set_reconnect_policy(1);
wifi_softap_set_config_current(1);
#endif

Копиляция падает на вызовах функций с ошибкой:
invalid conversion from 'int' to 'softap_config*' [-fpermissive]
Я указал две функции :
wifi_station_set_reconnect_policy(true);
wifi_station_set_auto_connect(1);
-------------------------
А вы написали три,
и третью с ошибкой:
в функции wifi_softap_set_config_current аргументом должна быть структура,
а у вас число.
 

Alexey N

Member
Спасибо за пояснение, а то я опять немного запутался. wifi_softap_set_config_current это вроде и есть номер 28 в СДК? Хотя я тоже не понял как она может влиять на стабильность связи.
Оставил только
wifi_station_set_reconnect_policy(true);
wifi_station_set_auto_connect(1);

Пока полет нормальный уже пару часов. Будем посмотреть дальше.
 

nikolz

Well-known member
Спасибо за пояснение, а то я опять немного запутался. wifi_softap_set_config_current это вроде и есть номер 28 в СДК? Хотя я тоже не понял как она может влиять на стабильность связи.
Оставил только
wifi_station_set_reconnect_policy(true);
wifi_station_set_auto_connect(1);

Пока полет нормальный уже пару часов. Будем посмотреть дальше.
upload_2016-11-13_17-15-37.png
 

Alexey N

Member
Да, я скорее всего, запутался в разных версиях СДК. Хотя все равно спустя какое-то время пропадает ЕСП. Не помогли эти функции на 100%. Проблема очень похожа на описываемую здесь NodeMCU + Dht11 зависает через час. И причины похоже, что те же. Хотя проверку WL_CONNECTED я в loop перенес, но какого-то ограничения на количество попыток я не сделал. Сейчас буду править.
 

nikolz

Well-known member
поставьте печать статуса соединения и IP адрес и сообщите, что будет.
 

pvvx

Активный участник сообщества
Выкиньте 1117 и поставьте импульсный стабилизатор, будет больше кпд, меньше падение напряжения на стабилизаторе и в результате будет работать от 5 вольт.
Для отладки годиться любой стабилизатор. 1117 вполне себе нормален для питания модуля от 5В. КПД по питанию при тестах неважно.
ESP8266 работает от 1.71В до 3.6В и "великая" стабилизация питания ему не нужна - главное удержать питание в данных рамках, чтобы не выскакивало за указанные пределы.
 

Alexey N

Member
Вывод статуса я тоже добавлял. Выдаю в сериал каждую минуту данные с датчиков, время и состояние подключения (WiFi.status()). Если не обращаться к ЕСП, то возвращает постоянно значение 3. Если обращаться, то через несколько обращений, все зависает и вообще перестает выдавать в сериал какую-либо информацию.
 

nikolz

Well-known member
Вывод статуса я тоже добавлял. Выдаю в сериал каждую минуту данные с датчиков, время и состояние подключения (WiFi.status()). Если не обращаться к ЕСП, то возвращает постоянно значение 3. Если обращаться, то через несколько обращений, все зависает и вообще перестает выдавать в сериал какую-либо информацию.
Если обращаетесь то какое состояние выдает.
И сделайте вывод IP адреса. Полагаю Вы его теряете, но не восстанавливаете.
 

pvvx

Активный участник сообщества
Если обращаетесь то какое состояние выдает.
И сделайте вывод IP адреса. Полагаю Вы его теряете, но не восстанавливаете.
Как он его теряет, если в своем коде даже не трогает? Это забота ПО уровнем ниже.
 

Alexey N

Member
Как он его теряет, если в своем коде даже не трогает? Это забота ПО уровнем ниже.
Как раз IP я трогаю. В том плане, что я присваиваю статический IP.
Вот код. Некоторые назначащие куски типа заголовков ХТМЛ страниц я убрал.
Код:
/* Погодный модуль в 8:00, 14:00 и 20:00 измеряет влажность,
  температуру и давление DHT22 и BMP180. Время определяется по часам реального
  времени DS3231.

*/
#include <Wire.h>
//+++++++++++++++++++++++++++++++++++++++++++++++++++

//Объявим библиотеки и переменные
// Начнем с влажности и температуры
#include "DHT.h"
#define DHTTYPE DHT22  // тип датчика - DHT22
#define DHTPIN 13     // на ногу D7 повесим датчик.

// объявим глобальные переменные влажности и температуры
float humidity_room = 0.0; // глобальная переменная влажность в офисе
// запрос humidity_room = dht.readHumidity();
float temp_room = 0.0; // глобальная переменная температура в офисе
// запрос temp_room = dht.readTemperature();

//  Объявляем датчик DHT22. С него будем снимать влажность
// и температуру
DHT dht(DHTPIN, DHTTYPE);

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Теперь добавим датчик давления.
// Пин SDA подключаем к D2, пин SDL - к D1
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
float pressure = 0.0; // глобальная переменная давления
// Пин SDA подключаем к D2, пин SDL - к D1
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Добавляем часы реального времени
// Пин SDA подключаем к D2, пин SDL - к D1
#include "RTClib.h"
RTC_DS3231 rtc;
// Массив для вывода дня недели
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Библиотека для работы с SPIFFS
#include "FS.h"

// Все необходимое для WiFi
#include <ESP8266WiFi.h>
const char* ssid = "Rostelekom_23";                //  имя WiFi сети
const char* password = "850013342806";        //  пароль от WiFi
IPAddress ip(192, 168, 0, 8);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
const int port = 80;                           //  port to serve pages through
WiFiServer server(port);

uint16_t timeout=0;

// Include API-Headers
extern "C" {
#include "user_interface.h"
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++

void setup() {
  Serial.begin(9600); // Откроем сом порт

  //Это код для освобождения пина SDL,
  //который занимает модуль DS3231 после ресета
  pinMode(5, OUTPUT);
  for (int i = 0; i < 10; i++) {
    digitalWrite(5, HIGH);
    delayMicroseconds(3);
    digitalWrite(5, LOW);
    delayMicroseconds(3);
  }
  pinMode(5, INPUT);

  // Запускаем датчик давления
  //  if (!bmp.begin()) {
  //    Serial.println("Couldn't find BMP180");
  //    while (1) {}
  //  }
  delay(500);

  // Запускаем часы
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  //      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
  delay(500);

  // Запускаем датчик температуры
  dht.begin();

  // Запускаем файловую систему
  SPIFFS.begin();
  // Следующие три строчки предназначены для форматирования SPIFFS. После заливки скетча, закомментировать эти строки и залить еще раз.
  //  Serial.println("Please wait 30 secs for SPIFFS to be formatted");
  //  SPIFFS.format();
  //  Serial.println("Spiffs formatted");

  WiFi.setAutoConnect(true);
  WiFi.setAutoReconnect(true);
  wifi_station_set_reconnect_policy(true);
  wifi_station_set_auto_connect(1);


  // Запускаем сервер и подключаемся к беспроводной сети
  Serial.println("WiFi delete all config...");
  // delete all existing WiFi stuff in EEPROM
  WiFi.disconnect();
  WiFi.softAPdisconnect();
  WiFi.mode(WIFI_OFF);
  delay(500);
  Serial.println("WiFi set new config...");
  // connect static
  WiFi.mode(WIFI_STA);
  wifi_set_sleep_type(NONE_SLEEP_T);

  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);                    //  connect to WiFi network
  WiFi.config(ip, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED) {        //  wait until connected
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  server.begin();                                // Start the server
  Serial.println("Server started");
  Serial.println(WiFi.localIP());                // Print the servers IP address
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++

void loop() {

  if (WiFi.status() != WL_CONNECTED) {        //  wait until connected
    WiFi.begin(ssid, password);                    //  connect to WiFi network
    WiFi.config(ip, gateway, subnet);
    delay(500);
    Serial.print("WiFi lost connection");
    return;
  }



  // Проверяем есть ли подключение к ЕСП
  WiFiClient client = server.available();        // Check if a client has connected
  if (client) {//типа если клиент, то выводим в браузер. Если не клиент, то смотрим время и т.д.

    Serial.println("New client");                  // Wait until the client sends some data
    while (!client.available()) {
      delay(1);
      timeout++;
      if (timeout > 500)
      {
        client.flush();
        client.stop();
        break;
      }
    }
    String req = client.readStringUntil('\r');     // Read the first line of the request
    Serial.println(req);
    client.flush();
    if (req.indexOf("/reset") != -1)               //  if req = reset
      SPIFFS.remove("/data.txt");                  //  remove file data.txt
    else if (req.indexOf("/data.txt") != -1) {     //  если в адресе есть data.txt
      String line_out = "HTTP/1.1 200 OK\r\n";     //Эти две строки создают полноценный HTTP заголовок,
      line_out += "Content-Type: text/plain; charset=UTF-8\r\n\r\n"; //чтобы выводимый файл был доступен средствами PHP
      File f = SPIFFS.open("/data.txt", "r");
      while (f.available()) {
        //Собрать строку и вывести в браузер содержимое data.txt
        String line = f.readStringUntil(';');
        line_out += line;
      }
      //      Serial.print(line_out);
      client.print(line_out);
      client.stop();
      return;
    }
    else {
      Serial.println("Data page");                 //  Во всех остальных случаях
      String r = HTMLHeader();                     //  показать домашнюю страницу
      r += "<p>";
      r += Temp_icon();
      r += temp_room;
      r += "&deg C</p>\r\n";
      r += "<p>";
      r += Humidity_icon();
      r += humidity_room;
      r += "%</p>\r\n";
      r += "<p>";
      r += Bar_icon();
      r += pressure;
      r += " мм рт.ст.</p>\r\n";
      r += HTMLFooter();
      client.print(r);                              //  send page to clients browser
      client.stop();                                //  disconnect client
      return;
    }
    client.stop();
    return;
  }
  //++++++++++++++++++++++++++++++++++++++++++++++++
  // События по времени. Получаем текущее время в массив now
  DateTime now = rtc.now();

  // В 8, 14 и 20 часов (если now.hour()=8 или 14 или 20 и
  // now.minute=0 и now.second=0) снимаем показания

  //  if (((now.hour() == 8) || (now.hour() == 14) || (now.hour() == 20)) && (now.second() == 0) && (now.minute() == 0)) {
  if (now.second() == 0) {

    //    //********************
    int count = 0;
    do {    // Измеряем влажность
      humidity_room = dht.readHumidity();
      delay(500);

      // Измеряем температуру
      temp_room = dht.readTemperature();
      delay(500);
      count++;
      if (count = 10)
        break;
    } while (isnan(humidity_room) || isnan(temp_room));

    // Измеряем атмосферное давление
    //    pressure = bmp.readPressure();
    //    pressure = int((pressure / 101325) * 760); // переводим паскали в мм.рт.ст
    //    delay(1000);

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++
    // записываем в файл weather.txt в SPIFFS
    // открывем файл для чтения
    // буква "a" означает, что запись будет продолжаться с конца файла
    String data_string = "";
    data_string += now.unixtime();
    data_string += "000";
    data_string += ",";
    data_string += temp_room;
    data_string += ",";
    data_string += humidity_room;
    data_string += ",";
    data_string += pressure;
    data_string += ";";

    //    File f = SPIFFS.open("/data.txt", "a");
    //    if (!f) {
    //      Serial.println("file open failed");
    //    }
    //    f.println(data_string);
    //    f.close();
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++

    // Вывод информации в сериал для отладки
    Serial.print("WiFi status = ");
    Serial.println(WiFi.status());

    Serial.print("UnixTime: ");
    Serial.println(now.unixtime());
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    Serial.print (RUS("Влажность: "));
    Serial.println (humidity_room);
    Serial.print (RUS("Температура: "));
    Serial.println (temp_room);
    Serial.print (RUS("Давление: "));
    Serial.println (pressure);
    //********************
  }
}
 

pvvx

Активный участник сообщества
конечно-же не чел, а ESP (Вы - это ESP - дело рук человеческих. ПО нижнего уровня - это тоже ВЫ)
Не... Я просто отметаю простейшие ошибки в пользовательском коде и правильном подключении модуля - их должен исправлять сам писатель.

Тогда надо глядеть глубже – при создании соединения на пользовательском уровне необходимо проверить, создалась ли tcp. При ‘реконекте WiFi’ вы же открываете снова один и тот-же порт, а он может быть ещё открытым - находиться в состоянии TIME_WAIT 120 секунд с момента закрытия. Надо ставить либо опцию повторного открытия TCP соединения или дикую опцию в SDK - “убийcтва TIME_WAIT”… Ну и тому подобное, т.к. у китайцев в SDK нет четкого описания и вообще какого-го либо алгоритма работы с net_if, взаимодействия с DHCP и прочего. Т.е. пользователю необходимо в своем ПО описать все эти уровни. :) Становиться не ясным - зачем вообще SDK?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Как раз IP я трогаю. В том плане, что я присваиваю статический IP.
Дык вы же его назначили и почему он должен измениться?

Смотрите:
SDK указаны все реконнекты.
Вы открыли порт для соединения и смотрите что ему приходит, и даете ответ. Порт можно открывать даже если нет соединения у WiFi - ему это не должно мешать.
Какие могут быть случаи – что-то там было не так со связью, но любой браузер делает несколько попыток соединения с паузами.
Порт открыт, он работает на любое соединение, если при его создании указана работа с любым IP.
У WiFi что-там меняется – она включается или выклюxается – короче живет своей жизнью, но наш открытый порт – своей. Он всегда висит и ждет запроса, на который даст ответ. Если это не работает – значит уровнем ниже живут БАГИ.

Nikolz предлагает вам переписать весь SDK в свой "скетч" :)
 
Последнее редактирование:
Сверху Снизу