1 2 3 4 5 6 7 8 9 10 10/10 10,00оценок: 12

Arduino Mega. Контроллер теплицы. Хроники - 4.0

Тема в разделе "Теплицы и парники", создана пользователем Анкор Плюс, 19.05.18.

Статус темы:
Закрыта.
  1. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    @necrjd - возможно, теряется вот эта часть данных:
    Код:
    rol: no-cache, private
    Vary: Accept-Encoding,User-Agent
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=UTF-8
    
    a
    [CMDEND]
    
    примерно 160 байт, что соответствует затупу примерно в 25 миллисекунд. Почему пишу "возможно": да потому что отладка на основе логов - такое себе, логи в порт тоже пишутся не абы как, а после каждого выданного в Serial байта - вычитывается в буфер ESP и SIM800. Короче, там сложнаааа всё :(

    И я вообще не уверен, что смогу это найти, понять - и вылечить. Видимо, если не получится - придётся брать за точку отсчёта какую-то конкретную конфигурацию, и поддерживать именно её - иначе, возможно, никак :(
     
  2. necrjd
    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98

    necrjd

    Живу здесь

    necrjd

    Живу здесь

    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98
    Мне пока ссылок на гугледиск не перепадало:))
     
  3. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    В личку напишу.
     
  4. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Ребят, ещё раз, просто огромнейшая просьба: давайте будем придерживаться системного подхода. Что предлагаю, на момент вылавливания косяка с нестабильной работой через SIM800:

    1. Выключаем модули по-максимуму, ниже - что комментируем:

    USE_SCENE_MODULE
    USE_MCP_MODULE
    USE_WATERING_MODULE
    USE_LUMINOSITY_MODULE
    USE_HUMIDITY_MODULE
    USE_SOIL_MOISTURE_MODULE
    USE_PH_MODULE
    USE_LOG_MODULE
    USE_DELTA_MODULE
    USE_WATERFLOW_MODULE
    USE_COMPOSITE_COMMANDS_MODULE
    USE_RESERVATION_MODULE
    USE_TIMER_MODULE
    USE_IOT_MODULE
    USE_ALARM_DISPATCHER
    USE_WIFI_REBOOT_PIN
    USE_NRF_REBOOT_PIN
    USE_LORA_REBOOT_PIN
    USE_W5100_REBOOT_PIN
    USE_WIFI_MODULE_AS_IOT_GATE
    USE_WIFI_MODULE_AS_HTTP_PROVIDER
    USE_WIFI_MODULE_AS_MQTT_CLIENT
    USE_UNIVERSAL_MODULES
    USE_REMOTE_DISPLAY_MODULE
    USE_RS485_EXTERNAL_CONTROL_MODULE
    USE_UNI_EXECUTION_MODULE
    USE_UNI_REGISTRATION_LINE
    USE_RS485_GATE
    USE_NRF_GATE
    USE_LORA_GATE
    USE_PUMP_RELAY
    USE_MCP23S17_EXTENDER
    USE_MCP23017_EXTENDER
    USE_WIFI_MODULE
    USE_W5100_MODULE
    USE_LCD_MODULE
    USE_NEXTION_MODULE
    USE_FEEDBACK_MANAGER
    ALERT_DONT_READ_PIN_DIRECT
    USE_WINDOWS_ENDSTOPS
    USE_BUZZER
    USE_TIMER_ONE_FOR_ESP_SIM800
    GSM_TIME_SYNC
    WIFI_TIME_SYNC

    Т. е. по факту у нас остаётся:

    USE_DS3231_REALTIME_CLOCK
    USE_TEMP_SENSORS
    USE_PIN_MODULE
    USE_STAT_MODULE
    USE_GSM_MODULE_AS_HTTP_PROVIDER
    USE_HTTP_MODULE
    USE_SMS_MODULE
    USE_EXTERNAL_WATCHDOG

    ну и сколько там прописано датчиков температуры с фрамугами, ВСЁ. Правила - все СТИРАЕМ, пусть будет чистый лист. По факту получаем МИНИМАЛЬНУЮ конфигурацию, при которой на gardenboss. ru будут отправляться температурные датчики, при этом никакой другой функционал мешать работе (ВРЕМЕННО!) не будет.

    Задача определить - при каких обстоятельствах происходит косяк. Я понимаю, что хочется всего и сразу, но когда включен ВЕСЬ фарш - я не могу ручаться, что косяк там, где мы его ищем.

    Только в таком случае я смогу хоть как-то предположить, где кроется проблема. Конечно, не стоит данные манипуляции производить на подключенном к теплице контроллере - лучшим вариантом будет заиметь отладочный стенд, где к меге подключена самая необходимая малость.

    Очень признателен за понимание.
     
    Последнее редактирование: 17.06.19
  5. necrjd
    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98

    necrjd

    Живу здесь

    necrjd

    Живу здесь

    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98
    Не компилируется в 1.8.5
    строка 452 в AbstractModule. h.
    bstractModule. h: 452: error: converting to 'String' from initializer list would use explicit constructor 'String:String (unsigned int, unsigned char)'

    #define DEBUG_LOGLN (s) { DebugLog (s); DebugLog (NEWLINE);}

    ^

    C:\Users\User\AppData\Local\Temp\arduino_build_898390\sketch\CoreTransport.cpp:4688:7: note: in expansion of macro 'DEBUG_LOGLN'

    DEBUG_LOGLN (remainingDataLength);

    ^

    C:\Users\User\AppData\Local\Temp\arduino_build_898390\sketch\AbstractModule.h:450:6: note: initializing argument 1 of 'void DebugLog (const String&)'

    void DebugLog (const String& str);
     
  6. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Вот эту строку:

    DEBUG_LOGLN (remainingDataLength);

    Измените на

    DEBUG_LOGLN (String (remainingDataLength);

    Я поправлю - и отпишусь ;)
     
  7. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Обновил, пробуйте ;)
     
  8. necrjd
    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98

    necrjd

    Живу здесь

    necrjd

    Живу здесь

    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98
    а тут скобочки не хватает
     
  9. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Краткий анализ проблемы. Имеем: ответ с сервера, когда всё идёт штатно, и ответ - когда что-то пошло не так. Вдобавок (за что ОГРОМНОЕ спасибо ребятам!) - в логе есть временнЫе метки, когда была запись добавлена в лог.

    Штатно:
    Код:
    15:12:03.105>
    +RECEIVE DETECTED, CLIENT #0, LENGTH=275
    15:12:03.167>
    DATA AVAILABLE FOR GARDENBOSS.RU !!!
    15:12:03.229>
    HTTP: line catched=
    15:12:03.229>
    HTTP: line catched=HTTP/1.1 200 OK
    15:12:03.229>
    HTTP: line catched=Date: Mon, 17 Jun 2019 10:11:48 GMT
    15:12:03.229>
    HTTP: line catched=Server: Apache/2
    15:12:03.229>
    HTTP: line catched=X-Powered-By: PHP/7.0.33
    15:12:03.229>
    DATA AVAILABLE FOR GARDENBOSS.RU !!!
    15:12:03.229>
    HTTP: line catched=Cache-Control: no-cache, private
    15:12:03.292>
    HTTP: line catched=Vary: Accept-Encoding,User-Agent
    15:12:03.292>
    HTTP: line catched=Connection: close
    15:12:03.292>
    HTTP: line catched=Transfer-Encoding: chunked
    15:12:03.292>
    HTTP: line catched=Content-Type: text/html; charset=UTF-8
    15:12:03.292>
    DATA AVAILABLE FOR GARDENBOSS.RU !!!
    15:12:03.292>
    HTTP: line catched=
    15:12:03.292>
    HTTP: line catched=a
    15:12:03.292>
    HTTP: line catched=[CMDEND]
    
    Видим начало - 15:12:03.105, и конец - 15:12:03.292. Вычитаем: 292 - 105 = 187 миллисекунд на всё, включая выплёвывание в Serial. Неплохо.

    Нештатный:
    Код:
    15:17:13.358>
    +RECEIVE DETECTED, CLIENT #0, LENGTH=275
    15:17:13.545>
    DATA AVAILABLE FOR GARDENBOSS.RU !!!
    15:25:51.903>
    HTTP: line catched=
    15:25:51.903>
    HTTP: line catched=HTTP/1.1 200 OK
    15:25:51.903>
    HTTP: line catched=Date: Mon, 17 Jun 2019 10:16:58 GMT
    15:25:51.903>
    HTTP: line catched=Server: Apache/2
    15:25:51.903>
    HTTP: line catched=X-Powered-By: PHP/7.0.33
    15:25:51.903>
    HTTP: line catched=Cache-Cont
    15:25:51.903>
    HTTP: line catched=0, CLOSED
    15:25:51.965>
    HTTP: Handler reports DONE!
    15:25:51.965>
    DATA AVAILABLE FOR GARDENBOSS.RU !!!
    Начало - 15:17:13.358, конец - 15:25:51.965. Вопрос - что делал контроллер целых 8 минут? Между получением в порт данных (+ RECEIVE DETECTED, данные начали валиться в порт, время 15:17:13.358), выводом строки "DATA AVAILABLE FOR GARDENBOSS. RU !" и началом поиска строк в полученном ответе (HTTP: line catched=) - прошло 8 МИНУТ!

    Вот кусок кода:
    Код:
      #ifdef GSM_DEBUG_MODE
            DEBUG_LOGLN(F("DATA AVAILABLE FOR GARDENBOSS.RU !!!"));     
          #endif
    
          processGardenbossData(data, dataSize, isDone);
    где processGardenbossData - это функция, её часть вот:

    Код:
    void SMSModule::processGardenbossData(uint8_t* data, size_t dataSize, bool isLastData)
    {
      if(!canCallHTTPEvent || !httpHandler) // уже всё обработали
        return;
    
        bool enough = false;
    
        for(size_t i=0;i<dataSize;i++)
        {
    
          // тут надо бить данные по строкам, и скармливать их по одной.
          // учитывая ещё тот факт, что может быть остаток, не вместившийся в пакет.
          char ch = (char) data[i];
         
          if(ch == '\r')
            continue;
          else
          if(ch == '\n') // есть строка
          {
              #ifdef GSM_DEBUG_MODE
                DEBUG_LOG(F("HTTP: line catched="));
                DEBUG_LOGLN(*httpData);
              #endif
    Т. е. строка в логе "HTTP: line catched=" просто ОБЯЗАНА появляться очень быстро вслед за строкой "DATA AVAILABLE FOR GARDENBOSS. RU !", что демонстрирует нам штатный проход:
    Код:
    15:12:03.105>
    +RECEIVE DETECTED, CLIENT #0, LENGTH=275
    15:12:03.167>
    DATA AVAILABLE FOR GARDENBOSS.RU !!!
    15:12:03.229>
    HTTP: line catched=
    229 - 105 = 124 миллисекунды. При этом, замечу - в вызовах DEBUG_LOG косвенно вызывается вычитка из служебных буферов Serial* во внутренние для ESP и SIM800, поэтому сотня миллисекунд, собственно - это механизм, чтобы отладочный режим не поломал логику работы, не более того.

    При этом, замечу - на момент вызова событий прихода данных - пакет данных копируется в отдельную область памяти, чтобы на время обработки события - оставаться неизменным (т.к. указатель на область памяти, где лежит буфер для SIM800 - передавать нельзя, ибо память - динамически выделяемая, и в любой момент может быть перевыделена). Т. е. вариант, что что-то там с доступом к куску памяти - маловероятен (хотя не исключён, конечно).

    Т. е. сделано всё, чтобы избегать граблей. Однако, вопрос - что делал контроллер 8 минут? Почему в лог за это время ничего не попало? Да даже если 8 секунд - это ВЕЧНОСТЬ.

    Однако, я в замешательстве, такого я точно предположить не мог, и никакой задержки на такой конячий промежуток времени - я не вставлял :)

    Давайте думать вместе, @necrjd.
     
  10. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Да это редактор съел.
     
  11. necrjd
    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98

    necrjd

    Живу здесь

    necrjd

    Живу здесь

    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98
    Может у нас с @olegmak3 SIM800 с одной китайской полки в одно время куплены?
     
  12. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    По логам @olegmak3 - при штатной работе промежуток между выводом

    Код:
    +RECEIVE DETECTED, CLIENT #0, LENGTH=275
    и
    Код:
    DATA AVAILABLE FOR GARDENBOSS.RU !!!
    составляет от 500 миллисекунд до 1500 миллисекунд, т. е. довольно медленно. Однако, даже в этом случае данные не теряются, т. к. в промежутке между выводом байт в лог Serial - они вычитываются из Serial для SIM800 и помещаются во внутренний буфер.

    Пока единственное, что могу предположить - это то, что мы банально упёрлись в нехватку оперативки. Очень чешется язык предложить попробовать на Due ;)
     
  13. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Да дело-то не в SIM800, строго говоря. По коду видно, что происходит что-то непонятное: на момент вывода в лог строчки "+RECEIVE DETECTED ..." какие-то данные от SIM800 уже есть в порту, потому что SIM800 выплюнула строку вида "+RECEIVE,0,285:", где 0 - это номер слота клиента, для которого пришли данные, 285 - длина данных, которые последуют за двоеточием. Единственный вариант, который поддаётся хоть какому-то разумному объяснению (если не брать в расчёт возможную нехватку оперативы) - так это то, что SIM800 выплюнула "+RECEIVE,0,285:", и потом 8 минут ничего не выплёвывала, и наконец растелилась.

    Именно поэтому в крайней версии я добавил вывод

    Код:
            // не хватает части пакета в буфере.
           
            // теперь смотрим, сколько у нас данных ещё не послано клиентам
            size_t remainingDataLength = ipdClientDataLength;
    
        #ifdef GSM_DEBUG_MODE
          DEBUG_LOG(F("[SIM800] REMAINING BYTES: "));
          DEBUG_LOGLN(String(remainingDataLength));
        #endif
    Обратите внимание на строку "[SIM800] REMAINING BYTES: " - в логе хоть будет видно, когда начато ожидание этих байт. Не забывайте только про временнЫе метки для каждой записи в логе, как это делали - очень полезная штука, сильно помогает ;) Например, я увидел лаг ответа от SIM800 до полутора секунд.

    Короче, искать афроамериканца в тёмной комнате, особенно если он закрыл глаза и не улыбается - то ещё удовольствие :)
     
  14. necrjd
    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98

    necrjd

    Живу здесь

    necrjd

    Живу здесь

    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98
    А как проверку оперативки подключить?
     
  15. necrjd
    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98

    necrjd

    Живу здесь

    necrjd

    Живу здесь

    Регистрация:
    05.11.14
    Сообщения:
    146
    Благодарности:
    98
    Вот лог минут на 25. Ничего криминального не произошло. Просто помотреть - совпадают ожидания от Ваших правок с задуманным :))
     

    Вложения:

Статус темы:
Закрыта.