Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Умный дом", создана пользователем Alexey N, 6 сен 2016.

  1. nikolz

    nikolz Гуру

    Сообщения:
    5.056
    Симпатии:
    462
    Выкиньте 1117 и поставьте импульсный стабилизатор, будет больше кпд, меньше падение напряжения на стабилизаторе и в результате будет работать от 5 вольт.
     
  2. shuraf

    shuraf Читатель

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

    Atom Читатель

    Сообщения:
    108
    Симпатии:
    7
    Кстати о стабилизаторах. Кто какие посоветует?
     
  4. Alexey N

    Alexey N Читатель

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

    nikolz Гуру

    Сообщения:
    5.056
    Симпатии:
    462
    уже писал, повторю попробуйте поставить две функции из SDK ( п.23 и п.28 в документации)
     
  6. Alexey N

    Alexey N Читатель

    Сообщения:
    108
    Симпатии:
    12
    Насколько я понял речь идет о функциях 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]
     
  7. nikolz

    nikolz Гуру

    Сообщения:
    5.056
    Симпатии:
    462
    Я указал две функции :
    wifi_station_set_reconnect_policy(true);
    wifi_station_set_auto_connect(1);
    -------------------------
    А вы написали три,
    и третью с ошибкой:
    в функции wifi_softap_set_config_current аргументом должна быть структура,
    а у вас число.
     
    Alexey N нравится это.
  8. Alexey N

    Alexey N Читатель

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

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

    nikolz Гуру

    Сообщения:
    5.056
    Симпатии:
    462
    upload_2016-11-13_17-15-37.png
     
  10. Alexey N

    Alexey N Читатель

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

    nikolz Гуру

    Сообщения:
    5.056
    Симпатии:
    462
    поставьте печать статуса соединения и IP адрес и сообщите, что будет.
     
  12. pvvx

    pvvx Активный участник сообщества

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

    Alexey N Читатель

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

    nikolz Гуру

    Сообщения:
    5.056
    Симпатии:
    462
    Если обращаетесь то какое состояние выдает.
    И сделайте вывод IP адреса. Полагаю Вы его теряете, но не восстанавливаете.
     
  15. nikolz

    nikolz Гуру

    Сообщения:
    5.056
    Симпатии:
    462
    Покажите код.
     
  16. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    9.113
    Симпатии:
    1.310
    Как он его теряет, если в своем коде даже не трогает? Это забота ПО уровнем ниже.
     
  17. Alexey N

    Alexey N Читатель

    Сообщения:
    108
    Симпатии:
    12
    Как раз IP я трогаю. В том плане, что я присваиваю статический IP.
    Вот код. Некоторые назначащие куски типа заголовков ХТМЛ страниц я убрал.
    Код (C):
    1. /* Погодный модуль в 8:00, 14:00 и 20:00 измеряет влажность,
    2.   температуру и давление DHT22 и BMP180. Время определяется по часам реального
    3.   времени DS3231.
    4.  
    5. */
    6. #include <Wire.h>
    7. //+++++++++++++++++++++++++++++++++++++++++++++++++++
    8.  
    9. //Объявим библиотеки и переменные
    10. // Начнем с влажности и температуры
    11. #include "DHT.h"
    12. #define DHTTYPE DHT22  // тип датчика - DHT22
    13. #define DHTPIN 13     // на ногу D7 повесим датчик.
    14.  
    15. // объявим глобальные переменные влажности и температуры
    16. float humidity_room = 0.0; // глобальная переменная влажность в офисе
    17. // запрос humidity_room = dht.readHumidity();
    18. float temp_room = 0.0; // глобальная переменная температура в офисе
    19. // запрос temp_room = dht.readTemperature();
    20.  
    21. //  Объявляем датчик DHT22. С него будем снимать влажность
    22. // и температуру
    23. DHT dht(DHTPIN, DHTTYPE);
    24.  
    25. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++
    26.  
    27. // Теперь добавим датчик давления.
    28. // Пин SDA подключаем к D2, пин SDL - к D1
    29. #include <Adafruit_BMP085.h>
    30. Adafruit_BMP085 bmp;
    31. float pressure = 0.0; // глобальная переменная давления
    32. // Пин SDA подключаем к D2, пин SDL - к D1
    33. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++
    34.  
    35. // Добавляем часы реального времени
    36. // Пин SDA подключаем к D2, пин SDL - к D1
    37. #include "RTClib.h"
    38. RTC_DS3231 rtc;
    39. // Массив для вывода дня недели
    40. char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    41.  
    42. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++
    43. // Библиотека для работы с SPIFFS
    44. #include "FS.h"
    45.  
    46. // Все необходимое для WiFi
    47. #include <ESP8266WiFi.h>
    48. const char* ssid = "Rostelekom_23";                //  имя WiFi сети
    49. const char* password = "850013342806";        //  пароль от WiFi
    50. IPAddress ip(192, 168, 0, 8);
    51. IPAddress gateway(192, 168, 0, 1);
    52. IPAddress subnet(255, 255, 255, 0);
    53. const int port = 80;                           //  port to serve pages through
    54. WiFiServer server(port);
    55.  
    56. uint16_t timeout=0;
    57.  
    58. // Include API-Headers
    59. extern "C" {
    60. #include "user_interface.h"
    61. }
    62.  
    63. //++++++++++++++++++++++++++++++++++++++++++++++++++++++
    64.  
    65. void setup() {
    66.   Serial.begin(9600); // Откроем сом порт
    67.  
    68.   //Это код для освобождения пина SDL,
    69.   //который занимает модуль DS3231 после ресета
    70.   pinMode(5, OUTPUT);
    71.   for (int i = 0; i < 10; i++) {
    72.     digitalWrite(5, HIGH);
    73.     delayMicroseconds(3);
    74.     digitalWrite(5, LOW);
    75.     delayMicroseconds(3);
    76.   }
    77.   pinMode(5, INPUT);
    78.  
    79.   // Запускаем датчик давления
    80.   //  if (!bmp.begin()) {
    81.   //    Serial.println("Couldn't find BMP180");
    82.   //    while (1) {}
    83.   //  }
    84.   delay(500);
    85.  
    86.   // Запускаем часы
    87.   if (! rtc.begin()) {
    88.     Serial.println("Couldn't find RTC");
    89.     while (1);
    90.   }
    91.   //      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    92.   if (rtc.lostPower()) {
    93.     Serial.println("RTC lost power, lets set the time!");
    94.     // following line sets the RTC to the date & time this sketch was compiled
    95.     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    96.     // This line sets the RTC with an explicit date & time, for example to set
    97.     // January 21, 2014 at 3am you would call:
    98.     // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
    99.   }
    100.   delay(500);
    101.  
    102.   // Запускаем датчик температуры
    103.   dht.begin();
    104.  
    105.   // Запускаем файловую систему
    106.   SPIFFS.begin();
    107.   // Следующие три строчки предназначены для форматирования SPIFFS. После заливки скетча, закомментировать эти строки и залить еще раз.
    108.   //  Serial.println("Please wait 30 secs for SPIFFS to be formatted");
    109.   //  SPIFFS.format();
    110.   //  Serial.println("Spiffs formatted");
    111.  
    112.   WiFi.setAutoConnect(true);
    113.   WiFi.setAutoReconnect(true);
    114.   wifi_station_set_reconnect_policy(true);
    115.   wifi_station_set_auto_connect(1);
    116.  
    117.  
    118.   // Запускаем сервер и подключаемся к беспроводной сети
    119.   Serial.println("WiFi delete all config...");
    120.   // delete all existing WiFi stuff in EEPROM
    121.   WiFi.disconnect();
    122.   WiFi.softAPdisconnect();
    123.   WiFi.mode(WIFI_OFF);
    124.   delay(500);
    125.   Serial.println("WiFi set new config...");
    126.   // connect static
    127.   WiFi.mode(WIFI_STA);
    128.   wifi_set_sleep_type(NONE_SLEEP_T);
    129.  
    130.   Serial.println();
    131.   Serial.print("Connecting to ");
    132.   Serial.println(ssid);
    133.   WiFi.begin(ssid, password);                    //  connect to WiFi network
    134.   WiFi.config(ip, gateway, subnet);
    135.   while (WiFi.status() != WL_CONNECTED) {        //  wait until connected
    136.     delay(500);
    137.     Serial.print(".");
    138.   }
    139.   Serial.println("");
    140.   Serial.println("WiFi connected");
    141.   server.begin();                                // Start the server
    142.   Serial.println("Server started");
    143.   Serial.println(WiFi.localIP());                // Print the servers IP address
    144. }
    145. //+++++++++++++++++++++++++++++++++++++++++++++++++++++
    146.  
    147. void loop() {
    148.  
    149.   if (WiFi.status() != WL_CONNECTED) {        //  wait until connected
    150.     WiFi.begin(ssid, password);                    //  connect to WiFi network
    151.     WiFi.config(ip, gateway, subnet);
    152.     delay(500);
    153.     Serial.print("WiFi lost connection");
    154.     return;
    155.   }
    156.  
    157.  
    158.  
    159.   // Проверяем есть ли подключение к ЕСП
    160.   WiFiClient client = server.available();        // Check if a client has connected
    161.   if (client) {//типа если клиент, то выводим в браузер. Если не клиент, то смотрим время и т.д.
    162.  
    163.     Serial.println("New client");                  // Wait until the client sends some data
    164.     while (!client.available()) {
    165.       delay(1);
    166.       timeout++;
    167.       if (timeout > 500)
    168.       {
    169.         client.flush();
    170.         client.stop();
    171.         break;
    172.       }
    173.     }
    174.     String req = client.readStringUntil('\r');     // Read the first line of the request
    175.     Serial.println(req);
    176.     client.flush();
    177.     if (req.indexOf("/reset") != -1)               //  if req = reset
    178.       SPIFFS.remove("/data.txt");                  //  remove file data.txt
    179.     else if (req.indexOf("/data.txt") != -1) {     //  если в адресе есть data.txt
    180.       String line_out = "HTTP/1.1 200 OK\r\n";     //Эти две строки создают полноценный HTTP заголовок,
    181.       line_out += "Content-Type: text/plain; charset=UTF-8\r\n\r\n"; //чтобы выводимый файл был доступен средствами PHP
    182.       File f = SPIFFS.open("/data.txt", "r");
    183.       while (f.available()) {
    184.         //Собрать строку и вывести в браузер содержимое data.txt
    185.         String line = f.readStringUntil(';');
    186.         line_out += line;
    187.       }
    188.       //      Serial.print(line_out);
    189.       client.print(line_out);
    190.       client.stop();
    191.       return;
    192.     }
    193.     else {
    194.       Serial.println("Data page");                 //  Во всех остальных случаях
    195.       String r = HTMLHeader();                     //  показать домашнюю страницу
    196.       r += "<p>";
    197.       r += Temp_icon();
    198.       r += temp_room;
    199.       r += "&deg C</p>\r\n";
    200.       r += "<p>";
    201.       r += Humidity_icon();
    202.       r += humidity_room;
    203.       r += "%</p>\r\n";
    204.       r += "<p>";
    205.       r += Bar_icon();
    206.       r += pressure;
    207.       r += " мм рт.ст.</p>\r\n";
    208.       r += HTMLFooter();
    209.       client.print(r);                              //  send page to clients browser
    210.       client.stop();                                //  disconnect client
    211.       return;
    212.     }
    213.     client.stop();
    214.     return;
    215.   }
    216.   //++++++++++++++++++++++++++++++++++++++++++++++++
    217.   // События по времени. Получаем текущее время в массив now
    218.   DateTime now = rtc.now();
    219.  
    220.   // В 8, 14 и 20 часов (если now.hour()=8 или 14 или 20 и
    221.   // now.minute=0 и now.second=0) снимаем показания
    222.  
    223.   //  if (((now.hour() == 8) || (now.hour() == 14) || (now.hour() == 20)) && (now.second() == 0) && (now.minute() == 0)) {
    224.   if (now.second() == 0) {
    225.  
    226.     //    //********************
    227.     int count = 0;
    228.     do {    // Измеряем влажность
    229.       humidity_room = dht.readHumidity();
    230.       delay(500);
    231.  
    232.       // Измеряем температуру
    233.       temp_room = dht.readTemperature();
    234.       delay(500);
    235.       count++;
    236.       if (count = 10)
    237.         break;
    238.     } while (isnan(humidity_room) || isnan(temp_room));
    239.  
    240.     // Измеряем атмосферное давление
    241.     //    pressure = bmp.readPressure();
    242.     //    pressure = int((pressure / 101325) * 760); // переводим паскали в мм.рт.ст
    243.     //    delay(1000);
    244.  
    245.     //+++++++++++++++++++++++++++++++++++++++++++++++++++++
    246.     // записываем в файл weather.txt в SPIFFS
    247.     // открывем файл для чтения
    248.     // буква "a" означает, что запись будет продолжаться с конца файла
    249.     String data_string = "";
    250.     data_string += now.unixtime();
    251.     data_string += "000";
    252.     data_string += ",";
    253.     data_string += temp_room;
    254.     data_string += ",";
    255.     data_string += humidity_room;
    256.     data_string += ",";
    257.     data_string += pressure;
    258.     data_string += ";";
    259.  
    260.     //    File f = SPIFFS.open("/data.txt", "a");
    261.     //    if (!f) {
    262.     //      Serial.println("file open failed");
    263.     //    }
    264.     //    f.println(data_string);
    265.     //    f.close();
    266.     //+++++++++++++++++++++++++++++++++++++++++++++++++++++
    267.  
    268.     // Вывод информации в сериал для отладки
    269.     Serial.print("WiFi status = ");
    270.     Serial.println(WiFi.status());
    271.  
    272.     Serial.print("UnixTime: ");
    273.     Serial.println(now.unixtime());
    274.     Serial.print(now.year(), DEC);
    275.     Serial.print('/');
    276.     Serial.print(now.month(), DEC);
    277.     Serial.print('/');
    278.     Serial.print(now.day(), DEC);
    279.     Serial.print(" (");
    280.     Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    281.     Serial.print(") ");
    282.     Serial.print(now.hour(), DEC);
    283.     Serial.print(':');
    284.     Serial.print(now.minute(), DEC);
    285.     Serial.print(':');
    286.     Serial.print(now.second(), DEC);
    287.     Serial.println();
    288.     Serial.print (RUS("Влажность: "));
    289.     Serial.println (humidity_room);
    290.     Serial.print (RUS("Температура: "));
    291.     Serial.println (temp_room);
    292.     Serial.print (RUS("Давление: "));
    293.     Serial.println (pressure);
    294.     //********************
    295.   }
    296. }
     
  18. nikolz

    nikolz Гуру

    Сообщения:
    5.056
    Симпатии:
    462
    конечно-же не чел, а ESP (Вы - это ESP - дело рук человеческих. ПО нижнего уровня - это тоже ВЫ)
     
  19. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    9.113
    Симпатии:
    1.310
    Не... Я просто отметаю простейшие ошибки в пользовательском коде и правильном подключении модуля - их должен исправлять сам писатель.

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

    pvvx Активный участник сообщества

    Сообщения:
    9.113
    Симпатии:
    1.310
    Дык вы же его назначили и почему он должен измениться?

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

    Nikolz предлагает вам переписать весь SDK в свой "скетч" :)
     
    Последнее редактирование: 13 ноя 2016

Поделиться этой страницей