Перейти к публикации
iT4iT.CLUB

Kitsum

Пользователи
  • Публикации

    330
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    178

Последний раз Kitsum выиграл 10 сентября

Публикации Kitsum были самыми популярными!

Репутация

159 Excellent

9 подписчиков

О Kitsum

  • День рождения 2 апреля

Посетители профиля

4 107 просмотров профиля
  1. Kitsum

    Метеостанция на ESP8266 от it4it.club

    @Devilisimo Объект общего графика не строится автоматически, все правится руками в коде. Данные освещенности отображены т.к совпали с одним из свойств метода самого графика. Я указал на два варианта решения задачи - править все каждый раз руками или дополнить интерфейс панели управления. В данном случае первый вариант будет самым простым и быстрым, для этого ознакомьтесь с функцией обработки нажатия кнопки графика. $("#graph").click(function() { /* ... */ });
  2. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Все очень просто, я не стал реализовывать автоматическое добавление параметров на общий график т.к сложно сделать что-то, что подойдет большинству. Вот с единичным параметром все просто, графики для них одного стандарта и одного цвета, тут работает правило единообразия, если конечно так можно выразиться. А вот в общем графике я предпочитаю видеть влажность в виде градиентной заливки синего цвета, а освещенность в виде кривой желтого или оранжевого цвета, так и со всеми остальными параметрами. Соответственно у Вас свои предпочтения, вы какое оформление предпочитаете? Есть два варианта, как выйти из этой ситуации: В файле index.htm самостоятельно правите в нескольких местах код и приводите оформление к желаемому виду. Реализовать в панели управления раздел, позволяющий править оформление графика для всех сенсоров и там каждый кастомизируется как хочет. На момент выхода второй версии проекта метеостанции был выбран первый вариант т.к на второй попросту не оставалось времени. Да и еще был реализован механизм добавления пользовательских сенсоров и это тоже вносить определенные сложности, например, не все сенсоры нужно отображать на общем графике. Да и вторая версия задумывалась как исправление косяков первой, но в первую очередь я попытался реализовать хотелки форумчан, ну а получилось или нет, это судить им и Вам. Если сообщество будет заинтересованно, то появится третья версия, но скорее всего на контроллере ESP32.
  3. Kitsum

    Метеостанция на ESP8266 от it4it.club

    @Devilisimo доброе время суток. Рад, что у все получилось, но не затруднит ли Вас описать точное количество и типы датчиков на i2c шине в те моменты, когда вылетала ошибка? Не совсем ясно, сколько датчиков BME использовалось по факту до того момента, когда была добавлена конфигурация "для двух датчиков". На Nano проверяли путем подключения одного датчика и запуска одного из стандартных примеров?
  4. Kitsum

    Метеостанция на ESP8266 от it4it.club

    @Devilisimo Порт GPIO-2 уже занят штатным светодиодом ESP (по крайней мере для ESP-12X) и объектом blink, описанным в файле tools.h, который и управляет этим светодиодом. Вы выбрали порт, который не висит "свободно в воздухе". Я указал на это в сообщении выше, а также на то, что нужно сделать. Но даже после исправления в коде на порту GPIO-2 останется висеть распаянный на фабрике светодиод, который еще и управляется низким логическим уровнем, что в свою очередь говорит о наличие на порту (со второго "конца" светодиода) напряжения 3.3V которые оказываются на ноге Data вашего датчика. Все эти моменты в комплексе и дают Вам тот результат, который имеется на данный момент. Я вообще удивлен, что датчик испытывает трудности только иногда, а не в течении всего времени, пока на плату подано напряжение. В любом случае, воспользуйтесь одним из двух советов о которых я Вам писал выше, и если не поможет, то выпаивайте штатный светодиод, но перед этой операцией обратитесь к актуальной схеме Вашего модуля, кстати в ней Вы найдете ответ почему кнопка на GPIO-15 не заработала, скорее всего этот порт подтянут к земле.
  5. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Все дело в баге ядра ESP при котором контроллер может зависнуть и от этого не спасет даже сторожевой таймер. Если при старте микроконтроллера на данном порту будет висеть логическая единица, то все отработает замечательно, в противном случае не отработаю какие-то внутренние процессы микроконтроллера. После старта можно пользоваться портом, как угодно. Как проверить баг Оставьте порт GPIO-0 висеть в воздухе Подайте питание на микроконтроллер Попробуйте обновить прошивку через web интерфейс, на последнем этапе этой процедуры происходит перезапуск контроллера При это в Serial мониторе можно наблюдать, что контроллер ушел на перезагрузку и не "вернулся". Далее сработает сторожевой таймер и в консоли появится запись об этом, но это не поможет и контроллер останется в мертвом состоянии. При этом, если оставить GPIO-0 висеть в воздухе, а после подачи питания на микроконтроллер сбросить его через Reset порт (кнопкой) и повторить процедуру загрузки программы через web интерфейс, то все прекрасно отработает. Вот такой феномен. Я бы рекомендовал отказаться от датчиков DHT серии в пользу второго датчика BME280, благо их можно держать два на линии, как и некоторые другие датчики температуры и влажности и т.д Естественно, что на одном порту мигать светодиодом и общаться с датчиком просто так не получится, но без паники, ничего не решаемого нет. Есть два варианта Вырезать в коде все упоминание о smartBlink, можно оставить само описание класса, но все вызовы методов этого класса в основном коде должны быть закомментированы. Более интересный вариант подразумевает доработку вашего кода, а точнее той его части где происходит опрос датчика на порту GPIO-2 Первый вариант Найдите в файле tools.h строку окончания описания класса smartBlink и инициализации объекта этого класса с именем blink. } blink; и приведите её к такому виду }; Теперь найдите в проекте все вызовы методов объекта blink по такому шаблону blink. И закомментируйте их. Таких строк не много, думаю меньше одного десятка и все должны быть в файле webserver.h Второй вариант Теперь давайте рассмотрим более интересный вариант с сохранением функционала и датчика, и светодиода. Основа идеи очень проста и заключается в том, чтобы отключать мигание на время общения с датчиком т.к работа со светодиодом организованна по прерыванию с использованием внутреннего таймера микроконтроллера. Это прерывание происходит независимо от того какой код сейчас выполняется в основной программе и останавливает эту самую программу, но смертельно даже не это, а то, что он вмешивается в телеграмму, посылаемую по общему порту. И тут вся магия заканчивается и начинаются проблемы. Нам стоит присмотреться к методам самого класса smartBlink среди которых есть два очень полезных. void smartBlink::setMode(mode_t mode); void smartBlink::previous(); Первый устанавливает новый режим обработки прерываний и соответственно мигания светодиода, а второй возвращает все обратно, а точнее возвращает предыдущий режим. В файле webserver.h оба эти метода применяются и позволяют отображать отображать индикацию процесса загрузки файлов через web сервер микроконтроллера, будь то файлы прошивки или файлы самого web сервера. Модифицируйте свой код таким образом, чтобы до начала работы с общим портом (сбора данных с датчика DHT) происходил выбор режима, при котором светодиод выключен, а после окончания работы с портом возвращался предыдущий режим индикации. blink.setMode(smartBlink::mode_off); /* Ваш код должен находиться в этой части */ blink.previous(); И, в принципе, все. Я не буду бить себя в грудь и говорить, что это точно поможет т.к я отказался от использования датчиков DHT в любых проектах, но я склоняюсь в сторону положительного результата т.к он логичен, хоть и зависит напрямую от внутренних процессов в самом датчике.
  6. Kitsum

    Метеостанция на ESP8266 от it4it.club

    @Devilisimo порт 2 задействован для индикации состояния микроконтроллера (режим AP, STA и ход выполнения различных задач). На этом порту по умолчанию сидит светодиод практически на всех модулях ESP, я просто воспользовался его наличием. Что касаемо типа port_t typedef enum { gpio0 = 0, gpio2 = 2, // NodeMCU } port_t; он описан для явного указания на то, какие порты можно задействовать, и чтобы исключить ошибку при указании номера порта в конструкторе smartBlink. Смысл был в том, чтобы дать возможность выбора из списка, взамен самостоятельного указания значения Мне кажется это не совсем корректное определение, все порты заданы явно, плюс об этом я должен был упоминать в статье. Порт 2 используется для индикации состояния и описан в файле tools.h. Порты: 12, 13 и 14 для управления нагрузкой и описаны в файле gpio.h. Порты 4 и 5 для работы с i2c шиной и описаны в файлах с примерами, это файлы, название которых начинается с users_ и имеющие расширение .h. Если не считать системные порты, занятые под собственные нужды ESP, то все остальное свободно. Весть опубликованный код является примером того, как я видел проект на момент его написания, конечно не все идеи являются верными, а тем более их реализация, но я бы хотел, чтобы то, что есть на данный момент рассматривалось как пример, а не законченное решение. Вы в праве вырезать все, что кажется Вам лишним или модернизировать код на свое усмотрение.
  7. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Если у Вас сейчас имеется возможность проверить, что происходит в браузере, то предложу изменить if(file.type !== "application/octet-stream") { showAlert("Неверный формат файла"); return false; } приведя его к такому виду if(file.type !== "application/octet-stream") { showAlert("Неверный формат файла: " + file.type); return false; }
  8. Kitsum

    Метеостанция на ESP8266 от it4it.club

    @Dmitry Moshalkov доброе время суток. Проблема явно связана с расхождением mime типов. Необходимо узнать, что получается у вас при компиляции. Т.к Вы пользуетесь MacOS, а она имеет родство с UNIX системами, то Вам должна быть доступна консольная утилита File, по крайней мере я буду на это надеяться. Вызовите контекстное меню действий над объектом (правой кнопкой мыши или два пальца touchpad), после этого нажмите клавишу ⌥Option (Alt) и в меню Вам станет доступен пункт копирования полного пути к файлу. Откройте консоль и введите file -b --mime-type через пробел дополните команду вставив из буфера (⌘Cmd + V) скопированный ранее путь и отправьте это все на выполнение. На выходе Вы должны получить mime тип указанного файла. Например, такой. application/octet-stream Я смогу проверить, что получается при компиляции под MacOS только сегодня вечером.
  9. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Доброе время суток. Давайте начнем с самого главного - DHT22 не работает с i2c шиной, для него требуется отдельный порт микроконтроллера, поэтому работа с ним НЕ может быть такой же, как работа с BME280. По моему субъективному мнению, их не стоит ставить на одном уровне, BME280 более выгодный и надежный вариант. Теперь о проблеме, причин может быть несколько: Порт микроконтроллера уже используется чем-то Ошибка в коде Плохой контакт i2c шины с микроконтроллером Плохой контакт i2c шины с одним из датчиков Один из датчиков вносит хаос в работу всей шины Меня очень настораживает перевод одного из стандартных портов i2c шины на другую "ногу" микроконтроллера, т.к это не даст совершенно ничего кроме физического переезда на другую группу контактов, но это было сделано, значит для чего то было нужно. Начните по порядку, возьмите оригинальную программу и оставьте только i2c шину с датчиками на оригинальных портах, проверьте работоспособность. Так станет ясно имеется ли проблема в самих датчиках или шине. Если проблема ушла, то пробуйте сменить порты шины (программно и аппаратно), если проблема не проявляется, то добавляйте поэтапно все используемые модули, сенсоры и т.п с поэтапным изменением в коде. Что явно бросается в глаза так это массовый вызов callswitch в callback с последующим присвоением ошибочных значений для переменных. Функция callback вызывается каждый раз, когда приходит сообщение и этот факт ставит нас в строгие рамки. Например, пришло сообщение для субтопика switch0, что при этом произойдет? А произойдет следующее, всем переменным, кроме одной будет присвоено неопределенное логическое значение, возвращаемое функцией callswitch т.к проверки описанные в этой функции предусматривают совпадение только с одним топиком, в противном случае переменная sw остается явно не заданной, то есть нам вообще неизвестно её значение. Аналогичная ситуация должна прослеживаться в случае поступления в любой топик, на который оформлена подписка, значения отличного от тех, что участвуют в проверках. И также она будет воссоздана для всех топиков в случае если во время работы программы был удален конфигурационный параметр отвечающий за корневой топик. Что сразу можно сказать по данному фрагменту кода sw_on_0 = callswitch(top, msg, 0); sw_on_12 = callswitch(top, msg, 12); sw_on_13 = callswitch(top, msg, 13); sw_on_14 = callswitch(top, msg, 14); sw_on_15 = callswitch(top, msg, 15); Он не допустим в функции callback, по крайней мере до тех пор, пока функция callswitch будет возвращать ошибочные значения во всех случаях кроме одного, это совпадение имени топика. Вообще я бы рекомендовал изменять за раз только одну переменную, ту к которой адресовано сообщение и улучшить проверки поступающих значений. Позвольте дать Вам еще пару советов по поводу кода, это поможет не наступить на грабли в будущем. Вы ввели дополнительную переменную, как я понимаю, для контроля наличия соединения. /* вырезка из кода */ connect_OK = true; К сожалению, я не увидел, когда происходит определение обрыва соединения и ее значение меняется на false. Взамен этой переменной воспользуйтесь уже готовым методом объекта mqttAPI mqttAPI.connected() Он возвращает логическое значение, соответствующее наличию или отсутствию соединения с MQTT брокером. Вы можете оптимизировать описанную ниже конструкцию //gpio 0 D3 нежелательно if (sw_on_0 == true and digitalRead(0) == !gpio_enable) { digitalWrite(0, gpio_enable); mqttPublish("switch/on","gpio_0_is_ON"); } else if (sw_on_0 == false and digitalRead(0) == gpio_enable) digitalWrite(0, !gpio_enable); до такого вида if (digitalRead(0) != sw_on_0) { digitalWrite(0, !digitalRead(0)); mqttPublish("switch/on", sw_on_0 ? "gpio_0_is_ON" : "gpio_0_is_OFF"); } Теперь о главном. Я бы поставил под сомнение стоит ли использовать в функции callswitch ответ в виде вызова mqttPublish. На эту операцию тратится очень много времени, тем более, что ответ отправляется, когда планировщик задач вызывает функцию проверки соответствия состояния портов. Функция callswitch вызывается в функции callback, что не очень хорошо из-за описанной ситуации. В функции callswitch объявлена переменная sw использующаяся с оператором return. boolean sw; Остается не ясным, что вернет функция callswitch в случае если конфигурационная переменная mqtt_path не была задана, по сути не указан корневой топик в web интерфейсе. Или поступило любое сообщение отличное от ON или OFF в различных регистровых вариациях, например, "BlaBlaBla". Переменная sw должна иметь определенное начальное значение или это значение должно явно определяться в ходе выполнения функции, особенно когда функция должна вернуть результат в случае несовпадения топиков и этот результат должен быть в различных ситуациях разный, как true так и false (опять отсылка к массовому вызову callswitch в callback). В общем Ваша проблема кроется в двух функциях, это callswitch и callback, думаю, что Вы уже догадались как реализовать задуманное.
  10. Kitsum

    Метеостанция на ESP8266 от it4it.club

    @PulFred график метеостанции, это опорная точка. Нам наверняка известно, что график начинает строиться через 10 минут после старта микроконтроллера. Я могу сделать вывод, что примерно в 9 часов вечера микроконтроллер начал выполнять свою работу. Также может быть так, что у контроллера сработал сторожевой таймер, что привело к перезапуску и сбросу всех данных в памяти, в том числе и графика. Куда стоит обратить внимание: В первую очередь проверьте качество питания. Все модификации должны корректно отрабатывать в любом режиме работы микроконтроллера AP/STA, особенно если они контактируют с внешним миром. Убедитесь, что в коде нет утечки памяти. Эта проблема проявляется в версии 2.4.1 ядра ESP8266. Также эта проблема может быть вызвана модификациями. Если к метеостанции есть доступ из интернета, его необходимо закрыть т.к web сервер микроконтроллера не предназначен для массового наплыва клиентов, а ходить на веб сервер буду 100%. Среди клиентов сразу появятся различные сканеры и т.п программы. Зайдите в Настройки, раздел Система. Убедитесь, что объем свободной памяти сразу после запуска микроконтроллера примерно совпадает с объемом через, допустим, час или два после запуска. Заодно проверьте версию ядра (2.4.0 или 2.4.2). В самом конце этого раздела проверьте время беспрерывной работы. В моем случае таймер указывает на 9 дней и 4 часа, но на самом деле, через каждые 40 с лишним дней происходит переполнение millis и таймер начинает отсчет с нуля. Но для понимания происходящего этого вполне достаточно. По своему варианту метеостанции (опубликованный исходник с выбранными датчиками + один программный датчик) с отправкой данных на три разные площадки в интернете, я делаю вывод, что в течении последних 9-и дней нет проблем с питанием и переполнением памяти. Постарайтесь провести аналогичный анализ, только в Вашем случае перезапустите микроконтроллер и запомните сколько оперативной памяти было свободно. Понаблюдайте в течении дня за памятью и внутренним таймером. На крайний случай воспользуйтесь, для сравнения, стоковой прошивкой с модификациями кода микроконтроллера и web интерфейса только под свои датчики. Буду надеяться, что проблему получится выявить сразу.
  11. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Доброе время суток. К сожалению, мне довольно сложно ответить на данный вопрос т.к я не сторонник загрузки данных через данную программу. Знаю, что необходимо указать несколько скомпилированных файлов с указанием соответствующих им адресов. Адреса могут меняться в зависимости от используемой микросхемы флеш памяти. Обратитесь к официальной документации или используйте Arduino IDE для загрузки данных. В пользу среды разработки в качестве программы загрузки могу сказать, что она дает простой способ произвести тонкие настройки для ESP8266 благодаря которым, начиная с версии ядра 2.4.2 можно разогнать скорость работы с сетевым трафиком в несколько раз. У меня получилось добиться загрузки самого тяжелого файла проекта (css файл с изображениями облаков) за 1.4 секунды внутри локальной сети. Полагаю, что график взять с "Народного мониторинга". Эти пробелы наблюдаются на собственном графике метеостанции?
  12. Kitsum

    Метеостанция на ESP8266 от it4it.club

    @Devilisimo доброе время суток. Если мы говорим о переменном токе, то можно собрать собственную схему на симисторе и подобрать его по требуемым характеристикам. Вот вполне полное видео по данной теме. А вот для постоянного тока. В любом случае, все упирается в характеристики элементной базы и нагрузку. PS: соблюдайте предельную осторожность при работе с абсолютно любой нагрузкой, даже не большие токи могут привести к летальному исходу!
  13. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Всем доброе время суток. Допустил опечатку при указании версий ядра ESP8266 для Arduino IDE. Поправил свой пост. Теперь еще раз и о главном - в ядре версии 2.4.1 имеется баг с утечкой памяти при работе с объектом WiFiClient. В версии 2.4.2 данный баг исправлен, по крайней мере об этом гласит ветка на GitHub. Обновитесь до 2.4.2 или откатывайтесь до 2.4.0 в зависимости от Ваших изменений в проекте.
  14. Kitsum

    Метеостанция на ESP8266 от it4it.club

    Вы всегда можете изучить возможности библиотеки, никакой магии там нет, просто откройте в Arduino IDE любой пример идущий в комплекте с библиотекой. Далее в меню "Скетч" выберите пункт "Показать папку скетча" и в открывшемся каталоге достаточно перейти в корень библиотеки, обычно не более двух переходов на каталог выше. Там Вы увидите список файлов и каталогов среди которых будет каталог src с исходными кодами библиотеки. Нас интересуют файлы заголовков, в данном случае файл PubSubClient.h Открываем его любым удобным текстовым редактором, желательно с поддержкой перевода строки по ASCII 0x0A (в народе просто '\n'). И нам станет доступно описание всех методов интересующего класса. Теперь можно изучить методы, а при необходимости посмотреть их реализацию в файле с расширением .ccp В нашем случаем метод subscribe принимает в качестве первого аргумента указатель на переменную с типом const char В программе реализовано сохранение настроек в список которых входят данные для подключения к домашней базовой станции. Далее, если связь будет разорвана, то программа переведет контроллер из режима клиента (STA) в режим самостоятельной точки доступа (AP) и через небольшие интервалы времени будет производить сканирование эфира в поиске домашней базовой станции. Во время поиска все клиенты, подключенные к точке доступа контроллера, будут отключены, это связано с переводом контроллера в режим STA при сканировании. Если домашняя точка доступа будет найдена, то контроллер попытается к ней подключиться. Также при удачном подключении контроллер запомнит MAC адрес домашней точки доступа. В последствии он будет использован для сравнения MAC адресов у скрытых точке доступа в поиске "дома". Этот механизм нуждается в доработке из-за некоторых специфических ситуаций, но вполне работоспособен и на данный момент. В первую очередь необходимо загрузить программу в микроконтроллер, делается этот как и всегда через зугрузку программы. После этого необходимо залить файлы web сервера на flash через "ESP8266 Sketch Data Upload". При этом консоль (Serial монитор) должна быть закрыта т.к занимает порт. Ваша ошибка связана с использованием одной из Beta версий библиотеки ArduinoJson. Возьмите любую версию из 5.13.x, это упоминалось в инструкции. Также хочу напомнить, что не каждая версия ядра ESP8266 для Arduino IDE подойдет нам, я использую 2.4.0, а вот в версии 2.4.1 есть баг с утечкой памяти который приведет к серьезным проблемам! Будьте очень внимательны и следуйте рекомендациям. Если Вы говорите о плате от RobotDyn с двумя контроллерами на борту, то её хватит для решения большинства задач и подключения кучи датчиков, дисплеев и т.д и т.п, тут только фантазия может стать ограничивающим фактором. Но я бы отказался от встроенного способа связи между ними через UART в пользу I2C или SPI. Значение 32 относится к ESP8266, а к ATmega2560 можно подключить все, что Вам нравится. Но я не сторонник SD карт из-за их низкой надежности и возможных проблемах при выходе карты из строя. Для ведения журналов есть множество других способов, один из которых, это сторонний скрипт на домашнем сервере в роли которого может выступить подготовленный домашний маршрутизатор. Оно так и есть на самом деле, 8bit = 1byte. Вопрос только в том, как эффективно использовать эту память чтобы быстро не сократить её срок службы. Если у Вас есть удаленный сервер, то лучше возложить на него все задачи, связанные с сохранением полученных данных. Это максимально эффективно и правильно.
  15. Удалите из проекта вызов сторожевого таймера, я указывал ранее на нужные строки. Проверьте будет ли зависание, возможно Ваша проблема совсем не связана с программой.
×