• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 в свой "скетч" :)
 
Последнее редактирование:
Сверху Снизу