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

Kitsum

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

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

  • Посещение

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

    181

Все публикации пользователя Kitsum

  1. Всем привет, в этой статье поговорим об уже надоевшей всем теме - "Метеостанция". Каждый пытается сделать что-то свое, вот и я не стал исключением и попытался материализовать свои эротические фантазии на контроллере ESP8266. Тема задумывалась уже давно как некое обновление для предыдущего проекта этой тематики, но из-за своей неспешности переросла в нечто самостоятельное. При всей привлекательности микроконтроллера ESP8266 с его большим объемом памяти, железной поддержкой Wi-Fi и массой разных плюшек, он не лишен недостатков. Самый основной - ограниченное количество поддерживаемых одновременных TCP соединений равное 5. Если превысить этот лимит, то контроллер потеряет связь с окружающим миром, при этом watchdog будет думать, что все в порядке, а следовательно, даже не попытается нам помочь. Будем стараться это помнить! Стоит начать с концепции Доступ к данным метеостанции нужно получать без установки внешних приложений и под любой операционной системой. Для этих целей подойдет практически любой современный браузер. Меня всем устраивает Chrome. Раз уж за основу взят HTTP протокол, стоит озаботиться экономией трафика и ограничением числа TCP соединений. Хорошим тоном будет передача всего необходимого для формирования страницы контента только при первом обращении, а все последующие операции, такие как отображение показаний с датчиков или настройку контроллера, производить через API. В этом нам поможет JQuery. А вот, чтобы ослабить болевые ощущения от передачи файлов с SPI Flash в браузер, стоит предусмотреть систему кэширования, например, Etag. Это позволит отдавать тяжелый контент единожды, а при последующих загрузках страницы просто подтверждать его актуальность на уровне Web сервера микроконтроллера и кэш браузера вступит в игру, неимоверно уменьшив время загрузки страницы! "Вы были правы в одном, Мастер: переговоры были недолгими." © Звездные войны. Эпизод 1 Из-за того, что метеостанция с датчиками и контроллером должна располагаться на улице, жизненно необходимо предусмотреть возможность обновлять прошивку ESP через Web интерфейс. Аналогичным образом должны обновляться файлы Web сервера расположенные на SPI Flash. Этот и предыдущий пункт вкупе позволят обновлять функционал микроконтроллера из домашней сети или из интернета, если конечно в этом возникнет острая необходимость. Чтобы никто посторонний не могу вмешаться в работу устройства или изменить файлы Web сервера, последний должен хотя бы как-то себя защищать. Пускать в панель управления только после авторизации, блокировать доступ при попытках брутфорса пароля. В конце концов, контроллер обязан самостоятельно генерировать ключи (salt) для авторизации, дабы сделать алгоритм непредсказуемым и исключить потенциальный взлом, в случае если злодей завладеет исходниками проекта. Понятно, что кому она там нужна, эта метеостанция, если её не завязывать с умным домом, если только из-за спортивного интереса, но как говориться “Береженого Бог бережет”. Датчики стоит расположить по уму - в метеобудке, а вот контроллер в сухом и закрытом боксе. Объединить их между собой, как мне кажется, удобнее по I2C шине - минимум проводов, максимум удобства. Практически на всех вариантах плат ESP-xx имеется штатный светодиод, можно воспользоваться им как для индикации режимов и состояния микроконтроллера, так и для вывода какой-либо промежуточной информации. Что касаемо режимов работы ESP8266, как ни странно, но он должен находить домашнюю Wi-Fi сеть и подключаться к ней. Если вдруг звезды не были к нам благосклонны, и домашняя беспроводная сеть приказала долго жить, контроллер обязан перейти в режим точки доступа (AP) дабы к нему можно было подключиться с какого-либо устройства и перенастроить его на другую сеть. А вот пока последнее не произошло, ESP должен периодически сканировать эфир в поисках долгожданной домашней точки доступа и, если боги были к нам милосердны, и домашняя сеть появилась в эфире, незамедлительно переключиться в режим клиента (STA) и в пылу страсти воссоединиться с ней. Ну и естественно, как же без отправки данных на внешние ресурсы, сейчас без этого не обходится ни одна уважающая себя кофеварка, не говоря уже о метеостанции. Думаю, что основным блюдом станет протокол MQTT, это уже облегчает возможность интеграции с умным домом, стулом или той же кофеваркой. Ну а на закуску добавим поддержку "ThingSpeak" и "Народного мониторинга". При желании можно нарастить функционал, благо памяти у микроконтроллера еще много. Как я себе это представляю Учтите, что на видео, данные с датчиков, эмитируются самим микроконтроллером, это нужно для наглядности. В жизни метеорологическая обстановка намного спокойнее слава Богу. Перейдем к физической сборки устройства Как по мне, так самый оптимальный вариант, это воспользоваться отладочной платой NodeMCU V3 и базой для неё. Таким образом, мы получим отличный комплект с разведенной на его борту всей необходимой обвязкой и возможностью питать устройство от 5 до 24 Вольт. Отладочная плата на базе, и смотрится хорошо, и удобства хоть отбавляй. Заливаем прошивку, образ SPI Flash и подключаем четырьмя проводами датчики. Справится даже ребенок. Ссылки: Базовая плата для NodeMCU V3 с преобразователем питания 5-24V в 5V Отладочная плата ESP8266 от NodeMCU Естественно никто не запрещает Вам развести свою плату. Если Вы это сделаете, скиньте нам свое творение, возможно мы перейдем на него. В идеале, все должно размещаться в метеобудке. Датчики взятые за основу Датчик уровня освещенности BH1750 Интерфейс шины I2C Диапазон измерений от 1 до 65535 Lx Фильтр световых шумов 50/60 Hz Возможность смены адреса на шине Не требует калибровки Рабочая температура от -40 до 85 градусов C Питание от 2.4 до 3.6 V Датчик атмосферного давления BMP085/180 Интерфейс шины I2C Диапазон измерения от 300 до 1100 hPa Встроенный датчик температуры Не требует калибровки Питание от 1.8 до 3.6 V Датчик влажности SI7021-A20 Интерфейс шины I2C Диапазон измерений от 0 до 100% RH Погрешность измерения 3% RH в диапазоне от 0 до 80% RH Рабочая температура от -40 до 125 градусов C Встроенный датчик температуры с диапазоном измерения от -40 до 85 градусов C Не требует калибровки Питание от 1.9 до 3.6 V Альтернативные датчики Датчик влажности HDC1080 Интерфейс шины I2C Диапазон измерений от 0 до 100% RH Погрешность измерения 2%, устаревание (износ) 0.25% в год. На последнее значение могут влиять внешние факторы. Рабочая температура от -20 до 70 градусов C Встроенный датчик температуры с диапазоном измерения от -40 до 125 градусов C Не требует калибровки Питание от 2.7 до 5.5V Датчик влажности HTU21D Интерфейс шины I2C Диапазон измерений от 0 до 100% RH Погрешность измерения 2%, устаревание (износ) 0.5% в год. На последнее значение могут влиять внешние факторы. Рабочая температура от -40 до 125 градусов C Встроенный датчик температуры с диапазоном измерения от -40 до 125 градусов C Не требует калибровки Питание 3V, максимум 3.6V Сборка 3 в 1 из датчиков BH1750, HTU21D и BMP180 Все используемые датчики описаны выше Очень компактные размеры Комплексный датчик BME280 для измерения температуры, влажности и атмосферного давления Интерфейс шины I2C Рабочая температура от -40 до 85 градусов C Диапазон измерение влажности от 0 до 100% RH с точностью 3% в диапазоне от 20 до 80% RH. Устаревание (износ) 0.5% в год. Диапазон измерения давления от 300 до 1100hPa Диапазон измерения температуры от -40 до 85 градусов C Напряжение питания от 1.7 до 3.6V Все датчики очень компактные, способны выдержать большие перепады температуры, довольно точны, имеют одинаковое напряжение питания и опорное напряжение I2C равное напряжению питания. На мой взгляд, они идеально подходят для эксплуатации в уличных условиях, на большей части территории нашей родины. Теперь настал момент озаботиться, где описанные выше ребята будут жить. В прошлый раз мы использовали для этих целей, найденную в подножном корме, электрическую распределительную коробку. Кроме дешевизны в этом решении нет ничего положительного. В этот раз мы воспользуемся более серьезным вариантом – "Метеорологическая будка Стивенсона". Она способна защитить датчики от прямых воздействий окружающей среды, но при этом имеет открытую структуру со стенками в виде жалюзи. Удобно, красиво и самое главное – правильно! Будка печатается на 3D принтере по эскизам опубликованным на Thingiverse неким kowomike, спасибо добрый человек! Архив с эскизами можно будет скачать в конце поста. Фото готовой будки Шпилька М8 крепится через зажимной хомут к мачте уличной антенны. Примерка. Шпилька практически не укорачивалась, чтобы не закрывать будку параболической Wi-Fi антенной. Хотя в моем случае все это сделано не правильно т.к это солнечная сторона дома. Доступа на теневую сторону дома у меня нет, поэтому приходиться довольствоваться тем, что имеем. По прошлой метеостанции мне говорили "на солнечной стороне все эти измерения - сферический конь в вакууме, слепи %описание-многА-букАв% и закрепи на теневой стороне дома". Я пока живу в панельном многоквартирном доме, как и не малая часть нашей страны. Доступ к теневой стороне дома (а для меня, по факту, это окна в подъезде) - прямой вызов всем гопникам района трущимся рядом, любопытным соседям с бегающими глазками и всей элите человечества скрашивающей фоном мою унылую и слишком простую, по их мнению, жизнь. Думаю, что мысль я донес. Датчики располагаются на разных уровнях. В основании находится датчик освещенности BH1750 и смотрит ровно вниз. Мне кажется, так он будет меньше пачкаться и покрываться пылью и при этом смотреть наружу сквозь минимальное количество препятствий для солнечного света. Вообще размещение этого датчика, это целая головная боль. Как не крути, все будет не то. Оставил так, ведь по сути важны не сами показания, а тенденция изменения. Хотя кого я пытаюсь обмануть, точность важна всегда! Предлагайте свои варианты. Намного проще обстоят дела с датчиком атмосферного давления BMP180 и влажности SI7021, кстати, с последнего мы также будем забирать данные о температуре. Их размещаем в оставшемся свободном пространстве будки, благо его там с избытком, но не в конусе т.к пространство в нем менее проветриваемое. Все хозяйство подключается между собой следующим образом NodeMCU | ESP 07/12 | Датчики ----------------------------- D2 | GPIO 4 | SDA D1 | GPIO 5 | SCL 3.3V | 3.3V | 3.3V GND | GND | GND ВАЖНО: при финальном монтаже устройства на его место службы, обязательно установите перемычку между пинами GPIO 0 (D3) и питанием 3.3 Вольта. Причины её установки описаны в закрепленном сообщении с описание обновления от 12.08.2017. Сам микроконтроллер будет спрятан в уже знаменитую распределительную коробку, закрепленную на шпильке, чуть ниже будки Стивенсона. У меня все находится на стадии неторопливой сборки с попутным поиском более удачных идей. Плата расширения, на которой будет установлена плата NodeMCU, закреплена через ножки для крепления компьютерных материнских плат в корпусах. Разъемы для подключения внешних датчиков и питающей линии установил на местах где была пара штатных заглушек. Закрепил все через переходную пластину, выпиленную из куска фольгированного текстолита. Естественно, предварительно пластина была протравлена, а вся медь искоренена, ибо в этом случае она нам не друг. Также была предусмотрена проставка из полиэтиленового поролона (используется в качестве упаковочного материала при транспортировке грузов) между текстолитом и корпусом, общей толщиной 5мм, а после затяжки крепежных винтов, его толщина не превышает 1мм. Это было сделано из-за опыта эксплуатации предыдущего (временного) бокса для этой метеостанции. Без проставки влага быстро найдет путь вовнутрь, и срок службы устройства снизится. Производим примерку. При окончательном монтаже обязательно необходимо удалить все не плотно прилегающие части полиэтиленового поролона, то есть те части, которые располагаются снаружи и не сдавлены крепежной текстолитовой пластиной. Это необходимо сделать для препятствования накоплению влаги в доступных для неё полостях. Также пришлось увеличить число крепежных болтов для более надежного прилегания текстолита, в противном случае он может выгибаться. Все самое сложное позади, остается только вывести на один разъем шину i2c с питание 3.3 Вольта, а на другой подвести пины питания платы расширения. Но т.к у меня валялся "хвост" отрезанный когда-то от не рабочего блока питания маршрутизатора, и я не побрезговал им воспользоваться по прямому назначению. Далее останется все подравнять, проверить качество монтажа, возможность замены платы NodeMCU, если это будет необходимо при эксплуатации и самое главное, дважды проверить, что и куда припаяно. Мои кривые руки и невнимательность уже наказывали меня, а т.к ждать новые запчасти долго, повторять не хочется. Общий вид получился таким А вот как все выглядит в боевых условиях. Кстати, могу предложить идею с помещением в бокс мешочка содержащий впитывающий влагу гель, они часто встречаются в коробках с обувью. Если все герметично, то он впитает остатки влаги, а если нет, то лишним уж точно не будет. Требования Arduino IDE с поддержкой контроллера ESP8266 не ниже v2.4.0 Установленный модуль в Arduino IDE для загрузки файлов во Flash память микроконтроллера. Как установить описано тут. Любой модуль на базе ESP8266 c Flash 4MB (3MB выделяем под SPIFFS) Сам архив с последней версией проекта. Скачать можно в конце статьи или по этой ссылке. Обязательные библиотеки ArduinoJson (v5.13.2) PubSubClient Ссылки на библиотеки сенсоров указаны в комментариях к коду. Сами библиотеки, как и обслуживаемые ими сенсоры, не являются обязательными. Вы вольны использовать любые датчики, как физические, так и программные. Порядок установки Изучите файлы проекта с примерами использования тех или иных сенсоров. Все файлы с примерами начинаются с префикса users_, это users_auto.h, users_bme280_x2.h и т.д. Загрузите необходимые Вам библиотеки или используйте эти файлы как пример для добавления иных датчиков. Выставите необходимые настройки для контроллера в среде разработки Arduino IDE. Пример настроек указан на скриншоте выше. Обязательно убедитесь, что выбрано правильное распределение места для внутренней файловой системы, это значит, что 3MB должно быть выделено под файловую систему. Произведите загрузку программы с помощью среды разработки (Ctrl + U). Произведите загрузку содержимого каталога data в файловую систему. Меню/Инструменты/ESP8266 Sketch Data Upload Перед тем как устанавливать метеостанцию на постоянное место жительства, подтянуть GPIO-0 (пин D3 на плате NodeMCU) к питанию 3.3V. Во время данной процедуры, питание на контроллере должно отсутствовать. Первый запуск Помните, что вся конфигурация микроконтроллера производится исключительно через web интерфейс. Никаких изменений значений тех или иных параметров в коде не требуется, а подобную практику будем считать плохим тоном. И так, после запуска микроконтроллера он сразу перейдет в аварийный режим и поднимет собственную точку доступа с именем WeatherStation. Это нормальное поведение т.к подразумевается использование метеостанции в домашней беспроводной сети, ну а раз о ней пока ничего не известно, то и подключаться не к чему. Подключитесь к данной сети с любого удобного устройства и перейдите в панель управления (для этого имеется соответствующая иконка, запутаться невозможно), контроллер будет доступен по адресу http://espws.local или http://192.168.4.1 При попытке входа в панель управления будет запрошено имя пользователя и пароль, по умолчанию admin/admin. После входа в панель управления перейдите в раздел "Основные настройки WiFi" и укажите имя и пароль Вашей домашней сети, а также, при необходимости, укажите пароль для подключения к точке доступа поднимаемой контроллером в аварийном режиме. Если все сделано правильно, то контроллер подключится к домашней сети в течении 5-и минут. Если Ваша домашняя сеть скрыта, то после первоначальной настройки необходимо перезагрузить контроллер. Это необходимо из-за частичной поддержки работы со скрытыми сетями. После перезагрузки контроллер увидит Вашу сеть и запомнит её MAC адрес. Помните об этом если захотите сменить домашний маршрутизатор. Хотите помочь проекту или спонсировать новый? Yandex.Money PayPal.me Файлы
  2. Kitsum

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

    Доброе время суток. Да конечно, но проверить работоспособность Вам придется самостоятельно. В первую очередь Вам понадобятся следующие библиотеки: OneWire https://github.com/PaulStoffregen/OneWire DallasTemperature https://github.com/milesburton/Arduino-Temperature-Control-Library Скачиваем и добавляем их в Arduino IDE. Первая необходима для реализации обмена данными через шину 1 wire, а вторая представляет из себя всю необходимую реализацию для работы с датчиками серии DS18. Теперь необходимо определиться с тем, какой порт мы задействуем под шину 1 wire, это важно т.к в проекте уже задействовано много портов, а ESP8266 очень в них ограничена. Из свободных и безопасных остался только GPIO16 (D0 на платах NodeMCU) но с ним могут быть проблемы, в любом случае это стоит проверить. Если вдруг не получится, то придется задействовать один из портов, используемых для управления нагрузкой, например, GPIO14 (D5 на платах NodeNCU). Ранее мы использовали его для управления нагрузкой по разности показаний между двумя датчиками BME280. ВАЖНО: если с GPIO16 не получится и придется использовать GPIO14, то в основном файле программы закомментируйте вызов функции инициализации данного порта // gpio_14(); Все необходимое для работы с DS18B20 будем описывать в файле users_bme280_x2.h т.к по всей видимости именно им Вы и пользуетесь в работе с двумя датчиками BME280. Подключаем дополнительные библиотеки. #include <OneWire.h> #include <DallasTemperature.h> Следом можно объявить все необходимые объекты для работы с шиной и датчиками. Я сразу укажу варианты для разных портов. DallasTemperature ds18b20(new OneWire(16)); // GPIO16 (D0) // DallasTemperature ds18b20(new OneWire(14)); // GPIO14 (D5) Теперь доработаем функцию sensors_config так, чтобы в ней появились следующие дополнительные строки void sensors_config() { /* тут описан код других датчиков */ ds18b20.begin(); cron.add(cron::time_5s, [&](){ ds18b20.requestTemperatures(); }, true); sensors.add(T, device::in, "ds18b20_s0", [&](){ return ds18b20.getTempCByIndex(0); }); sensors.add(T, device::in, "ds18b20_s1", [&](){ return ds18b20.getTempCByIndex(1); }); } Пару слов о том, что мы добавили в эту функцию. Инициализация шины 1 wire ds18b20.begin(); Добавляем в планировщик новое задание которое будет отвечать за рассылку телеграммы по шине с целью запроса температуры у всех имеющихся датчиков. Последний параметр (true) заставит задачу отработать сразу при добавлении в планировщик. cron.add(cron::time_5s, [&](){ ds18b20.requestTemperatures(); }, true); Далее описываем каким способом собирать данные с датчиков sensors.add(T, device::in, "ds18b20_s0", [&](){ return ds18b20.getTempCByIndex(0); }); sensors.add(T, device::in, "ds18b20_s1", [&](){ return ds18b20.getTempCByIndex(1); }); В данном представлении датчики объявлены как внутренние - device::in (можете объявить их как внешние device::out), и имеют идентификаторы в системе ds18b20_sX, где X это индекс датчика найденного библиотекой DallasTemperature. Эта информация будет полезна если появится необходимость вывода данных с этих датчиков на общий график. В теории все должно заработать. Отпишитесь пожалуйста о своих результатах.
  3. Kitsum

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

    @Сергій Артеменко доброе время суток. Это возможно. Один из вариантов, это добавить в планировщик задач новое задание, которое будет, например, раз в час перезаписывать определенный файл во Flash памяти и сохранять туда данные по всем точкам графика. Сами данные хранить в формате JSON. При старте микроконтроллера читать этот файл, разбирать JSON и заполнять массив в оперативной памяти. В принципе это не сложная задача, практически все необходимое уже реализовано в коде. Из минусов можно отметить следующее: При перезагрузке точки на графике могут сдвинуться на время равное тому интервалу времени пока контроллер был выключен. Чем дольше не было питания, тем больше будет рассогласование. Это связано с тем, что контроллер не хранит отметки времени для точек на графике, отсчет идет от последней сохраненной точки с известными интервалами времени опираясь на время устройства с которого просматривается график. Это сделано для того, чтобы отказаться от учета реального времени на микроконтроллере. Любая Flash память имеет ограничение на количество циклов перезаписи, ESP8266 не исключение и число циклов составляет примерно 100000. Если перезаписывать Flash раз в час, то срок жизни будет составлять примерно чуть более 11 лет.
  4. Версия 1.0

    1 скачивание

    Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер. Подключение библиотеки #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации. smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода. Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом. #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать. smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду. led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько. led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код. С библиотекой идут несколько примеров.
  5. Просмотреть файл [esp8266] Библиотека smartBlink, реализует умное управление штатным светодиодом, что позволяет добавить индикацию состояния вашей программы или микроконтроллера. Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер. Подключение библиотеки #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации. smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода. Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом. #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать. smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду. led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько. led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код. С библиотекой идут несколько примеров. Автор Kitsum Добавлен 10.12.2018 Категория Библиотеки  
  6. Версия 1.0

    6 скачиваний

    Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название. Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи. Данная библиотека предоставляет следующий функционал Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами. Фундаментальные константы cron::second cron::minute cron::hour cron::day Самые распространенные значения cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы. cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д В функции loop должна находится команда вызова обработчика. void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки. if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи. Перезапуск таймера задачи производится следующим образом cron.update("Blink"); А так можно установить новый интервал вызова задачи cron.update("Blink", cron::time_10m); Остановка выполнения задачи cron.stop("Blink"); Проверка активности задачи bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров.
  7. Просмотреть файл [esp8266] Библиотека Cron, реализует планировщик задач для периодического выполнения пользовательских функций. Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название. Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи. Данная библиотека предоставляет следующий функционал Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами. Фундаментальные константы cron::second cron::minute cron::hour cron::day Самые распространенные значения cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы. cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д В функции loop должна находится команда вызова обработчика. void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки. if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи. Перезапуск таймера задачи производится следующим образом cron.update("Blink"); А так можно установить новый интервал вызова задачи cron.update("Blink", cron::time_10m); Остановка выполнения задачи cron.stop("Blink"); Проверка активности задачи bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров. Автор Kitsum Добавлен 09.12.2018 Категория Библиотеки  
  8. Kitsum

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

    @pvspec доброе время суток. В файле index.htm найдите строку function checkSSID(ssid) { return ssid.match(/^[a-z0-9_. -]{3,30}$/i); } замените её на function checkSSID(ssid) { return ssid.match(/^[a-z0-9_. -]{2,30}$/i); }
  9. Версия 1.0

    6 скачиваний

    Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой. Данная библиотека позволяет реализовать: Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n". Подключение библиотеки #include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс. cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым. void Setup() { Serial.begin(115200); command.add("test", myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции. В функции loop должна находится команда вызова обработчика. void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований: Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* ... */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры. Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf("%i. %s\n", i, argv[i]); } } } Пример вызова пользовательской функции без параметров и с ними # test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится. Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0. if (!strcmp(argv[0], "wifi")) { Serial.println(F("Первый аргумент WiFi")); } else { Serial.println(F("Первый аргумент НЕ WiFi!!!")); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy char myVar[20]; strcpy(myVar, argv[0]); if (myVar == "123456") { Serial.prinln(F("ok")); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра String param1(argv[0]); // String param1 = argv[0]; Serial.printf("argv[0] length: %i\n", param1.length()); Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO"); if (param1 == "qwerty") { Serial.println(F("Hello QWERTY!")); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.
  10. Версия 1.0.0

    74 скачивания

    Модуль предназначен для системы мониторинга Zabbix. Работает в качестве отдельного демона и осуществляет транзит сообщений от брокера до хостов в системе мониторинга. Подробное описание модуля можно посмотреть в следующей теме.
  11. Просмотреть файл [esp8266] Библиотека CMD, реализует настройку микроконтроллера и управление вашей программой через терминал. Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой. Данная библиотека позволяет реализовать: Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n". Подключение библиотеки #include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс. cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым. void Setup() { Serial.begin(115200); command.add("test", myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции. В функции loop должна находится команда вызова обработчика. void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований: Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* ... */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры. Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf("%i. %s\n", i, argv[i]); } } } Пример вызова пользовательской функции без параметров и с ними # test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится. Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0. if (!strcmp(argv[0], "wifi")) { Serial.println(F("Первый аргумент WiFi")); } else { Serial.println(F("Первый аргумент НЕ WiFi!!!")); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy char myVar[20]; strcpy(myVar, argv[0]); if (myVar == "123456") { Serial.prinln(F("ok")); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра String param1(argv[0]); // String param1 = argv[0]; Serial.printf("argv[0] length: %i\n", param1.length()); Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO"); if (param1 == "qwerty") { Serial.println(F("Hello QWERTY!")); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA. Автор Kitsum Добавлен 05.12.2018 Категория Библиотеки  
  12. Kitsum

    Счетчик воды esp8266

    Все доброго времени суток. Набросал тестовую программу для учета расхода воды при использовании счетчиков с импульсным выходом. На данный момент программа очень простая и основная её задача - это отловить все подводные камни при учете показаний. Если наше маленькое сообщество поможет это сделать, то выпустим полноценный вариант с собственным web сервером для наблюдения за текущими показаниями, графиками, отправкой данных на внешние сервера и разными дополнительными настройками. В общем приведем это все к реализации похожей на ту, что используется в метеостанции в соседней теме. Помощь нужна по одной простой причине, у меня дома не подключены счетчики с импульсным выходом. Естественно, что в будущем это будет исправлено, но на данный момент инструмент накрутки импульсов отсутствует. А если у кого-то уже имеются подключенный счетчик, энтузиазм и свободное время, то это может пойти на общее благо. В тестовой программе реализован необходимый минимум для учета показаний: Учет показаний по двум канал (горячая, холодная) с счетчиков, обладающих импульсным выходом, работающим по принципу сухого контакта. Подключение (переподключение) к домашней точке доступа Передача показаний счетчиков на удаленный MQTT сервер Корректировка показаний счетчиков через публикацию сообщений в специализированных топиках на MQTT сервера Корректировка количества импульсов на единицу значения счетчика через специализированный топик на MQTT сервере Хранение показаний в энергонезависимой памяти на случай пропажи питающего напряжения Теперь немного по программе. Для снятия показаний используются прерывания по спаду логического сигнала на каждом из каналов. Это означает, что сухой контакт (импульсный выход) счетчика воды будет коммутировать землю и порт микроконтроллера, последний, в свою очередь, будет настроен как вход с внутренней подтяжкой к питанию. Это позволит использовать очень длинные провода от счетчика до микроконтроллера, что довольно полезно для тех, кто хочет снять показания с счетчика воды установленного в колодце частного дома (на улице) или в любых схожих ситуациях. Программа контроллера не использует спящий режим или другие энергосберегающие приемы, что подразумевает питание от внешнего источника, например, блока питания от старого телефона. Но можно взять у наших братьев с востока контроллер с DC-DC преобразователем и картриджем для литиевого аккумулятора 18650. Вообще резервирование питания не обязательно, я просто перестраховываюсь на случай отключения электроэнергии в то время, когда будет иметь место фактический расход воды. В первую очередь для реализации Вам понадобится дополнительная библиотека PubSubClient использующаяся для связи с MQTT сервером. Она доступна в каталоге библиотек среды разработки Arduino IDE. Что касаемо настроек, то в первой версии оставим их в самом коде. Сетевые настройки /* Настройки подключения */ String ssid = "AP_Name"; // Имя домашней точки доступа String pass = "AP_Pass"; // Пароль к домашней точки доступа String server = "mqtt.it4it.club"; // Адрес MQTT сервера String device = "waterCounter"; // Обязательно уникальное имя для каждого MQTT клиента Если вы пользуетесь собственным MQTT сервером, то имя устройства можно не менять, в противном случае укажите иное имя или оставьте его пустым и в таком случае будет использован WiFi идентификатор устройства, содержащий два последний байта MAC адреса устройства. Настройки используемых портов /* Порты для подключения импульсного выхода с счетчиков */ byte HPort = 12; byte CPort = 14; Таблица соответствия портов ESP, плат WeMos и NodeMCU указана в комментариях в самом коде. Также имеется переменная отвечающая за то, какое количество импульсов необходимо поймать микроконтроллеру для учета одной единицы расхода воды. /* Устанавливаем какое количество импульсов требуется для сохранения данных и отправки их на сервер. 1 импульс = 0,01 куб.м (10 литров), 100 импульсов = 1 куб.м (1000 литров) оптимальное значение. */ uint16_t ppuv = 10; Обычно на счетчиках указано какое количество литров расхода соответствует одному импульсу и в большинстве случаев это 10 литров на 1 импульс. По умолчанию в программе используется значение в 10 импульсов, что равняется 100 литрам расхода воды. Это означает, что за 1 куб.м. расхода контроллер 10 раз передаст показания на сервер. Это также означает, что переданные значения будут содержать не только целое количество израсходованных кубов, но и десятую нового куба. (00000.1), по сути точность показаний при ppuv равным 10 будет 0.1 куба. Подправьте это значение под Ваш счетчик. Программа сохраняет показания в энергонезависимую память одновременно с передачей показаний на внешний сервер, важно это помнить т.к если использовать малое значение ppuv, например 1, то Flash память микроконтроллера будет очень часто перезаписываться, что приведет к быстрому выходу её из строя. В большинстве модулей ESP используется Flash память с минимальным количеством циклов перезаписи равным 100000. Это не мало, но вопрос в том, как расходовать. При ppuv равном 10 и средним расходом воды 10 куб.м. по каждому из каналов в месяц, микросхема выработает первые свои 100000 циклов через 4 года. В принципе мы легко повысим срок службы Flash памяти в следующих версиях, но на данный момент имеем эти показания. Если я где-то ошибся в математике при расчетах, то прошу меня ссаными тряпками не бить. Передача показаний на удаленный MQTT сервер Данные передаются в топик начинающийся с имени устройства указанного в конфигурации или WiFi идентификатора если имя не используется. Далее идут субтопики с именами hot и cold для обозначения горячей и холодной воды соответственно. Данные публикуются в виде целых чисел, и на самом деле может не быть целым числом т.к зависит от переменной ppuv. Просто имейте это в виду и отбрасывайте десятичную и т.п часть в голове. В будущей версии все это будет учтено. waterCounter/hot waterCounter/cold Корректировка показаний При подключении микроконтроллера к сети происходит подписка на топик MQTT сервера через который можно производить изменение текущих показаний и не только. waterCounter/settings/# По сути подписка оформляется на все субтопики родителем которых является субтопик settings. Это означает, что чтобы изменить показания горячей, холодной воды или значения ppuv можно опубликовать нужное значение в следующих топиках: waterCounter/settings/hot waterCounter/settings/cold waterCounter/settings/ppuv Значения должны быть целым числом и учитывать конфигурацию ppuv, а значит иметь дополнительные значения для чисел после запятой. То есть при значении счетчика в 555 кубов и ppuv равным 10 для стандартного счетчика, публикуемое значение для настроек должно быть 5550. Тестируйте, высказывайте предложения, делитесь идеями и наработками. Скачать исходник можно тут
  13. Версия 1.0

    23 скачивания

    Это просто вариант программы на микроконтроллере ESP8266 для учета расхода воды. Программа для среды разработки Arduino IDE. Цель программы – протестировать концепцию и выявить подводные камни. Обсудить идеи и предложить свои варианты можно в следующей теме.
  14. Доверяй, но проверяй. Идея заключается в том, чтобы проверять антивирусом все загружаемые uTorrent клиентом файлы сразу после окончания закачки. Эта тема особенно актуальна если кроме Вас за компьютером обедаем ваш отпрыск, который не сильно озабочен тем, какую дрянь он может подцепить в сети при скачивании безобидного на вид контента. Я доверяю антивирусу Kaspersky, но подойдет любой другой поддерживающий управление с помощью консольных команд. Аналогично и Torrent клиент должен уметь выполнять эти команды по событию. Для управления антивирусом Касперского с помощью консольных команд используется исполняемый файл avp.com находящийся в корневом каталоге установленного антивируса. Список поддерживаемых команд Usage: avp.com <command> [options] command Specifies the command to be executed. HELP Show this help SCAN Start new scan UPDATE Update databases and optionally application modules ROLLBACK Rollback previously updated databases RENEW Renew product START Start specified task STOP Stop running task STATUS Show task status STATISTICS Show task statistics EXPORT Export settings IMPORT Import settings AcceptEULA Accept EULA and manage KSN agreement usage flag REPORT Export reports SHOWTM Show scan task manager EXIT Exit product TRACES Turn traces on/off, clear traces To get additional description of specific command use 'HELP <command>' syntax Examples: avp.com [ /? | HELP ] avp.com <command> /? avp.com HELP <command> avp.com HELP SCAN avp.com UPDATE /? Первым делом необходимо прописать корневой каталог антивируса в Переменные среды операционной системы, переменная Path. По умолчанию каталог установки находится на системном диске (по умолчанию C:\): x86 - C:\Program Files\Kaspersky Lab\<тип антивируса>\ x64 - C:\Program Files (x86)\Kaspersky Lab\<тип антивируса>\ Допустим используется 64-х разрядная операционная система с установленным бесплатным антивирусом от Касперского версии 16.0.1, полный путь будет выглядеть так C:\Program Files (x86)\Kaspersky Lab\Kaspersky Free 16.0.1\ Открываем свойства компьютера (горячие клавиши "Win" + "Pause") и переходим в раздел "Дополнительные параметры системы". Во вкладке "дополнительно" находятся настройки "Переменные среды". Добавляем в переменную Path полный путь до каталога антивируса определенный ранее. Ничего сложного, но, чтобы проверить правильность действий достаточно в Командной строке набрать avp.com help и в ответ получим список поддерживаемых команд. Осталось дело за малым. Идем в настройки uTorrent, Дополнительно -> Запуск программы. Сам клиент поддерживает следующий список параметров, которые можно передать запускаемому приложению: %F - имя загруженного файла (для торрентов с одним файлом) %D - папка сохранения файлов %N - название торрента %P - предыдущее состояние торрента %L - метка %T - трекер %M - строка статуса (как в колонке статуса) %I - hex-кодированный инфо-хеш %S - состояние торрента %K - вид торрента (одиночный|мульти) На мой взгляд, самый оптимальный вариант, это полная проверка каталога, в который была произведена закачка. В довесок проверяем оперативную память и разделы автозагрузки. Итоги проверки будем записывать в лог файл, это поможет в разборе полетов в будущем. Команда запуска будет выглядеть следующим образом: avp.com SCAN /R:"%HOMEDRIVE%\AVP.log" /MEMORY /STARTUP "%D" По умолчанию файл логов AVP.log будет сохранен в корень системного диска, но Вы можете изменить его на любой другой как это сделал я. Пробуем что нибудь скачать и смотрим на результат.
  15. Kitsum

    Отключение рекламы в uTorrent

    Данная запись скорее крик души или даже протест против унылой рекламы, рассчитанной на людей, не обезображенных интеллектом. Ладно, не будем ходить вокруг да около, а перейдем к вопросу, "что Вы видите при запуске, одного из самых популярных, Torrent клиента - uTorrent?". Вот именно, кучу фекалий рекламы! Все понятно, надо как-то зарабатывать, ... бла бла... мир суров... бла бла... Избавляемся от этого! Благо разработчики отставили открытой "дверь" в глубокие настройки программы. Все, что нам требуется, это изменить значения нескольких параметров в разделе Настройка программы -> Дополнительно В поле Фильтр вбиваем имена следующих параметров и изменяем их значения на FALSE offers.sponsored_torrent_offer_enabled - отключает рекламный баннер в шапке программы offers.left_rail_offer_enabled - отключает окно рекламы в левом нижнем углу gui.show_plus_upsell - отключает рекламу PRO версии программы, которая появится при отключении рекламы в п.2 Сохраняем изменения и перезапускаем клиент. Результатом этих простых операций станет чистое и приятное окно! PS: А в будущем, мы дадим бой самой навязчивой рекламе в Рунете на уровне маршрутизатора! Достали!
  16. Имеется у меня в наличие старенькая магнитола (радио, CD\MP3, Aux), никаких излишеств. Дисками уже долгое время не пользуюсь, а радио надоедает, остается использовать Aux. Телефон и магнитола соединяются аудио кабелем и на телефоне запускается Play list из социальной сети или online радио с конкретным стилем музыки. Все здорово, но автомобиль начал обрастать проводами, да и если кто-нибудь из друзей захочет похвастаться своим музыкальным творением (да да, есть и такие) или просто включить интересный трек, то нужно иметь кабель подлиннее. Можно приобрести магнитолу с Bluetooth и все вопросы отпадут сами собой, но для меня это не вариант т.к в будущем магнитола будет полностью исключена из автомобиля, а её место займет устройство намного боле интереснее и функциональней. Да и куда без самого процесса... Поэтому будем встраивать Bluetooth в то, что есть! Речь пойдет о модернизации магнитолы Kenwood KDC-W4037 но инструкция идентична и для моделей: KDC-W237AY KDC-W237GY KDC-W3037AY KDC-W3037GY KDC-W311AY KDC-W311GY KDC-W3537AY KDC-W3537GY Если подумать, то принцип работы всех магнитол одинаков, поняв один раз, что нужно делать, можно переделать любую "голову". Для начала нам понадобится Bluetooth модуль XS3868 на чипе OVC3860. Приобрести можно в любом Китайском интернет магазине, хотя их производят с такой скоростью, что наверняка можно найти на ближайшем радио рынке. Я брал у Китайцев XS3868 V2, большое внимание уделите версии т.к распиновка отличается. Основные характеристики гласят, что модуль питается от напряжения от 3.6V до 4.2V, но как показывает практика - выдерживает и 5V. Также имеет антенну, разведенную уже на самой плате и её хватит для связи на расстоянии порядка 10м, что позволит "рулить" музыкой на каком-нибудь пикничке во время готовки шашлыков... Нам понадобятся контакты: (1) Масса для аудио каналов (2) Левый канал аудио (3) Правый канал аудио (9) GND питания (11) +5V Остальные контакты можно оставить не задействованными, но при желании можно вывести органы управления проигрывателем на рулевое колесо. Все необходимые контакты описаны на схеме выше. Замечу, что управлять таким образом вы будите не магнитолой, а проигрывателем на устройстве с которого подается аудио поток (телефон, планшет ...). Если необходимо, то можно добавить микрофон (4 и 5 пины), тем самым организовать Hands Free. Можно задействовать UART (18 и 19 пины) и с помощью дополнительного контроллера организовать тоже самое управление плюс дополнительные возможности, но это отдельная тема. И так, ищем техническую документацию на магнитолу, и это не та документация где описаны органы управления и как правильно установить устройство в панель автомобиля. Мы ищем именно ТЕХНИЧЕСКУЮ документацию от производителя со всеми схемами и т.п. Файлы для перечисленных ранее моделей Kenwood я прикреплю к этой записи в блоге. Теперь необходимо определиться куда мы включимся. Контроллер магнитолы знает несколько источников: CD/Радио/AUX и в теории мы можем откинуть любой из них и заменить его нашим источником аудио сигнала, но лучше воспользоваться уже подготовленным AUX. Это самый простой и короткий путь к готовому результату, да и весь остальной функционал останется рабочим. Магнитолы данной серии обладают двумя входами для источников внешнего аналогового сигнала. Первый расположен на лицевой панели (гнездо 3.5jack), второй на задней панели и является частью 13-и пинового разъема для внешних блоков. Второй вариант самый предпочтительный. На схеме он обозначен как модуль J4 (LX BUS). Ищем его подробную схему. Точки подключения и их описание я выделил желтым цветом. Пробежимся по схеме и разберемся, что тут к чему. (3) Постоянные 12V (BU) берутся прямо с питания магнитолы, равносильно питанию от бортовой сети автомобиля. (6) Масса для аудио каналов, она не связана с землей самой магнитолы! (8) Правый канал аудио (9) Сигнал (HIGH) указывающей что задействован AUX от внешнего модуля (12) Левый канал аудио По существу, нам необходимо соединить между собой 3 и 9 пины и соответствующие пины Bluetooth и модуля J4 магнитолы. # --------- | -------------- | ---------------- # # Bluetooth | Магнитола (J4) | Описание каналов # # --------- | -------------- | ---------------- # # 1 | 6 | Audio GND # # 2 | 12 | Audio LEFT ch # # 3 | 8 | Audio RIGHT ch # # --------------------------------------------- # Обычно на плате магнитолы имеется маркировка всех компонентов. Я припаивался на резисторы: R601, R602, R603 для аудио каналов, и таким образом, чтобы не выкинуть их из цепи. 12V можно подать с основной шины питания магнитолы на резистор R606, но я просто сделал перемычку между двумя клеммами на самом разъеме. К сожалению фотографии самого разъема, не осталось, ну да это и не беда, ничего сложного тут нету. В документации производителя имеется зеркальная схема расположения компонентов. Теперь осталось дело за малым. Необходимо найти точку, от которой мы будем питаться. Я попытался решить эту задачу наскоком и это была моя ошибка! Я подал питание на плату и прошелся по ней мультиметром отмечая все точки маркером где имеется напряжение от 4 до 5V. После по схеме из документации производителя выяснял за что отвечает та или иная точка. В итоге была найдена центральная шина питания +5V идущая на CD привод, и я благополучно сел на неё. А теперь самое важное в этом моменте - центральное питание +5V никогда не пропадает! Кстати именно по этой причине Ваша магнитола может вытянуть весь аккумулятор при длительной стоянке, но суть кроется в самом модуле Bluetooth. Если в течении двух минут с модулем не свяжется какое-либо устройство, то он уснет для экономии батареи, а вот разбудить его можно только через специальный пин Reset или сбросом питания. Если этого не сделать, то подключиться к нему получится только, сбросив клеммы с аккумулятора автомобиля, что согласитесь не технологично! А так можно представить себе ситуацию, когда Ваша подруга/девушка/жена (нужное подчеркнуть) захочет включить что-то из своего репертуара и услышит фразу "нет проблем малышка" сопровождающуюся щелчком открывающегося капота... EPIC FAIL! Необходимо брать питание откуда-то еще. Разбираемся с питанием всей платы. Судя по документации за это отвечает модуль IC4. На нем имеются два выхода +5V, один из которых пропадает если снять лицевую панель магнитолы и вынуть ключ зажигания. То, что нужно! На плате это отдельный преобразователь. Вообще он отвечает за питание всего и вся в магнитоле. Нам нужна его 9 нога - SW5V. Кстати, соседняя 8 нога именно постоянное питание +5V (VDD), но в этот раз она нам не понадобится. После все аккуратно запаиваем и укладываем провода. Перед включением магнитолы все внимательно проверьте на правильность подключения и отсутствие КЗ. После включения вы увидите устройство с именем POR 1007BT, это и есть Ваша магнитола. Для сопряжения используется один из стандартных паролей: 0000, 1234... PS: На этом пока все, приятного Вам возрождения старых аппаратов! B64-3498-00_00.pdf BLK-MD-SPK-B_AT_Commands_OVC3860_List.pdf kenwood_kdc-w237_w3037_w311_w3537_w4037.pdf
  17. Первые тесты, всего 30 пикселей. Сразу можно сказать, что этого не достаточно. Закажу ленту 144 пикселя на метр. Сравним результаты. Запись с телефона конечно не передает ощущений, очень жаль(
  18. Kitsum

    Отключаем рекламу в Viber

    Вот и настала очередь популярного мессенджера Viber. Лично у меня терпение лопнуло, когда список контактов был уменьшен в пользу окна с рекламой. Может кому-то это и не доставляло бы много дискомфорта, но не для меня. Спам валит именно когда ты разворачиваешь интерфейс программы, именно тогда, когда требуется больше возможностей для взаимодействия с ней... И главное - закрыть этот поток шлака, а иначе назвать распространяемую контент в рекламе, невозможно. Ну а раз Вы читаете эту заметку, значит у Вас тоже полыхнуло, и срочно требуется лечение данной проблемы. Все крайне просто и быстро. Необходимо изолировать наш клиент от той помойной ямы с которой он тянет эту рекламу. А расположена она по адресу ads.viber.com и самым простым способом изоляции является подмена адреса сервера с помощью файла hosts для Windows Запускаем блокнот с правами администратора (ПКМ -> запуск от имени администратора) и открываем hosts файл, расположенный по следующему пути %SystemRoot%\system32\drivers\etc\hosts Если запускать программу без повышения привилегий в системе, Вы не сможете сохранить наши изменения. А требуется добавить в конце файла новую строку со следующим содержимым 127.0.0.1 ads.viber.com Сохраняем файл и перезапускаем Viber для Linux Делаем все тоже самое, только файл hosts располагается по следующему пути /etc/hosts PS: также смотрите как избавиться от рекламы в uTorrent
  19. Оставляю эту заметку для себя лично т.к память не вечна, а компьютеры под управлением windows 7 продолжают существовать и успешно выполнять возложенные на них обязанности. И так, имеется проблема, при которой svchost съедает оперативную память и центральный процессор. Ну а т.к не все железо способно перейти на новые версии ОС Windows, но при этом отлично выполняет свои обязанности, то приходится лечить этот недуг. Излечивают его несколько обновлений. Конечно, самый оптимальный способ, это ставить их на чистую ОС, но действуем по обстоятельствам. KB3102810 KB3135445 KB3138612 Устанавливаем и забываем о жоре ресурсов.
  20. Kitsum

    Ubuntu 18.04 и установка Midnight Commander

    В репозитории Ubuntu 18.04 отсутствует пакет MC, чтобы вернуть его на законное место необходимо добавить репозиторий Universe sudo add-apt-repository universe sudo apt update Устанавливаем sudo apt install mc Боле информации по репозиториям Ubuntu можно посмотреть тут https://help.ubuntu.ru/wiki/репозиторий
  21. Kitsum

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

    @Devilisimo доброе время суток. Порт D3 (GPIO0) используется микроконтроллером для выбора режима работы при старте. Схема платы NodeMCU уже приводилась в теме и также она общедоступна в сети, естественно, что от ревизии к ревизии она может меняться, но фундаментальных изменений там быть не может. Как видно из разных частей схемы, порт GPIO0 подключен к USB TTL конвертеру через транзистор S8050 и параллельно с этим подключен через токоограничивающий резистор и кнопку, разомкнутую в не нажатом состоянии, к земле. Транзистор отвечает за смену режима в автоматическом режиме при загрузке программы, кнопка делает тоже самое, но в ручном режиме. Также об этом есть упоминание в виде отдельной сноски. Что касательно порта D5 (GPIO14), то он свободен. Единственное, что Вы могли упустить, это удалить в основном файле вызов функции управления нагрузкой при расхождении показаний абсолютной влажности между двумя датчиками BME280. gpio_14(); // Расхождение расчетной абсолютной влажности между показаниями с двух датчиков, например, BME280 Но мне кажется, что Вы не могли пропустить её и она уже удалена. Если это так, то внимательно пересмотрите схемотехнику Вашего проекта и код обслуживающий порт GPIO14. Все должно работать. Теперь, что касательно предоставленного кода. Я посоветую Вам использовать прерывания для фиксации изменений на портах т.к в момент нажатия кнопки контроллер может заниматься, например, отгрузкой данных для web интерфейса или передачей показаний на сторонние сервера и т.к микроконтроллер ESP8266 подразумевает однопоточное выполнение кода, то все процессы протекают друг за другом. В свою очередь это говорит нам, что все задачи равны и выполняются друг за другом, независимо от того, сколько времени займет выполнение той или иной задачи. Планировщик задач, это всего лиш функция которая следуя Вашему предписанию будет вызывать уже Ваши функции по схеме: В общей цепочки кода настало время для ЦП выполнить код обработчика планировщика задач. Планировщик задач оценивает настало ли время каким то Вашим функция запуститься и вызывает их. Своего рода петля в петле и это отлично работает т.к большую часть времени контроллер простаивает, хотя работы у него с головой, но вся она очень быстрая. Таким образом планировщик задач получает время ЦП множество раз в секунду, что и заставляет нас видеть, как будто задачи реально выполняются параллельно, но к моему сожалению, это не так, а значит, вы можете не зафиксировать нажатие кнопки. Также при нажатии кнопки неизбежно происходит дребезг контактов, от него можно уйти двумя способами - программно и аппаратно. Аппаратный способ представляет из себя RC цепочку, об этом есть много информации в интернете, но т.к вы используете внутреннюю подтяжку, то останется только добавить конденсатор последовательно с кнопкой. Программный способ более сложный и подразумевает, что вводится время игнорирования сигнала, например, с момента первого нажатия кнопки, устанавливается интервал, пусть это будет 100 мс, в течении которых все последующие нажатия игнорируются. Это идеальный способ для большого и многозадачного, в плане количества выполняемых задач, проекта. Есть еще ПЛОХОЙ способ борьбы с дребезгом, обычно используется без прерываний, но с прерываниями он был бы еще хуже и приносил бы только вред, это использование sleep в коде после фиксации нажатия. Я не буду договаривать или намекать как это реализуется, т.к это вредный совет, но знайте, что такой подход имеет право на жизнь, исключительно в программах малонагруженных и обычно обслуживающих что-то связанное с наблюдением да парой контактов, обычно это кодовые замки и сигнализации, где время нажатия, по меркам контроллера, очень долгое или контакт вовсе не восстанавливается. К сожалению, у ESP8266 один аналоговый вход, используемый для снятия данных о напряжении питания, но если использовать i2c расширитель портов с аппаратным прерыванием и поддержкой аналоговых входов, то Вам понадобится всего один дополнительный цифровой порт ESP8266 и i2c шина которая и так имеется для фиксации нажатия баснословна огромного количества кнопок если их подключать через резисторы разного нанимала на один порт. Это позволит, в зависимости от значения, полученного с аналогового порта определять какая кнопка нажата или вообще нажатие нескольких кнопок одновременно, но это не совсем просто в некоторых случаях.
  22. Kitsum

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

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

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

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

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

    @Devilisimo доброе время суток. Рад, что у все получилось, но не затруднит ли Вас описать точное количество и типы датчиков на i2c шине в те моменты, когда вылетала ошибка? Не совсем ясно, сколько датчиков BME использовалось по факту до того момента, когда была добавлена конфигурация "для двух датчиков". На Nano проверяли путем подключения одного датчика и запуска одного из стандартных примеров?
  25. Тема является своего рода заметкой по мониторингу источников бесперебойного питания фирмы ippon. Заметкой именно потому, что шаблон был написан уже давно, а статья так и не появилась на свет и как обычно бывает, все постепенно начинает забываться, а наработанная информация растворяться в бытие. Дабы не потерять последние крошки выкидываем оставшиеся наработки. Постепенно тема будет переписана и дополнена. Самым удобным способом мониторинга является, уже знакомый нам по теме с ИБП APC, протокол SNMP. Для подключения устройства в локальную сеть необходимо дополнить его сетевым адаптером UPS Ippon Smart Winner 1500/2000/3000. Сама карточка поддерживает следующие протоколы: HTTP HTTPS IPv4 IPv6 NTP SMTP SNMP v1 SNMP v2c SNMP v3 SSH V1 SSH V2 SSL TCP/IP Telnet На диске, идущем в комплекте, имеется весь необходимый софт и документация. Также, если немного покопаться, можно найти MIB файл со всеми поддерживаемыми OID. На всякий случай мы прикрепим к посту MIB файл на базе которого был создан текущий шаблон. Перед тем как перейти к шаблону хочу отметить, что он содержит макрос {$SNMP_COMMUNITY} значение которого необходимо изменить на используемое вами Community. Шаблон позволяет производить мониторинг следующих параметров: The measured output real complex power in VA Величина отрицательного напряжения аккумуляторной батареи Величина положительного напряжения аккумуляторной батареи Версия прошивки Network Management Card Версия прошивки микропроцессора Время оставшееся до истощения заряда батареи Время прошедшее с момента перехода на работу от батареи Входная мощность Входное напряжение Входной ток Выходная мощность Выходная нагрузка ИБП в процентах от номинальной мощности Выходное напряжение Выходное напряжение Выходной ток Код неисправности ИБП из таблицы Q6 Код предупреждения ИБП из таблицы Q6 Максимальная разрешенная выходная нагрузка Максимальная разрешенная рабочая температура Модель ИБП Название производителя Описание напитанной нагрузки (устанавливается администратором) Описание устройства (устанавливается администратором) Серийный номер Статус батареи Текущее состояние ИБП Температура батареи Температура внутри ИБП Уровень заряда батареи Частота тока на входе Частота тока на выходе Данных параметров должно быть достаточно для создание базовых проверок и триггеров. Мы добавили несколько для основных тревог. И пару базовых графиков. Данный шаблон вполне подойдет для создания на его основе Ваших решений. Мы будем рады увидеть Ваши наработки или помочь Вам в реализации, каких либо идей по мониторингу этих источников бесперебойного питания. EPPC.MIB.zip templates_ups_ippon.xml.zip
×