Jump to content
iT4iT.CLUB

Leaderboard


Popular Content

Showing content with the highest reputation since 08/14/2015 in all areas

  1. 5 points
    Всем привет, в этой статье поговорим об уже надоевшей всем теме - "Метеостанция". Каждый пытается сделать что-то свое, вот и я не стал исключением и попытался материализовать свои эротические фантазии на контроллере 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 Естественно никто не запрещает Вам развести свою плату. Если Вы это сделаете, скиньте нам свое творение, возможно мы перейдем на него. В идеале, все должно размещаться в метеобудке. Датчики взятые за основу Теперь настал момент озаботиться, где описанные выше ребята будут жить. В прошлый раз мы использовали для этих целей, найденную в подножном корме, электрическую распределительную коробку. Кроме дешевизны в этом решении нет ничего положительного. В этот раз мы воспользуемся более серьезным вариантом – "Метеорологическая будка Стивенсона". Она способна защитить датчики от прямых воздействий окружающей среды, но при этом имеет открытую структуру со стенками в виде жалюзи. Удобно, красиво и самое главное – правильно! Будка печатается на 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, версия 2.6.2 (на версиях выше работоспособность не проверялась) Установленный модуль в Arduino IDE для загрузки файлов во Flash память микроконтроллера. Как установить описано тут. Для работы модуля загрузки файлов во Flash может понадобится последняя версия Python https://www.python.org/downloads/ Любой модуль на базе ESP8266 c Flash 4MB (3MB выделяем под SPIFFS) В параметрах выставляем lwIP версии 2 и максимальную производительность (lwIP v2 Higher Bandwidth) Сам архив с последней версией проекта. Скачать можно в конце статьи или по этой ссылке. Обязательные библиотеки (!!!Читать обязательно!!!) ArduinoJson (v5.13.5) PubSubClient Ссылки на библиотеки сенсоров указаны в комментариях к коду. Сами библиотеки, как и обслуживаемые ими сенсоры, не являются обязательными. Вы вольны использовать любые датчики, как физические, так и программные. Порядок установки (!!!Читать обязательно!!!) Изучите файлы проекта с примерами использования тех или иных сенсоров. Все файлы с примерами начинаются с префикса users_, это users_auto.h, users_bme280_x2.h и т.д. Загрузите необходимые Вам библиотеки или используйте эти файлы как пример для добавления иных датчиков. Выставите необходимые настройки для контроллера в среде разработки Arduino IDE. Пример настроек указан на скриншоте выше. Обязательно убедитесь, что выбрано правильное распределение места для внутренней файловой системы, это значит, что 3MB должно быть выделено под файловую систему. Также проверяем, чтобы использовался lwIP v2 в режиме максимальной производительности (lwIP v2 Higher Bandwidth). Произведите загрузку программы с помощью среды разработки (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. 5 points

    Version update 27.01.2020

    2,898 downloads

    Хотите помочь проекту или спонсировать новый? Yandex.Money PayPal.me Тема проекта Arduino IDE + Project + Libraries + tools: https://yadi.sk/d/jseefFB50NMhAg
  3. 5 points
    Обновление от 27.02.2018 (v2.0 Beta) Друзья, всем доброе время суток. Немного не хватает времени и технических возможностей подготовить все как положено до конца месяца, в связи с этим прошу отнестись с пониманием. Основная статья будет переписана в течении нескольких дней после публикации этого сообщения. Все исходники, по доброй традиции, опубликованы в первом сообщении темы. Краткий список изменений Требования Arduino IDE c поддержкой esp8266 v2.4.0+ Любой модуль на базе ESP8266 c Flash 4MB (3MB выделяем под SPIFFS) Код для микроконтроллера структурирован и разбит на модули, что делает его более простым для понимания и внесения изменений config.h - работа с файлом конфигурации хранящимся во flash памяти микроконтроллера в формате json. Реализована возможность быстрого добавления пользовательских параметров. Поиск, чтение, запись этих параметров, а также специализированные функции для работы с WEB интерфейсом – обновление и запись группы параметров, переданных в формате json и формирование списка параметров и их значений с фильтрацией паролей для их скрытия при передаче в WEB интерфейс (в WEB интерфейсе реализована ответная часть). cron.h - планировщик заданий основной целью которого является выполнение пользовательских заданий с установленным интервалом времени. Задания представляют из себя функции описанные пользователем. На данный момент они не должны принимать или возвращать никаких значений, обязаны выполнять всю работу самостоятельно или с помощью глобальных объектов. Интервал выполнения задания выставляется в миллисекундах или с помощью макросов, представляющих из себя человекочитаемые имена, за которыми скрываются часто используемые отрезки времени в миллисекундах. Доступен дополнительный функционал в виде поиска задания в журнале, сброс его интервала вызова, выставление нового интервала, остановка выполнения и проверка активности задания. gpio.h - не является модулем. Содержит примеры реализации работы с GPIO для самых часто упоминаемых пользователями задач – управление нагрузкой по превышению установленных через WEB интерфейс приделов температуры и влажности, а также управление нагрузкой при расхождении расчетных значений абсолютной влажности между показаниями двух датчиков. sensors.h - тестовый вариант модуля для реализации автоматического сбора данных с пользовательских датчиков. Очень тесно завязан с планировщиком заданий и http сервером. Преследует только одну цель – избавить пользователя от внесения изменений в большую часть кода при составления собственного набора датчиков, в том числе не описанных в проекте, работающих на других шинах данных или с другими библиотеками. Также позволяет создавать программные сенсоры для вывода расчетных данных, например, абсолютная влажность или любой иной информации представленной в числовом виде. Это могут быть данные об уровне сигнала, напряжения питания или значение с аналогово порта. Помимо добавления сенсоров доступен поиск по списку всех сенсоров, проверка и изменения статуса (актуально только для i2c шины), получение последнего собранного значение с одного или группы сенсоров, аналогичная процедура для логов (активируются для каждого сенсора отдельно) и формирование списка в формате json из всех сенсоров с описанием всех необходимых характеристик. services.h - не является модулем. Содержит примеры реализации передачи показаний на внешние ресурсы на примере связи с MQTT брокером, а также передача данных через Rest API на такие ресурсы как "ThingSpeak" или "Народный мониторинг". tools.h - содержит набор вспомогательных утилит. webserver.h - Основная рабочая лошадка. Представляет из себя http сервер с реализацией API для обмена данными с WEB интерфейсом проекта, а также работающий с файлами во flash памяти микроконтроллера. Тесно связан со всеми модулями. Описание всего функционала заслуживает отдельного раздела. wifi.h - модуль описывает режимы работы Wi-Fi а также переключение между ними. Добавлена поддержка работы со скрытыми беспроводными сетями. В связи с тем, что целью было охватить все желаемые пользователями датчики, код был унифицирован и теперь поддерживает работу с любыми источниками данных. Примеры пользовательской конфигурации расположены в следующих файлах. users_auto.h - не является модулем. Содержит пример с реализацией выбора используемых датчиков с помощью подобия виртуальных переключателей ON/OFF. Также является примером как добавлять датчики в систему с использованием лямбда функций. Не совместим с users_bme280_x2.h users_bme280_x2.h - не является модулем. Содержи пример реализации работы с двумя датчиками BME280 на I2C шине. В отличие от users_auto.h, при добавлении нового датчика используются обычные функции. Не совместим с users_auto.h Изменения в WEB интерфейсе WEB интерфейс больше не запрашивает дублирующие файлы с внешних ресурсов, все необходимое для работы хранится на микроконтроллере. Список индикаторов на главной странице строится автоматически в зависимости от данных предоставленных объектом sensors через API. Добавлена поддержка двух групп датчиков – внешних и внутренних. Группа внешних сенсоров считается основной и отображается по умолчанию. Если зафиксировано наличие внутренней группы, то в меню будет добавлен переключает с индикацией выбранной группы. Исправлен баг с блокировкой доступа к панели управления из-за паразитных cookies различных систем аналитики. Изменен алгоритм работы системы защиты доступа к панели управления – реакция на брутфорс пароля или cookies, метод генерации соли и т.п. Также клиент получает соответствующее уведомление при блокировке доступа. В разделе основных настроек добавлена возможность изменять имя контроллера для MDNS протокола. Изменения вступят в силу в течении 10 минут или после перезапуска микроконтроллера. Найти устройство можно по этому имени в зоне ".local", по умолчанию "espws.local". Также в основных настройках добавлен пункт подтверждения пароля для домашней беспроводной сети. Его отсутствие было историческим упущением, но справедливость наконец восторжествовала. Раздел "Система" был расширен и теперь включает в себя всю информацию о текущем подключении. Также добавлена возможность динамического обновления некоторых данных, в список входят: уровень сигнала, напряжение питания и объем свободной памяти. В разделе обновления прошивки микроконтроллера ужесточена проверка контрольной суммы загружаемого файла, теперь нельзя загрузить программу без этих расчетов. Ранее просто выводилось предупреждение. Также увеличен список расшифровок ответа микроконтроллера в ходе обновления микропрограммы. В разделе "Файловая система" отображается корректный объем доступной flash памяти для внутренней файловой системы. Добавлен раздел для внешнего коллектора данных “ThingSpeak”. Пока доступен только ввод ключа для работы с API. По Вашим просьбам был добавлен раздел "Контроль состояния GPIO". Это пробный вариант конфигурации взаимодействия ESP8266 с внешней нагрузкой через WEB интерфейс. На данный момент в разделе присутствуют два параметра выставляющие границу включения внешней нагрузки при превышении установленных значений температуры или влажности. Доработана система оповещений. Мелкие правки и исправления ошибок в коде web интерфейса. В связи с тем, что старая реализация графика была нацелена на конкретные данные, унификация его кода на данный момент невозможна. График работает, но принимает строго указанные значения. Данная проблема будет решена позже. PS: Еще раз прошу отнестись с понимание и обратить внимание, что это тестовая версия. Спасибо.
  4. 5 points
    В продолжение темы будем пробовать подружить Arduino + RFID ридер MFRC522 c Ethernet и MySQL базой данных, в которой будут храниться наши ключи. Автором идеи является svchekalin. Это первый вариант реализации СКУД на Arduino с использование БД, уверен, что в дальнейшем получится значительно улучшить работу программы. Первым делом необходимо озаботиться созданием самой базы для ключей. Подразумевается, что раз Вас интересует вопрос хранения ключей не в EEPROM, а во внешней СУБД, то Вы имеете представление о MySQL, работе с ней и сам сервер базы данных у Вас имеется. Я не буду описывать тут процесс его установки и настройки т.к. эта тема не для этого раздела. Создадим базу данных с именем "test" и добавим в ней таблицу с именем rc522 со следующей схемой: CREATE TABLE IF NOT EXISTS `rc522` ( `uid` bigint(12) NOT NULL, `type` enum('0','1','2') NOT NULL DEFAULT '2', `description` varchar(250) DEFAULT NULL, UNIQUE KEY `uid` (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; uid - содержит id ключа type - тип ключа. Может быть один из трех вариантов: 0 - ключ в базе, но деактивирован, 1 - мастер ключ, 2 - обычный ключ description - поле не используется в работе замка. Подразумевается, что в дальнейшем будет использоваться некая web форма для работы с ключами, и данное поле будет содержать некое описание, например ФИО владельца ключа. Первый ключ необходимо добавить самостоятельно. Код ключа можно узнать из консоли при попытки открыть замок. iT4iT CLUB (C) 2015 https://it4it.club Connected to server version 5.5.47-0+deb7u1 KEY: 3177510 access dany Disconnected. Чтобы добавить ключ 3177510 в базу и сделать его мастером необходимо выполнить SQL запрос: INSERT INTO `rc522` (`uid`, `type`) VALUES (3177510, '1'); База и таблица созданы, мастер ключ добавлен, переходим к монтажу электронной части. Я использовал Arduino UNO c Ethernet Shield на чипе W5100 (если Вы хотите подвязать ENC28J60, сразу советую отказаться от этой идеи). Сам шилд и библиотека Ethernet.h используют заранее определенные контакты SPI шины, это: 13 - SCK 12 - MISO 11 - MOSI 10 - SS В тоже время RFID сканер MFRC522 тоже использует SPI шину, и чтобы он чувствовал себя не ущемленным в правах, необходимо его пины SS и RST перенести: 13 - SCK 12 - MISO 11 - MOSI 9 - SS 8 - RST Все это дело будет выглядеть следующим образом. Переходим к скетчу. Для его работы понадобятся следующие дополнительные библиотеки: RFID-RC522 (NRF) Bounce2 (избавляет от дребезга контактов при нажатии кнопок) MySQL Connector (реализует работу с базой данных) Сам скетч Сразу хочу уточнить некоторые моменты. В программе Вам необходимо указать имя пользователя и пароль к MySQL серверу. Пользователь должен обладать достаточными правами для доступа к созданной в начале статьи базе. Также не забудьте указать IP адрес самого сервера в Вашей локальной сети. IPAddress server(10, 10, 10, 254); // IP адрес MySQL сервера char user[] = "login"; // MySQL username char password[] = "password"; // MySQL password Если Вы решили изменить имя базы или таблицы на какие-нибудь другие, то необходимо отредактировать константы, содержащие SQL запросы. const char QUERY_S[] = "SELECT type FROM test.rc522 WHERE uid = %s;"; const char QUERY_I[] = "INSERT INTO test.rc522 (uid) VALUES ('%s');"; Как видите, имя базы и таблицы указаны через разделитель точку ".", и в данном примере база имеет имя test а таблица rc522, что соответствует записи test.rc522 Алгоритм работы схож с предыдущими вариантами замка, за исключением того, что EEPROM в данной версии не используется. Соответственно и мастер ключ самостоятельно не создается, именно поэтому мы добавили его в базу руками. Связь с базой и последующая обработка ответа происходит с некоторой задержкой, это связано с производительностью контроллера, особенностями работы библиотеки, самой программы и т.д и т.п. В моем случае, время с момента начала считывания метки до реакции на неё занимало до 3 сек. Плюс ко всему, из-за определенных обстоятельств, MySQL сервер пришлось поднимать на Raspberry PI, а это далеко не лучший вариант для СУБД. В данный момент на одну аутентификацию метки требуется создать одно подключение и один запрос, это тоже увеличивает время реакции. Можно устанавливать соединение с базой при подачи питания на Arduino и просто клепать запросы. Такой вариант уменьшит время реакции в два раза, НО есть ложка дегтя в этой бочке. Если по каким либо причинам связь с сервером будет прервана (а оно так и будет, т.к. 100% гарантию дает только страховой полис), то контроллер зависнет при попытке выполнить заброс к БД. Проснуться он сможет только с помощью сторожевого таймера. В общем, этот момент еще будет проработан в следующих версиях замка. Думаю, что с нормальной СУБД время реакции уменьшится до 2 сек. Для входа в режим программирования необходимо, после того как замок разблокируется, удерживать мастер ключ еще 5 секунд у RFID сканера. Произойдет звуковой сигнал, а замок откроется, и будет находиться в таком состоянии пока Вы не выйдите из режима программирования (повторно удерживаем мастер ключ у сканера до звукового сигнала). В режиме программирования, как и в предыдущих версиях замка, все новые ключи будут записаны в MySQL. Все действия по-прежнему сопровождаются отчетами в Serial мониторе. Вот пример с попытками добавить существующий ключ в базу и добавлением нового ключа. IP: 10.10.10.97 # <- IP адрес полученный от DHCP сервера iT4iT CLUB (C) 2015 https://it4it.club Connected to server version 5.5.47-0+deb7u1 # <- Поднесен новый ключ. Подключаемся к MySQL серверу KEY: 26214177213 # <- ID текущего ключа у RC522 сканера access allow # <- Доступ разрешен (ключ в базе с меткой 1 - мастер) Disconnected. # <- Отключаемся от сервера * closed lock # <- Замок автоматически закрылся, НО КЛЮЧ ВСЕ ЕЩЕ У СКАНЕРА! MASTER PROGRAMMING MODE ON # <- После 5сек. Вход в режим программирования. Connected to server version 5.5.47-0+deb7u1 # <- Поднесен новый ключ. Подключаемся к MySQL серверу KEY: 204641111 # <- ID текущего ключа у RC522 сканера error: key elrady exists in eeprom # <- ID ключа уже прописан на сервере <!> Disconnected. # <- Отключаемся от сервера Connected to server version 5.5.47-0+deb7u1 # <- Поднесен новый ключ. Подключаемся к MySQL серверу KEY: 3177510 # <- ID текущего ключа у RC522 сканера add key in MySQL # <- ID ключа не найден в СУБД. Arduino завписывает новый ключ в базу. Disconnected. # <- Отключаемся от сервера Connected to server version 5.5.47-0+deb7u1 # <- ID текущего ключа у RC522 сканера KEY: 26214177213 # <- ID ключа найден в СУБД (ключ в базе с меткой 1 - мастер) Disconnected. # <- Отключаемся от сервера MASTER PROGRAMMING MODE OFF # <- Выходим из режима программирования PS: На данный момент это полностью рабочий вариант и отличная отправная точка для будущих изменений.
  5. 4 points
    Доброе время суток. Вот небольшой спойлер, но работы ведутся совсем не такими темпами как мне бы хотелось, банально из-за нехватки времени в связи с переездом в другой город и со всеми вытекающими из этого событиями. Я постарался сделать снимок экрана так, чтобы, присмотревшись к косвенным признакам, была возможность понять, что уже реализовано и, что используется в коде. Последние изменения были сделаны еще в конце лета 2019. @kamikozz Рад, что Вы с таким азартом отнеслись к этому проекту. Но, к сожалению, Вы упустили главную мысль - проект модульный и wifi.h один из модулей с малым количеством зависимостей, а если быть точным, то от него не зависят другие модули вообще. Вы вправе вообще удалить его или полностью переписать согласно необходимой логике работы. Главная идея wifi.h, это балансировка между режимами AP и STA. Нормальным считается, что контроллер подключен к домашней беспроводной сети, если этот пункт не выполнен, то контроллер переходит в режим AP и периодически пытается найти домашнюю сеть. В этом режиме мы получаем возможность его перенастроить т.к контроллер мог потерять домашнюю сеть из-за того, что у неё изменился SSID или контроллер переехал на другое место жительства. В Вашем случае работа данного модуля немного противоречит тому, что Вы хотите получить т.к в случае отсутствия связи с домашней точкой доступа контроллер будет пытаться её найти, а это возможно только при переводе контроллера в режим STA для сканирования эфира. В Вашем случае в этом нет необходимости, и можно пользоваться штатными средствами восстановления связи, предоставляемыми на аппаратном уровне т.к для установки новой точки доступа в качестве домашней, достаточно подключиться к точке поднимаемой контроллером в режиме AP+STA, ведь она доступна всегда. Но у меня вопрос, зачем Вам режим AP+STA? Возможно лучше и надежнее подключить второй контроллер к общей с первым точке доступа и просто перекидываться через HTTP API запросами? Почему я это спрашиваю - дело в том, что я упоминал, в том числе и в первом посте, что мы ограничены количеством обрабатываемых контроллером запросов и при некоторой нагрузке все может поломаться. Кстати, именно по этой причине много кода WEB интерфейса размазано по малому количеству файлов, в Index.htm валяется и css и java, а в css сохранены некоторые картинки. Динамическая подгрузка компонентов. Все это позволяет уложиться в минимальное, как я это видел, количество tcp соединений с контроллером т.к браузер загружает все компоненты страницы параллельно, а текущий web сервер не способен обрабатывать более одного соединения за раз, да и у контроллера попросту нет на это ресурсов. Обязательно помните об этом. Но вернемся к wifi.h. Если Вам ближе режим AP+STA место центрального маршрутизатора для обоих контроллеров, то просто удалите wifi.h и в основном файле добавьте необходимый режим. Убедитесь, что имеете доступ со стороны AP и STA. После этого можете начинать прикручивать сохраненные в config значения параметров для поднятия точки с нужным именем и для подключения к домашней точке доступа. @Neon @den48rus давайте разбираться с NRF. Под рукой, в текущий момент, её нет, но мы попробуем и пробежимся по основным моментам. На сколько я понимаю, подключается она по SPI, а это значит, что потребуется много портов. Следовательно, Вам придется освободить все порты, используемые под управление нагрузкой, но скорее всего еще что-то. На фото ниже видны 5 основных портов для передачи данных и один для прерывания. В данном проекте придется использовать прерывания т.к NRF может получить данные в момент когда будет происходить другая длительная операция, например загрузка web интерфейса. В таком случае данные будут потеряны. Прерывание поможет получать данные в тот момент когда, они пришли и это будет незаметно для остальных процессов. Бегло, я нашел информацию, что прерывание генерирует низкий уровень сигнала на порту IRQ. Отследить его можно с помощью attachInterrupt. В функции, которая будет вызвана при прерывании реализуйте логику чтения данных, как это делается в обычном случае. А теперь самое интересное. Например, в библиотеки RF24.h, которую, как мне кажется, используют многие, возможно использовать свой тип данных для передачи. Таким образом Вы можете объявить свою структуру, в которой можно определить что угодно. Допустим не просто пустые и безликие данные, а тип сенсора, показания с нескольких датчиков и, например, напряжение питания удаленного устройства. struct { byte type; float temperature; float humidity; float voltage; } nrf_data; nrf_data remote_sensor; Теперь важный момент. Переменная, которую мы будем использовать для хранения данных (в примере remote_sensor), должна быть объявлена в глобальном пространстве имен чтобы избежать проблем в дальнейшем, конечно, если у Вас нет иного механизма передачи данных между модулями проекта. После того как данные будут переданы, они будут сохранены в оперативной памяти микроконтроллера. Теперь их необходимо связать с сенсором, а это уже совсем не сложно. sensors.add(new knob_t(0, 100, ".01", "Влажность", "%"), "Humidity", [&](){ return remote_sensor.humidity; } ); Конечно, могут быть ситуации, когда в момент чтения переменной будет произведена попытка её перезаписи, но и это можно решить. В общем, у Вас все должно получиться. Но если будут вопросы, то обязательно пишите, и я постараюсь найти NFR24 и подготовить полноценный код для решения этой задачи.
  6. 4 points
    Доброе время суток Хорошая задачка. Полагаю, что Вы используете последнюю версия проекта. Решить задачу можно тремя способами и они потребуют физического доступа к контроллеру. В основном файле проекта, практически в самом начале, имеется описание констант отвечающих за инициализацию Serial монитора. /* Консоль */ #define console Serial // Обязательно закомментируйте эту строку перед финальной загрузкой программы #define consoleSpeed 115200 Если Вы не воспользовались подсказкой из комментария, то пароль засветится в консоли при рестарте контроллера. Еще один вариант, это затереть конфигурационный файл, но сделать это можно только загрузив по новой файлы WEB сервера. Эта операция полностью удаляет текущее содержимое области флешь памяти, выделенную под внутривенную файловую систему и записывает её новый образ. При этом файл конфигурации в образе отсутствует и будет создан самим контроллером в ходе выполнения программы. Данные авторизации будут сброшены по умолчанию - admin\admin Еще один способ подразумевает обновление программы микроконтроллера и игнорирование части конфигурационного файла или его удаление, но тогда обновлять программу придется дважды. Второй раз чтобы откатить изменения и восстановить функционал. Для этого в файле webserver.h найдите функцию bool http::authorized() она отвечает за проверку авторизации пользователя с помощью cookies. Приведите её к следующему виду. bool http::authorized() { return true; } После загрузки программы Вы сможете зайти в панель управления обойдя форму авторизации и изменить пароль. Данный способ хорош если Вам необходимо сохранить ключи доступа к внешним серверам и т.п В Вашем случае другого способа перехватить пароль нет т.к он передается только от пользователя к микроконтроллеру и никогда в обратную сторону. Подбор пароля тоже усложнен т.к лимит попыток входа ограничен и Вы вероятно спровоцируете тревогу поднятую функцией bool http::security() её описание и подробный комментарий также можно посмотреть в файле webserver.h Это первое, что приходит в голову, но если вы найдете другой способ, то дайте знать, буду очень признателен. Теперь о графиках и выхода за приделы суточного интервала. Графики отъедают очень много памяти, да и сам проект про то как получилось у меня, а не как стоит делать, но все же. Вам предстоит внимательно поработать с несколькими файлами: Файл sensors.h в котором описана логика работы с сенсорами. В описании класса sensors имеется приватная переменная содержащая размер массива выделяемого под хранение лога для каждого сенсора в котором эти самые логи активированы. byte logSize = 144; Значение 144 выбрано исходя из интервала между точками на графике, который равен 10-и минутам. Полные сутки содержат 144 значение. Чтобы увеличить количество выделенной памяти, необходимо увеличить это значение. Увеличьте это значение до адекватного и необходимо для Вас значения, главное, чтобы оно было кратно 144. byte logSize = 432; // Вариант для трех дней byte logSize = 144 * 5; // Или иной вариант записи для 5-и дней (по мне такой вариант записи более предпочтителен) Главное не перегнуть палку, всегда следите за памятью. Файл users_auto.h или users_bme280_x2.h или Ваш файл, в котором описаны используемые сенсоры. Вот пример описывающий датчик температуры. sensors.add(T, device::out, 0x76, "out_temperature", out_init, out_temp, true); Последнее значение метода add, то которое true, указывает, что необходимо вести логи. У тех сенсоров, для которых не требуется видение логов, не указывайте это значение вообще или измените его на false. Оставьте только действительно необходимые логи. Файл index.htm содержит две функции в которых производится построение графика $(".sensor .log").click(function(){ /* ... */ }); $("#graph").click(function() { /* ... */ }); Обе эти функции содержат расчетное временное значение первой точки графика в мс. new Date().getTime() - obj.timeAdjustment - 143 * 10 * 60 * 1000; Необходимо сдвинуть его на выбранный вами интервал времени, например, три дня. new Date().getTime() - obj.timeAdjustment - (144 * 3 - 1) * 10 * 60 * 1000; Вроде бы на этом все, надеюсь не обсчитался в точках. Сохраняем и обновляем программу и файлы. Что касаемо самих файлов WEB сервера и их упаковки: Как все уже правильно заметили, файлы упакованы только для уменьшения их размера, можно использовать их без сжатия. Но при наличии у микроконтроллера сжатого файла и его не сжатой копии, приоритет будет отдан сжатому файлу и именно он будет отдан пользователю при загрузке страницы. Оригинальные файлы сжаты с помощью архиватора 7-Zip. Формат сжатия GZIP, уровень сжатия Ультра (максимально возможный). Исходный код файлов написан в кодировке UTF-8 Сугубо мое мнение: если Вы хотите внести серьезные изменения в код, то стоит воспользоваться специализированным редактором, который сможет предупредить об опечатки или нарушении синтаксиса. Рекламировать ничего не буду, в сети множество редакторов для WEB разработок с поддержкой HTML и JavaScript
  7. 4 points
    Друзья. Спасибо Вам за проявленный интерес к проекту. Хочу еще раз напомнить, что следующее обновление будет очень большим, своего рода v2.0 для всего проекта. В связи с этим, практически все исправления в теме станут не актуальны как в плане доработки, так и в плане их использования для собственных наработок.
  8. 3 points
    Обновление по просьбе Alex13 находится тут Открытие/Закрытие разнесены на разные пины микроконтроллера (для управление соленоидом) Обновление по просьбе Alex13 находится тут Добавлен выбор режима закрытия замка (автоматический или по карте) Добавлена сигнализация оповещающая о попытках подбора ключа Обновление по просьбе svchekalin находится тут Добавлен Ethernet Shield на чипе W5100 Ключи теперь хранятся не в EEPROM контроллера, а в MySQL базе на удаленном сервере ... Внимание: Очень много фотографий в статье! Начнем с предыстории. В один обыденный рабочий день ко мне обратились мои друзья и по совместительству коллеги по работе с идеей сделать замок с радиочастотной идентификацией. Электронный замок должен обслуживать дверь в рабочее помещение. Все бы хорошо, но дверь далеко не домашняя, сделана из метала и стоит в металлической коробки. Собрать электронную начинку замка и написать программу для микроконтроллера - решаемая задача, но как механически удержать такого монстра в зафиксированном состоянии? Но то, что для меня казалось проблемой, было воспринято моими друзьями с ухмылкой, и мне показали здоровый электромагнит. Точно такие же электромагниты используются в домофонах. Даже не хочу знать, откуда они его достали, но меня увиденное воодушевило. Задача поставлена, приступаем к реализации! Техническое задание Замок должен аутентифицировать хозяев без физического контакта пользователя с устройством Память должна вмещать не менее двух десятков ключей Устройство должно иметь возможность добавлять в память новые ключи Добавлять новые ключи можно только, используя специальный, мастер ключ Мастер ключ должен также иметь возможность открывать замок Должна быть реализована возможность обнуления списка используемых ключей, в том числе и удаление мастер ключа Замок должен иметь возможность открываться изнутри по нажатию на кнопку (как в домофоне) Все описанные пункты должны быть просты в использовании и не требовать знания программирования Реализация За основу было решено взять клон Arduino UNO с ATmega328p на борту в паре с RFID (NRF) сканером RC522. Сам сканер является очень удачным выбором т.к работает на частоте 13.56 МГц и поддерживает чипы: MIFARE S50 MIFARE S70 MIFARE UltraLight MIFARE Pro MIFARE DESfire ... Данные чипы используются в различных карточках метро и прочего общественного транспорта, ключах современных домофонов, различных умных браслетах и носимой электроники. У братьев Китайцев можно купить даже кольца с RFID (NRF) меткой. Некоторые чипы имеют энергонезависимую память небольшого объема. Прокручиваем решение в голове Хранить все ключи будем в энергонезависимой памяти микроконтроллера (EEPROM). Хорошее и как мне кажется единственное решение. ATmega328p имеет 1kB памяти, RFID (NRF) ключи содержат уникальный номер размером от 4 до N байт. Если уровнять все типы ключей, то читать мы будем только первый четыре байта любого ключа. Делаем вывод, что 1024/4=256 ключей. Но необходимо знать точное их количество чтобы не читать пустую память, иначе можно взломать замок так, как это делается с некоторыми домофонами, а именно - передать ключ, состоящий из одних 0 или 255 и Вуаля! Выделим один и по совместительству первый байт в EEPROM под число с количеством ключей и получаем (1024-1)/4=255,75, а это 255 полноценных четырехбайтных ключей! Это более чем достаточно, хоть домофон делай. Добавлять ключи будем путем записи его первых четырех байт, в свободную память микроконтроллера, начиная с N+1 занятого байта памяти Arduino. Но делать это необходимо только с использованием мастер ключа. И тут встают два вопроса, какой из ключей должен быть мастером и как его найти среди кучи всех остальных? А пусть мастер ключ хранится в строго определенных "ячейках" памяти микроконтроллера, мы ведь делаем это с количеством ключей! Пусть первый байт EEPROM отвечает за количество известных нам ключей, а следующие четыре байта будут отведены мастер ключу. Оставшуюся память отдаем под все остальное. Открытие дверей. Как понять, что поднесенный к сканеру ключ является тем самым или наоборот. Давайте опять отталкиваться от идеи четырехбайтного ключа. Пройдя все предыдущие этапы записи памяти микроконтроллера, мы с 100% точностью можем сказать, сколько ключей и как они расположены в памяти Arduino. Следовательно, для быстрого сравнения логичнее искать совпадение по первому байту каждого ключа в памяти, и только если оно найдено переходить к сравнению следующего байта. Если какой либо из 4 байт не совпал, то останавливаем проверку и переходить к следующему ключу в памяти микроконтроллера. Если найдено совпадение всех четырех байт ключа, то прекращаем проверку и устанавливаем замок в состояние открыто, иначе оставляем замок запертым. Пройдя эту не хитрую процедуру, мы можем точно сказать разрешен данному ключу доступ или нет, а заодно является ли он мастер ключом. Ведь мы будем знать номер совпавшего ключа в памяти Arduino следовательно, если он первый (на самом деле нулевой), то это волшебный ключ. Чтобы добавить новый ключ в память замка необходимо поднести и удерживать у RFID (NRF) сканера мастер ключ. Для начала будет открыта дверь, чтобы впустить владыку в обитель. Но если мастер ключ удерживается в течение 5 секунд (по умолчанию), то замок переводится в постоянно открытое состояние и система распознавания ключей, описанная ранее, начинает работать как проверка наличия ключа в памяти. Ключа нет, тогда записываем его. Ключ найден, значит, ругаемся, плюемся и топаем ногами. Таким образом, можно добавлять ключи пачками. Для выхода из режима программирования необходимо поднести ключ владыки и удерживает его 5 секунд. Для очистки памяти решено ввести красную кнопку с защитой от ложного нажатия. Если удерживать её в течение 5 секунд, то контроллер начинает перезапись EEPROM одними нулями. По окончанию операции производится перезапуск программы микроконтроллера. Но теперь нет ни единого ключа, следовательно, и мастера тоже. Непорядок! В этом безмятежном состоянии замок стоит держать постоянно открытым иначе "Се Ля Ви", что в переводе с древнегреческого "не повезло"! Первый поднесенный к сканеру ключ будет записан в память Arduino и станет мастером т.к его порядковый номер - 0. Следом за этим замок перестанет бездельничать и перейдет в состояние закрыто. С этого момента помещение считается святым, и проникнуть в него может только обладатель единственного записанного в память ключа. Для всех остальных нужно начать процедуру добавления ключей, но её мы уже придумали. Открытие двери изнутри по нажатию на волшебную кнопку поначалу показалось мне тривиальной задачей, и я добавил этот механизм простым способом (как и кнопку очистки памяти) - ногу микроконтроллера посадил через резистор на землю, а сама кнопка коммутировала на эту же ногу +5V. Все дешево и сердито, но вся соль кроется в деталях! Кнопок открытия двери будет несколько. Все они должны сидеть параллельно и самая дальняя будет расположена как минимум в 15, а то и больше, метрах от контроллера (если мерить длинной кабеля)! Это расстояние смело можно умножать на 2 и получить нереальную для +5V цифру. Необходимо пересадить ногу Arduino с GND на +5V (через резистор 10k), предварительно задействовать встроенный подтягивающий резистор микроконтроллера, а сама кнопка станет прижимать ногу к земле. Резистор между ногой и питанием необходим для избегания короткого замыкания при использовании самой кнопки. Управление электромагнитом, по понятным и так причинам, происходит через реле. Электромагнит подключен через постоянно замкнутую группу контактов и соответственно при открытии замка, на реле подается логическая единица. Это удобно т.к не приходится постоянно держать реле под напряжением, но есть и обратная сторона медали – если нет питания на контроллере, а на электромагните есть, ты открыть замок станет очень проблемной задачей. В общем, Вам самим выбирать какой из подводных камней оставить. Я свой выбор сделал. Схема подключения - РАСПИНОВКА ---------------------------------------------------------------------------- MFRC522 Arduino Arduino Arduino Arduino Arduino Reader/PCD Uno Mega Nano v3 Leonardo/Micro Pro Micro Signal Pin Pin Pin Pin Pin Pin ----------------------------------------------------------------------------------------- RST/Reset RST 9 5 D9 RESET/ICSP-5 RST SPI SS SDA(SS) 10 53 D10 10 10 SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16 SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14 SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15 ----------------------------------------------------------------------------------------- Оставлю дополнительные фото для наглядности. На самом деле, если вы будите внедрять подобное где-то в обиходе, а не просто собирать на столе, то обязательно все документируйте и перепроверяйте по несколько раз. Для быстрого монтажа я использовал плату для прототипирования. Цена на неё довольно завышена у братьев Китайцев, но я не пожалел. Перед установкой всего это добра на заслуженное рабочее место проводились испытания различных кабелей для выноса рабочей части (RFID сканера) за стену. В итоге выбор остановился на медной, многожильной витой паре используемой для прокладки Ethernet. Если использовать одножильную (моно) витую пару, то потери могут быть довольно высоки, как и с использованием различных Китайских (якобы медных) шлейфов. Гарантию работы, а соответственно и Вашего попадания в помещение, сможет гарантировать лишь страховой полис. Сам сканер был помещен в крышку от металлической коробки и закрыт стеклотекстолитом, естественно НЕ фольгированным! Полученный результат показался мне довольно сносным и был передан заказчику для установки. Для питания был задействован компьютерный блок питания, с которого, через стабилизатор напряжения 12v в 8v для запитки Arduino UNO через стандартный 5,5мм разъем. Фото монтажа За дверью все выглядит очень скромно. Т.к. сканер находится в просторном корпусе, то на него была прикреплена кнопка для электронного звонка. Довольно эстетически приятный вид, для промышленного помещения. Программная часть Вам понадобятся следующие библиотеки: RFID-RC522 (NRF) Bounce2 (избавляет от дребезга контактов при нажатии кнопок) Хотите помочь проект? Yandex.Money PayPal.me Сам скетч Все довольно плотно закомментировано, но есть большой фронт для доработки. Надеюсь, Вы дополните это создание своими идеями и нужным функционалом, а я в свою очередь уже присмотрел идеи для будущего обновления и заказал новый модуль RC522 для теста. PS: Желаю Вам приятного и надеюсь полезного использования.
  9. 3 points
    Файлы проекта обновлены. Добавлена поддержка последних, на момент публикации, версий Arduino IDE и модуля ESP8266. Добавлены небольшие исправления и доработки. При использовании, указанных в основном посте, версий программных компонентов Вы не получите вылет программы с критической ошибкой. Исправлена серьезная ошибка в медианном фильтре, кто использует проект обязательно обновите у себя объект medianFilter_t, он находится в tools.h В разделе загрузок, добавлена утилита для загрузки файлов web сервера во flash память. Также в описании к файлам, добавлена ссылка на скачивание готовой Arduino IDE со всеми библиотеками, утилитами, и последней версией проекта. Для работы модуля загрузки файлов во Flash может понадобится последняя версия Python https://www.python.org/downloads/
  10. 3 points
    Вот тут настраиваешь, и вставляешь в index.htm... мой выглядит так <a class="weatherwidget-io" href="https://forecast7.com/ru/51d3037d84/stary-oskol/" data-label_1="СТАРЫЙ ОСКОЛ" data-label_2="прогноз" data-font="Arial" data-icons="Climacons" data-theme="original" data-basecolor="" data-shadow="rgba(0, 0, 0, 0.65)" data-accent="rgba(255, 255, 255, 0.03)" data-highcolor="#febc2f" data-lowcolor="#0200ff" data-mooncolor="#c7c7c7" data-cloudcolor="#ffffff" data-cloudfill="#0003ff" data-raincolor="#0200ff" data-snowcolor="#000000" >СТАРЫЙ ОСКОЛ прогноз</a> <script> !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src='https://weatherwidget.io/js/widget.min.js';fjs.parentNode.insertBefore(js,fjs);}}(document,'script','weatherwidget-io-js'); </script>
  11. 3 points
    @Вадим, вот есть ещё такой вариант с прогнозом погоды...
  12. 3 points
    Два датчика BME280, изменения в файле index (направление ветра словом). Если кому надо... P. S. ветер, направление, облачность- подтягиваются сразу. Wether with wind direction .7z
  13. 3 points
    Для того, чтобы motion стартовал автоматически при запуске системы, попробуйте добавить разрешение на запуск юнита в systemd systemctl enable motion или /lib/systemd/systemd-sysv-install enable motion перезапускаем систему и смотрим вывод service motion status
  14. 3 points
    Добавлю свою маленькую лепту в проэкт. Немного поправил скетч и теперь замок пишет в две дополнительные таблицы события разрешенных и запрещенных действий т.е. ключ в базе и при доступе записывается его айди и время дата доступа в табличку allow также если ключа нет в базе он записывается аналогично в табличку deny. Накрапал коекакой php код который отображает данные таблиц и может дабавить ключ в базу. скетч содержание файла mysql php список ключей и форма добавления ключа думаю странички allow и deny добавлять смысла нет так как это часть кода выше
  15. 3 points
    Данный пост является шпаргалкой из собранных в сети различных материалов связанных с распиновкой (pinout) распространенных микроконтроллеров и плат на их основе. Микроконтроллеры ESP8266EX ESP32 (R1) Платы ESP-01 ESP-07 Данная плата практически полностью идентична ESP-12X, разница только в наличие керамической антенны и разъема IPX для подключения внешней антенны. ESP-12 (E/F) NodeMCU ESP32 Board ESP32-WROOM-32 (DevKitC)
  16. 3 points
    Представьте ситуацию, что Вам необходимо получить доступ к закрытому ресурсу. Это может быть, как компьютер находящийся в частной локальной сети (например, на работе), так и сервер находящийся в интернете и доступ к нему закрыт в связи с разного рода санкциями и прочей чепухой не имеющей ничего общего со здравым смыслом. Некоторые пользователи скатываются настолько низко, что могут закрыть видео на YouTube для граждан той или иной страны. Ну да Бог с ними, сама реализация описанная ниже намного более интереснее чем закрытый видеоролик и, тем более имеет намного более широкие перспективы! Все эти проблемы решает VPN, заодно он является самым распространенным способом для организации удаленных рабочих мест разными работодателями. В подавляющем большинстве случаев при использовании VPN Ваш компьютер становится частью чужой локальной сети, следовательно, маршрутизация всего трафика уже идет по чужим правилам. В рабочей обстановке это может выражаться в виде отсутствия доступа в интернет через сеть работодателя или между Вами и остальным интернетом вдруг появляется чужой Firewall и блокирует доступ к: ICQ, IRC, Skype или другим законным ресурсам. А вот если Вы используете в интернете бесплатные VPN сервера (да и платные тоже) для Ваших личных нужд, то стоит помнить о том, что весь трафик проходит где-то там и все, что Вы делаете становится известно всем заграничным друзьям. В список раскрытой информации также входят cookie используемые Вашим браузером, платежные реквизиты от электронной коммерции до банковских карт, различные ключи и много всего интересного. Кстати, отечественные сервера тоже не брезгуют воспользоваться этими данными. Самое логичное решение на мой взгляд - составить список ресурсов, с которыми необходимо работать через VPN и заворачивать их трафик в тоннель, а все остальное пускать классическим способом через местного провайдера. Сам VPN тоннель поднимать только в том случае, если появляется трафик для него. Это позволит не держать постоянно поднятый канал и сэкономит ресурсы. Приступим к реализации Первым делом нам необходимо создать список сетей, в которые мы хотим ходить через VPN. Условно назовем этот список "blackHole". Список подсетей работодателя можно узнать у самого работодателя или его IT специалистов. Но вот, что делать если необходимо получить доступ к закрытому иностранному ресурсу? Для наглядности эксперимента пусть его роль сыграет https://2ip.ru/ т.к это покажет наглядную работу системы. Давно не новость, что за DNS именем ресурса может находится несколько IP адресов, иногда даже десятки или сотни. Все их необходимо добавить. В этом случае очень хорошо, если у Вас под рукой имеется машина с UNIX подобной операционной системой с установленными утилитами Host и Whois. Если таковой нету, то утилиты нам заменят: Host: http://www.digwebinterface.com/ Whois: https://www.reg.ru/whois/ https://www.nic.ru/whois/ Узнаем список используемых IP адресов с помощью утилиты Host root@linuxPC:/# host 2ip.ru 2ip.ru has address 178.63.151.224 2ip.ru mail is handled by 10 aspmx3.googlemail.com. 2ip.ru mail is handled by 5 alt1.aspmx.l.google.com. 2ip.ru mail is handled by 5 alt2.aspmx.l.google.com. 2ip.ru mail is handled by 1 aspmx.l.google.com. 2ip.ru mail is handled by 10 aspmx2.googlemail.com. Узнаем список всех подсетей с помощью утилиты Whois. Если предыдущая операция показала наличие более одного IP адреса, то данную процедуру нужно провести для всего списка. root@linuxPC:/# whois 178.63.151.224 % This is the RIPE Database query service. % The objects are in RPSL format. % % The RIPE Database is subject to Terms and Conditions. ... route: 178.63.0.0/16 Будет очень много информации, но нас интересует только строка с параметром route. Именно эту подсеть с указанием маски мы и добавляем в список "blackHole" маршрутизатора. /ip firewall address-list add address=178.63.0.0/16 comment=2ip.ru disabled=no list=blackHole Или через WinBox в разделе IP -> Firewall -> Address List Теперь необходимо промаркировать пакеты, это позволит повлиять в дальнейшем на их маршрутизацию. Каждому пакету, который предназначается для подсети из списка "blackHole" мы дадим маркер с именем "bh". /ip firewall mangle add action=mark-routing chain=prerouting dst-address-list=blackHole log=no \ new-routing-mark=bh Или через WinBox в разделе IP -> Firewall -> Mangle Теперь нам необходимо создать подключение к VPN серверу. В сети большой выбор как бесплатных серверов с периодически меняющимися учетными данными для подключения, так и платных к которым тоже нет особого доверия. В идеале конечно лучше держать свой собственный сервер, но это требует некоторых затрат средств и выгодно только в том случае, если такой доступ необходим целой компании или организации. Настройка будет зависеть от Вашего выбора. Я нашел первый попавшийся PPTP сервер и подключился к нему. /interface pptp-client add comment="VPN blackHole" connect-to=serverName\ disabled=yes name=pptp-out1 password=password\ user=login dial-on-demand=yes keepalive-timeout=60 comment - комментарий к подключению connect-to - адрес VPN сервера disabled - устанавливаем yes пока не закончим настройку (сюрпризы не нужны) name - имя интерфейса password - пароль user - логин dial-on-demand - связь с сервером устанавливается только при необходимости keepalive-timeout - время удержания соединения в секунда до разрыва связи в случае не использования соединения Или через WinBox в разделе Interface Учитывайте, что для разных серверов одного типа настройки могут сильно отличаться. Добавляем запись Masquerade в NAT для нашего нового интерфейса. /ip firewall nat add action=masquerade chain=srcnat dst-address-list=blackHole out-interface=\ pptp-out1 Или через WinBox в разделе IP -> Firewall -> NAT Осталось дело за малым, добавить новую запись в лист маршрутизации и заворачивать пакеты с маркером "bh" на интерфейс pptp-out1 /ip route add distance=1 gateway=pptp-out1 routing-mark=bh Или через WinBox в разделе IP -> Routes Поднимаем интерфейс (естественно, что у Вас его порядковый номер может отличаться) /interface pptp-client set numbers=0 disabled=no После всех манипуляций идем на любой адрес из списка "blackHole", в нашем случае это http://2ip.ru и сравниваем адрес с данными например на http://myip.ru Теперь трафик перераспределяется нужным нам образом и можно приступить к поднятию необходимых тоннелей с серверами и маршрутизаторами на работе, в удаленных офисах и вообще с чем душе угодно.
  17. 2 points
    Тема является своего рода заметкой по мониторингу источников бесперебойного питания фирмы 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
  18. 2 points
    Доброе время суток. Сегодня мы будем собирать бесконтактный замок с использованием NFC контроллера PN532. Опираясь на опыт прошлого варианта (на контроллере MFRC522) и на отзывы тех, кто пытался повторить схему, были сделаны определенные выводы. Постараемся избавиться от старых подводных камней и поищем новые И так, что мы знаем о PN532: Очень компактный размер 42.7 x 40.4 мм Поддерживает работу по SPI, i2C и HSU (высокоскоростной UART) Читение/Запись RFID меток, может общаться с другими контроллерами PN532, и вроде как общаться с Android телефонами Рабочая дистанция 5-7 см Поддерживаемые чипы ISO 14443 Type A - NXP Mifare 1k, 4k, Ultralight, Desfire ISO 14443 Type B ISO/IEC 14443-4-совместимые чипы FeliCa Jewel TopaZ Чтение / Запись RFID меток Обмен данными P2P Передача данных смартфону Кстати, вроде как начиная с Androik 4.4 KitKat операционная система умеет эмулировать NFC метки программным способом. Это подразумевает, что мы можем на телефоне сделать копию проездного билета (БСК, Тройка) или просто обычной метки, и использовать смартфон в качестве ключа для замка. К сожалению, у меня пока нет под рукой аппарата с поддержкой NFC, а значит и проверить это мне не под силам. Оставляю эту задачу Вам! Для сборки замка нам понадобятся: Arduino UNO или любой аналог с контроллером ATmega328 Сам модуль сканера с контроллером PN532 Китайский модуль реле с опторазвязкой (в программе предусмотрена инверсия управляющего сигнала на случай управления реле напрямую или замены его на транзисторный ключ / мосфет) Две кнопки для, одна для разблокировки замка изнутри помещения, а другая для сброса памяти микроконтроллера Два резистора 10kOm и 4.7kOm Танталовый конденсатор на 1uF Светодиод для индикации о попытках взлома замка с помощью брутфорса ключа Транзистор KT315 или его аналог для управления питанием PN532. Говорят, что война между Десептиконами и Автоботами началась именно из-за этих Советских транзисторов! Зачем нужен транзистор? Он используется для управления питанием сканера, если по какой-либо причине Arduino пойдет на перезагрузку, то она потянет за собой и сканер. Таким образом мы лишний раз подстрахуем себя. Конденсатор в обвязке транзистора необходим для сглаживания пульсаций, у меня они были явно заметны при питании от USB. Конечно это все можно выкинуть из схемы и пустить на ножку VCC контроллера PN532 питание напрямую с 5V платы Arduino. Это уже на Ваш страх и риск. Критически важно обратить внимание на питание! Не поленитесь и возьмите отдельный блок питания, USB используйте только в качестве Serial монитора. На реле желательно подавать отдельное питание, на Китайских модулях для этого есть соответствующие пины (GND, VCC, JD-VCC). На схеме я это не отражено т.к каждый волен самостоятельно выбирать как управлять силовой частью замка. Может вы замените реле мосфетом. На просторах мирового интернета нашел пару изображений схем показывающий, как реализовано питание и управление китайскими релейными модулями. Так показано на схеме и так делает большинство. Все будет работать. А так будет правильно, но необходим отдельный источник питания для релейного модуля Выбор за Вами. Вернемся к сканеру. Уже упоминалось, что он имеет возможность общаться по одному из нескольких интерфейсов на выбор. Сам выбор интерфейса реализован на физическом уровне и представляет из себя сдвоенный переключатель. На изображении ниже выбран HSU (UART). В таком варианте модули приходят к нам из поднебесной. Мы будем использовать i2C интерфейс. Возможно стоило бы SPI? Все подключения можно свести к одной таблицы Как все устроено Часть функционала было позаимствовано из предыдущего варианта о котором говорилось в самом начале данного поста. При первом запуске Вам будет предложено создать мастер ключ, но не спешите это делать. Я советую Вам очистить EEPROM, для этого нажмите и удерживайте кнопку RESET до тех пор, пока не услышите звуковой сигнал. После очистки памяти контроллер будет перезапущен, замок разблокируется в ожидании первого поднесенного ключа (метки), может быть даже смартфона (ищите эмуляторы RFID меток и проверяйте). Первый поднесенный ключ станет мастером, советую его надежно спрятать дома т.к только с его помощью можно записывать новые ключи в память микроконтроллера. Кстати о памяти, вот схема как она используется, всего занято 1kB. Первые 8 байт используются для хранения системной информации. Пока заняты только первые 2 байта, а остальные 6 зарезервированы под будущие улучшения. Возможно Вы что-то захотите добавить свое. Начиная с 9 байта идут ключи. Ключи бывают разного размера, но мы будем использовать только первые его 4 байта. Первый ключ всегда идет мастер, все последующие обычные. Всего можно иметь 1 мастер и 253 обычных ключа. То есть мы израсходуем весь объем EEPROM контроллера ATmega328. Вы конечно можете воспользоваться другим контроллером, с большим количеством памяти, но программа не даст Вам создать более 254 ключей. Оставшаяся память останется свободной. И так после создания мастер ключа замок перейдет в дежурный режим, разблокировать его можно кратковременным нажатием на кнопку OPEN или самим мастер ключом. Для добавления новых ключей необходимо поднести мастер ключ к сканеру и удерживать более 5 секунд. Замок перейдет в режим программирования оповестив Вас об этом звуковым сигналом. В этом состоянии замок будет в разблокированном состоянии и все поднесенные новые ключи будет записаны в память. Для выхода из режима программирования необходимо опять поднести мастер ключ к сканеру и удерживать более 5 секунд. Звуковой сигнал оповестит об этом и замок вернется в дежурный режим. После открытия двери ключом или кнопкой запускается таймер, который закроет замок через 5 секунд. Можно удерживать замок в открытом состоянии при удержании кнопки OPEN, но при её отпускании замок сразу закроется. Теперь немного про защиту В программе имеется счетчик ложных срабатываний. Если в течении минуты будут зарегистрированы 5 попыток подбора ключа, замок будет заблокирован на 1 минуту. Открыть дверь можно будет только с кнопки OPEN. Поднесения действующего ключа, даже мастера, будет проигнорировано замком. По истечению минуты доступ будет открыт, но на этом еще не конец. Счетчик даст только одну попытку разблокировать замок, если она потерпит неудачу, блокировка повторится. Замок будет давать по одной дополнительной попытки за каждую минуту ожидания, но не более 5 попыток. Таким образом скорость подбора ключа сводится к 1 ключу в минуту, а учитывая длину ключа даже в 4 байта, тот кто захочет этим заняться должен быть бессмертным. Проще ключ украсть или сделать копию, но от этого не застрахованы даже обычные замки, но в следующем варианте программы мы позаботимся и об этом. Если кто-то пытался подобрать ключ и замок его поймал на этом, то светодиод начнет периодически мигать. И даже если отключить питания, контроллер не забудет об этом инциденте и при его восстановлении продолжит оповещать о случившемся. Интенсивность мигания будет напрямую зависеть от количества блокировок. 1 раз в секунду если была выявлена хотя бы одна блокировка 2 раза в секунду если было выявлено более 5 блокировок 3 раза в секунду если более 10 блокировок 4 раза в секунду если выявлено более 20 попыток Горит постоянно при более 50 попытках Есть два способа сбросить счетчик. Воспользоваться мастер ключом и перевести замок в режим программирования, после вернуть обратно в дежурный режим. Или удерживая активный ключ у сканера PN532 зажать кнопку OPEN на 5 секунд. В принципе на этом пока все. Для реализации Вам понадобятся следующие библиотеки: Bounce2 для программной защиты от дребезга Timer1 для удобной реализации прерываний Adafruit PN532 для связи с самим сканером Хотите помочь проект? Yandex.Money PayPal.me Сама программа замка: PN532_lock_iT4iT.CLUB.7z
  19. 2 points
    Почитайте внимательно : https://alexgyver.ru/arduino-first/
  20. 2 points
    заливал, но все равно не грузилось вэб содержимое, заработало только когда указал что флеш 4 мб, но попробую еще возможно ли не очень сложным способом добавить к метеостанции работу с NRF24L01+, чтобы радиомодуль принимал данные показаний датчиков и передавал их метеостанции интересует куда вставить код работы с NRF24 и как передать данные коду метеостанции, скетч работы с NRF24 в принципе есть, возможно нужно будет немного доработать
  21. 2 points
    скетч ардуины, принимающей данные с орегонов INT_oregon-arduino_wind_rain_1_3_4_temp_slave1_7-7-19.zip
  22. 2 points
    Доброе время суток. @post125 за проверку пароля отвечает функция в файле index.htm function checkPassw(passw) { return passw.match(/^.{5,63}$/); } Что соответствует любой строке, содержащей от 5 до 63 символов.
  23. 2 points
    Да, удалите в основном файле строку cron.add(cron::time_1m, [&](){ sensors.checkLine(); }, true); Всю инициализацию датчиков проведите самостоятельно без использования соответствующих функций при описании датчиков. Или замените указанную выше строку на разовый вызов метода checkLine sensors.checkLine(); Проверка датчиков на шине проводится через определение доступности адресов датчиков Wire.beginTransmission(sensor->address); /* ... */ sensor->status = (Wire.endTransmission() == 0); Скорее всего вы получаете не все данные при запросе данных для комплексного суточного графика в следствии чего json строка считается поврежденной и график не строится. А корень проблемы в том, что в данном случае контроллер передает данные по всем сенсорам, для которых активно ведение лога. Связано это с тем, что изначально не было графиков по конкретным сенсорам, существовал только комплексный график, соответственно и данные отдавались все и сразу. Получается, что Вы нашли придел для размера передаваемого объекта с данными. Часть кода уже переписана и прекрасно работает, но есть технические нюансы, из-за которых я не могу назвать какие-то конкретные строки. Ну и опять же, все приходится делать только в свободное время.
  24. 2 points
    Скорее всего Вы достигли придела в шаге шкалы для библиотеки Knob. Возможно Вам подойдет иной вариант отображения состояния батареи, например, в процентах отображающих полезную емкость аккумулятора, только не от 0 до maxV, а от минимально напряжения питания контроллера до maxV. Например, для ESP8266 эти границы будут от 2.2V до 3.6V, что дает нам (3.6V-2.2V)/100 = 0.014V на 1% шкалы сенсора. В таком случае, когда мы видим, что осталось 5% полезной емкости аккумулятора, приходит точное понимание, что аккумулятор нужно заменить. Возможно Вы найдете более информативный способ визуализировать изменение тысячных долей. На всякий случай скину ссылки на сам плагин Knob: Примеры: http://anthonyterrien.com/demo/knob/ Исходники: https://github.com/aterrien/jQuery-Knob
  25. 2 points
  26. 2 points
    @Dark FeniX если необходимо добавить что-то свое (без модификаций основного кода), то действуйте точно также как если бы писали все с нуля. Работайте с основным файлом. Подключайте необходимые библиотеки, объявляйте переменные, дорабатывайте содержимое setup и loop, в общем делайте все как обычно опираясь на примеры, идущие в комплекте с используемыми библиотеками. Что касаемо упоминаемого кода, то он не действителен для текущей версии проекта поэтому давайте рассмотрим, как это должно выглядеть на текущий момент. Допустим Вас интересует библиотека https://github.com/ThingPulse/esp8266-oled-ssd1306, будем опираться на её примеры для дисплея ssd1306 подключенного по i2c шине. Все работы будем проводить в основном файле проекта (.ino) Подключаем библиотеку и объявляем переменные #include "SSD1306Wire.h" // Подключаем интересующую нас библиотеку SSD1306Wire display(0x3c, 4, 5); // Объявляем переменную через которую будем работать с дисплеем Сделать это можно в любом месте, например, после подключения уже используемых библиотек Чтобы все выглядело красиво создадим собственную функцию, которая будет выводить информацию на дисплей, пусть это будет температура void displayWeather() { display.clear(); // Очищаем дисплей display.setFont(ArialMT_Plain_10); // Устанавливаем шрифт display.setTextAlignment(TEXT_ALIGN_CENTER); // Указываем выравнивание display.drawString(64, 22, "Temperature " + String(sensors.get("out_temperature"))); // Выводим температуру display.display(); // Производим отрисовку данных } Сделать это можно, например, сразу перед функцией Setup или в любом месте файла если Вы используете актуальную версию Arduino IDE В функции Setup описываем инициализацию дисплея display.init(); // Инициализация дисплея display.flipScreenVertically(); // Переворачивает дисплей верх ногами (если требуется) Сделать это можно прямо в конце этой функции И следом после этого, также в функции Setup, добавляем новую задачу в планировщик задач cron.add(cron::minute, displayWeather, true); Новое задание подразумевает вызов вашей функции displayWeather каждую минуту и имеет отложенный запуск, то есть первый её вызов произойдет также через минуту после запуска контроллера. Отложенный запуск требуется для того, чтобы датчики произвели калибровку (если это требуется), а микроконтроллер успел наполнить медианный фильтр для каждого сенсора. В свою очередь это подразумевает, что данные на дисплее появятся через минуту после подачи питания на микроконтроллер и в последующем будут обновляться каждую минуту. Выглядеть это будет примерно так (все работы произведены в одном файле). И еще хочу добавить, что я просто взял первую попавшуюся библиотеку и основываясь на одном из примеров и описанию методов от разработчика набросал вышеупомянутый список. Проверить полную работоспособность не могу т.к у меня попросту нет данного дисплея. Но суть и принципы реализации должны быть понятны. Таким же образом можно организовывать работу с другой периферией, например, управлять внешним освещением на дачном участке, выводить информацию на дисплей 16x2 (или любой другой), собирать данные с других готовых устройств и т.д и т.п
  27. 2 points
    А я часики добавил. Спасибо за виджет погоды, там и солнышко анимированное) только погода не точная, подвирает. На смарте пользуюсь "foreca" по СПб там более точно показывает прогноз Скрин делал с телефона, не все влезло)
  28. 2 points
    У меня была подобная проблема с Mosquitto неполной передачи. Решение if (tMQTT != 0) { if (millis() - tMQTT > 1000 or tMQTT > millis()){ mqttAPI.disconnect(); tMQTT = 0; } } Вызов функции mqttAPI.disconnect(); после окончания передачи через 1с. Все заработало. У меня передача на Mosquitto идет каждые 5s. Далее полученная информация архивируется в СКАДА системе. (с периодичностью 5с) У меня к ESP (Nodemcu) подключено 2хBME + 10x ds18b20 и все передается в Mosquitto реализованное на виртуальной машине как и web скада
  29. 2 points
    На данный момент я предполагаю, что проблема проявляется при изменении кодировки в файлах проекта. Изначально все файлы, в том числе и web сервера, имеют кодировку utf-8. Данные между контроллером и web интерфейсом также передаются в этой кодировке. Arduino IDE также работает с utf-8. Возможно, где-то в этой цепочке произошла смена кодировки. Над этим стоит подумать. Это говорит о том, что у Вашего компьютера или иного устройства нет поддержки MDNS протокола, но не беда. Место espws.local наберите ip выданный контроллеру. На странице Вы должны увидеть json строку по данным с которой web интерфейс добавляет сенсоры. Вы можете скопировать текст в "кривой" кодировки и воспользоваться услугами любого онлайн анализатора кодировки. Надеюсь он подскажет в какую сторону копать. Безусловно будут отображены все объявленные датчики т.к на данный момент данные о структуре списка устройств объекта sensors забираются у микроконтроллера всего один раз при открытии/обновлении страницы. Я обновил архив, там есть небольшие изменения в web сервере, теперь он добавляет заголовок кодировки utf-8 при ответе клиенту через API. Проверьте как у Вас это будет работать. Да, у меня работает, и Вы абсолютно правы. Вам необходимо создать канал в своем профиле, далее перейти в раздел API Keys и скопировать ключ Write API Key. этот ключ необходимо указать в соответствующем поле в web интерфейсе. Данные должны начать поступать в течении 5 минут. Какие данные будут отправляться зависит только от Вас. Пример используемый по умолчанию и описанный в файле services.h отправляет данные об освещенности, температуре, влажности и давлении на поля field1-4 соответственно. Статус отправки запроса отображается в консоли.
  30. 2 points
    Может быть, в проекте приживется идея с индикацией скорости изменения атм. давления? Ведь, как правило, интересно именно это значение, а не абсолютное. Например, на дисплее HD44780 я реализовал это в виде четырех стрелок, указывающих либо вверх, либо вниз. Диапазоны для скорости изменения взял с часов CASIO ProTrek PRG-40. Получился такой код. Отлично работает. Очень информативно получается. Видишь на экране две-три стрелки - жди изменения погоды. Четыре - еще не видел ни разу ни на часах CASIO, ни на своей поделке. Первые два часа вместо стрелок выводится слово "wait". В общем, такой вариант отображения информации с барометра (на мой взгляд!) несет гораздо больше смысла, чем абсолютное значение. И даже крутизну графика давления оценить гораздо сложнее, чем четыре стрелки или, например, четыре цветовых уровня... Как уж это реализовать в интерфейсе - вопрос вкуса. Думаю, что в данном проекте это получилось бы красиво. if(((Q2 - Q1) >= 0.64)&((Q2 - Q1) < 1.27)){ //Если разность между измерениями давления с интервалом в 2 часа от 0.64 до 1.27 мм.рт.ст. Press[0] = '\1'; //Зажигаем ОДНУ стрелку ВВЕРХ Press[1] = ' '; Press[2] = ' '; Press[3] = ' '; } if(((Q2 - Q1) >= 1.27)&((Q2 - Q1) < 2.54)){ //Если разность между измерениями давления с интервалом в 2 часа от 1.27 до 2.54 мм.рт.ст. Press[0] = '\1'; //Зажигаем ДВЕ стрелки ВВЕРХ Press[1] = '\1'; Press[2] = ' '; Press[3] = ' '; } if(((Q2 - Q1) >= 2.54)&((Q2 - Q1) < 3.81)){ //Если разность между измерениями давления с интервалом в 2 часа от 2.54 до 3.81 мм.рт.ст. Press[0] = '\1'; //Зажигаем ТРИ стрелки ВВЕРХ Press[1] = '\1'; Press[2] = '\1'; Press[3] = ' '; } if((Q2 - Q1) >= 3.81){ //Если разность между измерениями давления с интервалом в 2 часа от 3.81 мм.рт.ст. и более Press[0] = '\1'; //Зажигаем ЧЕТЫРЕ стрелки ВВЕРХ Press[1] = '\1'; Press[2] = '\1'; Press[3] = '\1'; } if(((Q2 - Q1) <= -0.64)&((Q2 - Q1) > -1.27)){ //Если разность между измерениями давления с интервалом в 2 часа от -0.64 до -1.27 мм.рт.ст. Press[0] = '\2'; //Зажигаем ОДНУ стрелку ВНИЗ Press[1] = ' '; Press[2] = ' '; Press[3] = ' '; } if(((Q2 - Q1) <= -1.27)&((Q2 - Q1) > -2.54)){ //Если разность между измерениями давления с интервалом в 2 часа от -1.27 до -2.54 мм.рт.ст. Press[0] = '\2'; //Зажигаем ДВЕ стрелки ВНИЗ Press[1] = '\2'; Press[2] = ' '; Press[3] = ' '; } if(((Q2 - Q1) <= -2.54)&((Q2 - Q1) > -3.81)){ //Если разность между измерениями давления с интервалом в 2 часа от -2.54 до -3.81 мм.рт.ст. Press[0] = '\2'; //Зажигаем ТРИ стрелки ВНИЗ Press[1] = '\2'; Press[2] = '\2'; Press[3] = ' '; }; if((Q2 - Q1) <= -3.81){ //Если разность между измерениями давления с интервалом в 2 часа от -3.81 мм.рт.ст. и более Press[0] = '\2'; //Зажигаем ЧЕТЫРЕ стрелки ВНИЗ Press[1] = '\2'; Press[2] = '\2'; Press[3] = '\2'; }; if(((Q2 - Q1) < 0.64)&((Q2 - Q1) > -0.64)){ //Если разность между измерениями давления с интервалом в 2 часа от 0.64 до -0.64 мм.рт.ст. Press[0] = ' '; //Не зажигаем ни одной стрелки Press[1] = ' '; Press[2] = ' '; Press[3] = ' '; }
  31. 2 points
    Какой ип-адрес получает ноут, с которого удается подключиться (и пингуется) к метеостанции ? Как этот ноут подключается к роутеру, по вифи или кабелем ? Включен ли режим изоляции клиентов вифи в роутере ? Ну и для общей информации - какие ип-адрес получают устройства, каторые не видят метеостанции ? Видят ли другие устройства, подключенные к роутеру , другие устройства к нему же подключенные, помимо метеостанции ?
  32. 2 points
    Доверяй, но проверяй. Идея заключается в том, чтобы проверять антивирусом все загружаемые 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 будет сохранен в корень системного диска, но Вы можете изменить его на любой другой как это сделал я. Пробуем что нибудь скачать и смотрим на результат.
  33. 2 points
    @wildray последовательность Ваших действий для получения работоспособной метеостанции должна быть следующей: ... перенесено в первый пост темы
  34. 2 points
    @zloydimo4ka Задействованные пины --------------------------------------- NodeMCU Pins | ESP 07/12 Pins | Датчики --------------------------------------- D2 | GPIO 4 | SDA D1 | GPIO 5 | SCL 3.3V | VCC | VCC GND | GND | GND в принципе можно любые пины на esp8266 использовать под i2c шину и их можно переопределить к примеру #define pin_sda 12 // default sda pin #define pin_scl 14 // default scl pin у меня работает.
  35. 2 points
    @zloydimo4ka что-то я прозевал, что они Adafruit Sensor не только к DHT, но и к BMP280 привязали. Добавить в arduino ide https://github.com/adafruit/Adafruit_Sensor В скетче добавить строку над уже существующей #include <Adafruit_BMP280.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h>
  36. 2 points
    @zloydimo4ka она не залиться не может, она не компилируется, так как модуля PubSubClient.h не может найти. Это библиотека отвечающая за MQTT. На вашем скриншоте в скетче на этот компонент ссылка присутствует. Качаете и добавляете его в arduino IDE.
  37. 2 points
    Привет друзья. В данной теме пойдет речь о конфигурации микроконтроллера через UART (Universal Asynchronous Receiver-Transmitter) интерфейс. А рассмотрим мы это на примере MQTT логгера. В данном случае, это будет логгер температуры. Мне это устройство потребовалось на работе, даже не мне, а моим коллегам, и оно действительно работает и приносит огромную пользу т.к контроль температуры производится совместно с отличной, на мой взгляд, системой мониторинга Zabbix с оперативными оповещениями, построением графиков, блэк-джеком и... Подробнее о дружбе Arduino и Zabbix можно почитать тут Но как всегда, есть нюансы. А заключаются они в том, что в будущем, обслуживать армию мелких контроллеров придется людям, которые заняты своими задачами и им попросту некогда изучать Arduino, не говоря уже о серьезных альтернативах, разбираться в том, как прописать нужные значения переменных в программу и загрузить её в микроконтроллер. Все настройки необходимо производить быстро, с явным указанием изменяемого параметра и его значения. Ровно также, как это делается с любым промышленным оборудованием. И тут на помощь приходит UART Микросхема UART to USB имеется в большинстве плат семейства Arduino, а там, где её нет, обычно выведены соответствующие "пины". И все это очень облегчает жизнь т.к позволяет общаться с контроллером, просто подключив его к компьютеру напрямую или через переходник, благо их везде навалом, да и стоят они как пачка семечек. Остается только запустить любой терминал, который умеет доставлять в конец строки символ "перевод строки", что известен в народе как "\n", а в ASCII таблице имеет номер 0A. Кстати, в Serial мониторе Arduino IDE выставить символ конца строки можно так Ну а дальше только, что и остается, как общаться с устройством на той стороне. И тут мы переходим к основному алгоритму программы. Но перед этим хочу отметить, и это ВАЖНО, что за любое упрощение жизни, всякие красивости и прочее, приходиться платить, и цена довольно высока! В данном случае, это ОЗУ микроконтроллера. Поэтому не раскатываем губы, а если очень хочется, то берем следующий по характеристикам микроконтроллер. А начинать мы будем с ATmega328P, что известен в народе как Arduino UNO, Arduino Nano, IBoard v1.1 и т.д по списку. Заканчивать Вы можете чем угодно, хоть ATmega2560, ESP8266 или ESP32. В противном случае, производим оптимизацию кода, отказываемся от громоздких библиотек, или вообще, от Arduino IDE. Что мы хотим получить Вся конфигурация микроконтроллера должна храниться в энергонезависимой памяти (ПЗУ) известной нам как EEPROMM. Если в ПЗУ конфигурация отсутствует, необходимо иметь резервный план. И им станет сброс конфигурации на настройки по умолчанию. Это поведение знакомо всем, особенно по домашним дешевым маршрутизаторам, а значит, интуитивно понятно. Выводить справку при начале общения пользователя и устройства, на мой взгляд, как манеры высшего общества. Контроллер должен представляться и сообщать всю необходимую информацию о себе и о том, как с ним вести диалог. Все команды должны быть просты и иметь не двусмысленное значение. И конечно, мы должны иметь возможность просмотра текущего состояния датчиков или процессов, которыми занимается устройство в свободное от общения с нами время. Как сохранять конфигурацию в EEPROM Пожалуй, стоит начать с того, как сохранить конфигурацию микроконтроллера в энергонезависимую память. Для этих целей, в стандартный набор инструментов Arduino IDE входит библиотека для работы с EEPROM. #include <EEPROM.h> На данный момент нас интересуют две функции, это чтение и запись EEPROM.get(address, variable); EEPROM.put(address, variable); Обе принимают два параметра: Адрес, начиная с которого будет произведено чтение или запись данных в память Переменная чье содержимое надо сохранить или в которую нужно из памяти прочитать Особенность работы этих функция заключается в том, что в зависимости от типа переданной им переменной во втором параметре, будет произведено чтение или запись ровно того количества данных которое соответствует размеру типа этой самой переменной. На простом языке это означает, что если переменная variable будет иметь типа byte, то и работать мы будем с объемом памяти в 1 байт. И тоже самое произойдет с абсолютно любым типом данных пока мы не упремся в размеры самого EEPROM или ОЗУ микроконтролера. Из этого всего следует, что мы можем создать свой собственный тип данных, разместить в нем необходимую нам информацию и всего лишь двумя функциями помещать его в память и извлекать обратно. И в этом нам поможет пользовательский составной тип - структура (struct). Данный тип позволяет объединить в себе различные типы данных, упорядочить их и присвоить им понятные имена. Это общий пример для большего понимания, как объединить несколько типов данных в одной структуре, получить к ним доступ, записать и прочитать их из EEPROM. Наша структура будет немного сложнее, но суть остается той же самой. // Дополнительная структура описывающая IPv4 адреса struct addres { byte a; byte b; byte c; byte d; }; // Структура объекта конфига для хранения в EEPROM struct configObj { addres ip; addres subnet; addres gateway; addres dns; byte mac[6]; byte hex; char server[40]; char topic[40]; } config; Данная структура хранит сетевые настройки для работы с Ethernet модулем (w5100 и выше) Arduino, базовые настройки для связи с MQTT брокером. Сразу при описании структуры мы объявили новую переменную с именем config с типом нашей структуры. ВАЖНО: кроме наших данных в структуре имеется дополнительная переменная с именем hex. Её задача, это контроль наличия наших данных в EEPROM. Она всегда должна содержать одно и тоже значение. Представьте ситуацию, что вы взяли контроллер в EEPROM которого находится какая-либо информация (может там чисто, но мы этого не знаем наверняка) и мы прочитаем данные и поместим их в нашу переменную. В итоге мы получим данные которым нельзя доверять, а что еще хуже, это если эти самые данные нарушат работу внешнего оборудования. Более правильным, на мой взгляд, будет проверка значений по конкретно определенным адресам. Например, мы знаем, что в 16 байте должно быть значение 0xAA и если оно действительно там, то мы убеждаемся, что это наша информация. Естественно, что контрольных точек может быть несколько и разумеется с разными значениями, это увеличит гарантию того, что данные являются нашими, но 100% гарантии не даст. Для более серьезных проектов есть более серьезные методы, например, подсчет контрольной суммы всего набора данных. Также структура может иметь вложенные структуры, у нас ими являются: ip, subnet, gateway, dns. Вы можете отказаться от такого варианта и записывать данные просто в массив байт, как это было сделано с MAC адресом. Естественно, что обращаться к этим полям нужно по-разному. Запись данных в поле subnet config.subnet = {255, 255, 255, 0}; Запись данных в поле mac byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02}; memcpy(config.mac, mac, 6); С записью данных в поле server все еще проще config.server = "mqtt.it4it.club"; Функция, которая возвращает нашу структуру данных с полностью заполненными полями. // Начальный конфиг configObj defaultConfig() { configObj config = { {192, 168, 0, 200}, {255, 255, 255, 0}, {192, 168, 0, 1}, {192, 168, 0, 1}, {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02}, 0xAA, // Не трогать! Используется для проверки конфигурации в EEPROM F("mqtt.it4it.club"), F("arduino/serial/config") }; return config; } К примеру, два последних значения записывать не обязательно, тогда эти поля останутся пусты если использовать данную функцию для возврата к "заводским" настройкам. Вот пример того, как используя описанную нами структуру, мы проверяем целостность настроек в EEPROM и в случае не совпадения hex значений, загружаем настройки по умолчанию. const byte startingAddress = 9; bool configured = false; void loadConfig() { EEPROM.get(startingAddress, config); if (config.hex == 170) configured = true; else config = defaultConfig(); configEthernet(); // Функция производящая настройку сети } Как контроллеру начать понимать, что от него хотят В Arduino имеется функция, вызываемая каждый раз, когда в передаваемый буфер данных попадает знакомый нам символ перевода строки. void serialEvent() { // Вызывается каждый раз, когда что-то прилетает по UART // Данные передаются посимвольно. Если в строке 100 символов, то функция будет вызвана 100 раз } И в контексте обсуждаемой нами программы, мы можем представить ее в следующем виде void serialEvent() { serialEventTime = millis(); if (console.available()) { char c = (char)console.read(); if (inputCommands.length() < inputCommandsLength) { if (c != '\n') inputCommands += c; else if (inputCommands.length()) inputCommandsComplete = true; } } } Её задача, символ за символом, собрать в кучу все переданные нами данные и при получении заветного символа перевода строки (именно он даст нам понять, что передача сообщения завершена) сообщить, что команда получена и передать накопленный буфер данных своей напарнице по цеху. Но перед тем как это сделать стоит рассмотреть альтернативную ветку развития событий, а именно тот факт, что нам попросту могут прислать огромную, кучу шлака без волшебного символа, а раз могут, значит рано или поздно пришлют. И мы бесполезно потратим ценные ресурсы микроконтроллера, что может привести к непредсказуемым результатам в дальнейшем. Поэтому, в логику функции, мы добавим дополнительное ограничение на количество переданных символов, если оно достигнуто, то попросту перестаем воспринимать последующие данные. Останется только избавиться от них, и самым удобным моментом будет, когда этот поток шлака прекратиться. Чтобы об этом узнать мы будем запоминать время, когда пришел каждый из символов переданной строки перезаписывая соответствующую временную переменную данными о следующем символе и т.д пока поток не иссякнет. И как только расхождение текущего времени CPU и времени, когда поступил последний символ превысит некоторое значение, пусть это будет 1 секунда, мы очистим нашу память. Этот простой механизм напоминающий амнезию позволит избавить нас от лишних проблем. Переменная отвечающая за размер принимаемого буфера const byte inputCommandsLength = 60; Теперь можно переходить к напарнице предыдущей героини и, по совместительству, основной рабочей лошадки - функции обрабатывающей адекватно полученные данные. void serialEventHandler() { // вызывается в loop и проверяет взведена ли переменная inputCommandsComplete // в полученных данных пытается распознать команды } По началу я хотел описать данную функцию в упрощенном варианте, но в процессе понял, что ничего хорошего из этого не выйдет, и я решил описать только ключевые моменты, но их будет достаточно, на мой взгляд. Разбор serialEventHandler Полученные данные будут переданы нам в переменной inputCommands с типом String В первую очередь стоит почистить ее от лишних пробельных символов. Они часто встречаются в начале и в конце строки если пользователь копирует текст, а не набирает его самостоятельно. Это распространенная ситуация, приводящая к отказу принятия команды и бороться с ней очень просто. inputCommands.trim(); Далее стоит отсеять команды, не несущие никакой динамической информации, например, help, restart, reset и т.п это предписывающие команды которые заставляют контроллер выполнять строго описанные функции без вмешательства в их работу. if (inputCommands == F("help")) { consoleHelp(); } else if (inputCommands == F("restart")) { resetFunc(); } else { // Все сложные команды обрабатываются в этом блоке } Как Вы видите, все очень просто и скучно. Но не в том случае если команда динамическая, то есть содержит не только саму команду (заголовок) но и полезную нагрузку (параметр) которая может меняться раз от раза. Простой пример это команда изменения ip адреса и её варианты: ip 37.140.198.90 ip 192.168.0.244 ip 10.10.10.88 В данном случае, нам стоит понять, относится ли данная команда именно к ip адресу. Для этого в наборе String имеется отличный метод, позволяющий производить сравнение переданного ему параметра с началом строки. if (inputCommands.startsWith(F("ip"))) { // Строка inputCommands начинается с пары символов "ip" } Если все идет так, как мы задумали, то нам стоит отделить динамическую часть - наш параметр, от заголовка и получить полезную нагрузку. В этом нам поможет, опять же из набора String, метод substring позволяющий получать часть строки с указанием начального и конечного символа подстроки. Последний параметр указывать не обязательно и в таком случае мы получим всю строку начиная с указанного символа. inputCommands.substring(4) В данном случае начиная с 4-его и заканчивая последним. И как Вы успели заметить, отсчет мы начинаем не с третьего символа, что соответствует нашей строке без вступительного "ip", а на один больше т.к между заголовком и параметром имеется разделяющий символ в виде пробела. Далее, полученную строку мы передадим в функцию, занимающуюся разбором на компоненты и принимающую следующие параметры: Указатель на переменную с типом char, для этого нам потребуется преобразовать наш тип String Символ разделителя, что для IPv4 является точка "." Указатель на массив типа byte, которому будет присвоен результат разбора Количество искомых элементов в строке И система счисления, подразумеваемая в качестве исходной для записи элементов подстроки /* Парсинг https://stackoverflow.com/questions/35227449/convert-ip-or-mac-address-from-string-to-byte-array-arduino-or-c */ void parseBytes(const char* str, char sep, byte* bytes, int maxBytes, int base) { for (int i = 0; i < maxBytes; i++) { bytes[i] = strtoul(str, NULL, base); str = strchr(str, sep); if (str == NULL || *str == '\0') break; str++; } } В нашем случае выглядеть это будет следующим образом byte ip[4]; parseBytes(inputCommands.substring(4).c_str(), '.', ip, 4, 10); А дале все становится еще проще, попросту проверить попадает ли наш ip адрес, в список правильных адресов. И самой простой проверкой послужит проверка первого байта адреса на несоответствие не угодным нам сетям (0, 127, 255) if (ip[0] != 127 and ip[0] != 255 and ip[0] != 0) { // Производим необходимые нам действия с ip адресом, например, запись в конфиг config.ip = {ip[0], ip[1], ip[2], ip[3]}; } Вы в праве реализовать собственные проверки, какие только душе угодны. Также хотелось бы отметить, что обрабатывать некоторые параметры проще и быстрее через их короткие записи. К таким можно отнести маску подсети устройства. Например, привычный дня нас адрес 192.168.0.1 с маской подсети 255.255.255.0 можно записать в виде 192.168.0.1/24, где цифра 24 указывает нашу подсеть в краткой форме. А, следовательно, мы можем записать несколько кратких форм масок подсети в следующем виде: subnet 255.255.255.0 или subnet 24 subnet 255.255.0.0 или subnet 16 subnet 255.0.0.0 или subnet 8 Это основные маски, и я не описывал все существующие т.к в этом нет нужды, но если Вам интересно, то почитать про них можно в wikipedia. if (inputCommands.startsWith(F("subnet"))) { String input = inputCommands.substring(8); if (input == F("24")) config.subnet = {255, 255, 255, 0}; else if (input == F("16")) config.subnet = {255, 255, 0, 0}; else if (input == F("8")) config.subnet = {255, 0, 0, 0}; else { // Все остальные маски попадают в этот блок byte subnet[4]; parseBytes(input.c_str(), '.', subnet, 4, 10); config.subnet = {subnet[0], subnet[1], subnet[2], subnet[3]}; } } MAC адрес хранится у нас в виде массива байт. Его перезапись другим массивом производится с помощью функции memcpy if (inputCommands.startsWith(F("mac"))) { byte mac[6]; parseBytes(inputCommands.substring(4).c_str(), ':', mac, 6, 16); memcpy(config.mac, mac, 6); } Изменение адреса MQTT сервера if (inputCommands.startsWith(F("server"))) { String server = inputCommands.substring(8); server.trim(); if (server.length() < 40) server.toCharArray(config.server, 40); } В принципе теперь понятно, как производить получение, разбор и сохранение конфигурации в EEPROM микроконтроллера. Как это выглядит на практике Заливаем программу в микроконтроллер и подключаемся к Arduino по usb или через переходник. Открываем терминал и нас приветствуют краткой справкой с описанием доступных команд. - --------------------------------------------------------------------------------------- # Sensor with data sending to mqtt server (c) it4it.club # Use the "config" command to view the current configuration # To change the configuration, specify the parameter name and its new value with a space, # for example "ip 192.168.0.200", "subnet 255.255.255.0" or "mac AA:BB:CC:DD:EE:FF" # You can also specify a subnet using the mask 24, 16 or 8 # Additional commands: # sensors - view current data from sensors # config - view current configuration # save - saves the current configuration # reset - resets all settings # restart - restarts the device # eeprom clear - removes all contents of eeprom # help - view this help - --------------------------------------------------------------------------------------- Т.к. в EEPROM микроконтроллера не была обнаружена конфигурация (волшебный hex байт нам подсказал), то были задействованы стандартные настройки. Просмотреть текущую конфигурацию можно командой config config # ip: 192.168.0.200 # subnet: 255.255.255.0 # gateway: 192.168.0.1 # dns: 192.168.0.1 # mac: 00:AA:BB:CC:DE:02 # server: mqtt.it4it.club # topic: arduino/serial/config чтобы изменить значение любого из этих параметров необходимо передать имя параметра и его новое значение, разделенные между собой пробелом. ip 10.10.10.99 # ok gateway 10.10.10.1 # ok dns 10.10.10.1 # ok После окончания конфигурации необходимо сохранить настройки и если были затронуты критические параметры, например, сеть, то перезапустить Arduino соответствующей командой. save # ok restart # ok # restarting device... Если параметр был успешно принят, то контроллер ответит нам "ok", а в противном случае ругнется. ip 127.0.0.1 # bad ip Также мы получим негативный ответ если команда не была распознана. qwerqwer1243 # bad command С остальными командами Вы разберетесь самостоятельно. Исходник: MQTT_CLIENT_328_SERIAL_CONFIG.zip PS: в общем то это статья родилась только для того, чтобы в соседнем форуме с системой мониторинга Zabbix появилась ссылка на устройство, но я надеюсь, что она также станет полезна любителям домашней автоматизации и не только.
  38. 2 points
    @Anykey дело в том, что снимаемые показания будут напрямую зависеть от качества проработки и исполнения устройства. Чем они хуже, тем больше мы будем получать устройство измеряющее частоту собственного вращения, никак не связанную с реальными показаниями скорости ветра, да и про линейность можно забыть. В итоге, на выходе может получиться устройство, которое дает только моральное удовлетворение от его же наличия и немного каких-то показаний которым, возможно, можно доверять только для фактического определения наличия ветра или других факторов заставляющих эти самые показания изменяться. На мой взгляд, необходимо учитывать все, начиная от радиуса окружности описывающей траекторию движения "чашек", заканчивая сопротивлением подшипника или другого устройства скольжения и силой которую необходимо приложить для того, чтобы эти самые чашки заставить сдвинуться с места. Опять же под вопросом, сохраниться ли линейность при разбросе температуры эксплуатации ±30 градусов Цельсия. И многое другое. PS: это мое личное мнение и оно ни в коем случае не претендует на истину в последней инстанции.
  39. 2 points
    Спасибо! А если база и вебка на разных серверах? Если я правильно понимаю, то нужно здесь что то добавить? # Настройки доступа к MySQL $settings = array( 'db' => 'zabbix', 'login' => 'zabbix', 'pass' => 'zabbix' ); Немного подумав разобрался, нужно изменить на IP сервера с базой: 'host' => 'localhost'
  40. 2 points
    Вобщем, кое чё наваял. При падении узла (группы узлов) прога бомкает пока не жмякнешь на кнопку. Если через пять минут не поднялся - бомкает один раз. Через 20ть - жужжит один раз. Поднялся - пиликает один раз. И так по кругу. Автор (топикстартер) зачем-то не стал показывать ещё одну крутую возможность, которую он наваял - показ карт сетей. Видимо из-за того, что при повторном двойном клике на карту (после закрытия её), картинка не обновлялась. Проблему эту я решил топорно (а может и нет ) - просто делаю unset объекта. А php скрипт, передающий в прогу карты, банально переделал из найденного в гугле скрипта отрисовки графиков. Комментами и красотой кода особо не заморачивался. Так что не пинайте. А. И ещё - иконка в трее меняет цвет (ну это было ваще просто ). P.S. Насчёт карт - оказывается объяснение тут (тока заметил ) - zab.zip
  41. 2 points
    @Small_d Позволю себе предположить, что загрузчик Вашего микроконтроллера не поддерживает работу со сторожевым таймером. Уж очень похожи симптомы. В самом начале описания функции Setup имеются строки активирующие сторожевой таймер Arduino. // Настраиваем сторожевой таймер wdt_disable(); delay(8000); wdt_enable(WDTO_8S); При старте, контроллер ждет 8 секунд и после инициализирует сторожевой таймер на сброс при отсутствии контрольного сигнала в течении 8 секунд. За обновление счетчика отвечает функция, вызываемая при каждом вызове loop // Сбрасываем сторожевой таймер микроконтроллера wdt_reset(); Итого, если у Вас не поддерживается работа с Watchdog, то каждые 16 секунд будет происходить перезагрузка контроллера. Чтобы отключить сторожевой таймер, и все, что с ним связано, закомментируйте строчки, указанные выше. Хочу сразу Вас предостеречь. Никогда не заливайте программу с активированным сторожевым таймером в микроконтроллер на базе Arduino без задержки перед функцией инициализации таймера. Если конечно вы не уверены на 100%, что загрузчик поддерживает его работу. В противном случае, это чревато последствиями. На таком ответственном месте контроллер нельзя оставлять без сторожа, в случае необходимости, он приведет в чувства контроллер, а иначе можно остаться перед запертой дверью. Теперь, что касаемо ключа. Мы используем адрес ключа, состоящий из 4 байт, некоторые ключи отдают и 7 байт, но мы используем только 4. В итоге ключ представляет из себя строку, полученную в ходе конкатенации всех четырех байт ключа. Если все подключено правильно, то все поднесенные к сканеру ключи будут отображаться в Serial мониторе. Эту информацию Вы можете взять за основу для создания мастер ключа. Волею судьбы получилось так, что интерфейс для работы с добавлением, удалением или редактированием ключей остался не реализованным и лег на плечи конечного исполнителя. Можно это исправить, но нужен серьезный стимул, способный оторвать от текущих дел.
  42. 2 points
    @Small_d Приветствую, автор дополнения немного поспешил и допустил ошибку в программе микроконтроллера. Был не указан порядковый номер адреса ключа. Должно быть так. // Читаем ключ for(byte i=0; i<4; i++) key += mfrc522.uid.uidByte[i]; Все изменения от @svchekalin не проверял. Будем разбираться по мере необходимости. Что касаемо кодировок, попробуйте изменить php файл таким образом, чтобы html разметка была похожа не что-то подобное. <html lang="ru-RU" dir="ltr"> <head> <title>Заголовок</title> <meta charset="utf-8"> </head> <body> Тут само тело или PHP сценарий </body> </html>
  43. 2 points
    @BOTASAN Фото не помешает, желательно подробно демонстрирующее монтаж. Если при нажатии кнопки все тухнет, то там точно КЗ.
  44. 2 points
    @svchekalin Могу на вскидку предложить внести изменения в скетч 1. Заменить строку запроса к SQL серверу const char QUERY_S[] = "SELECT type FROM adatum.rc522 WHERE uid = %s;"; на const char QUERY_S[] = "SELECT type, description FROM adatum.rc522 WHERE uid = %s;"; 2. Найти и заменить кусок кода if((row = cur.get_next_row()) != NULL) typeKey = String(row->values[0]); else typeKey = "0"; if(typeKey == F("1") or typeKey == F("2")) { на if((row = cur.get_next_row()) != NULL) typeKey = String(row->values[0]); else typeKey = "0"; Serial.println(String(row->values[1])); if(typeKey == F("1") or typeKey == F("2")) {
  45. 2 points
  46. 2 points
  47. 2 points
    утырено http://arduino-kit.ru Дисплей 2.4 TFT 240х320 сенсорный + MicroSD Модуль является бескорпусным цветным ЖКИ монитором QVGA с сенсорным экраном, имеющим диагональ 2,4 дюйма. Он предназначен для работы совместно с микроконтроллерами разных типов и процессорными системами. Несмотря на возможность отображения полноцветных фотографий, основное применение – отображение простой графики и символьных данных с использованием 16 цветов. На экран можно выводить анимацию: Графических возможностей монитора достаточно для создания изображения клавиатуры работающей благодаря сенсорным поверхностям. Одновременно с обработкой нажатий дисплей 2.4 TFT 240х320 сенсорный + MicroSD отображает результаты выполнения команд оператора и индицирует значения контролируемых параметров. Применение значительно упрощает устройства ввода-вывода прибора. ЖКИ индикатор имеет постоянно включенную подсветку. Есть одна кнопка. На плате расположен контейнер для SD карты. Характеристики 2.4 TFT 240х320 Питание Напряжение 5 В Ток 300 мА Напряжение входных сигналов 5 или 3,3 В Диагональ 2,4 дюйма Разрешающая способность 320 X 240 точек с индивидуальным контролем Максимальное количество оттенков 262144 Подсветка белая Интерфейс 8080 Максимальный объем microSD карты 32 Гб Размеры 71 x 52 x 7 мм Контакты ЖКИ индикатор использует 8 контактов модуля для передачи данных и 4 контакта для сигналов управления. Сенсорная часть дисплея использует 4 контакта совместно с ЖКИ. Работа с Micro SD картой требует 4 контакта. Контакт 3.3V Питание 5V Питание GND Питание J4-1 Кнопка ЖКИ индикатор и сенсорная поверхность LCD_RD управление ЖКИ, чтение LCD_WR TOUCH_YP управление ЖКИ, запись или данные сенсорной поверхности LCD_RS TOUCH_XM управление ЖКИ, команда/данные или данные сенсорной поверхности LCD_CS управление ЖКИ, выбор устройства LCD_RST сброс LCD_D2 данные ЖКИ LCD_D3 данные ЖКИ LCD_D4 данные ЖКИ LCD_D5 данные ЖКИ LCD_D6 / TOUCH XP данные ЖКИ / данные сенсорной поверхности LCD_D7 / TOUCH YM данные ЖКИ / данные сенсорной поверхности LCD_D0 данные ЖКИ LCD_D1 данные ЖКИ Micro SD SD_CS выбор SD_DI SD вход данных SD_DO выход данных SD_SCK тактирование данных Дисплей 2.4 TFT 240х320 сенсорный + MicroSD может устанавливаться в соединители Arduino. Подключение к Arduino UNO: Контакты модуля Arduino LCD_CS A3 LCD_RS A2 LCD_WR A1 LCD_RD A0 LCD_ RST A4, можно присоединить LCD_RESET к линии RESET Arduino UNO как описано ниже. LCD_D0 DIO 8 LCD_D1 DIO 9 LCD_D2 DIO 2 LCD_D3 DIO 3 LCD_D4 DIO 4 LCD_D5 DIO 5 LCD_D6 DIO 6 LCD_D7 DIO 7 SD SS DIO 10 SD DI DIO 11 SD DO DIO 12 SD SСK DIO 13 3.3V 3.3V 5V 5V GND GND При установке в контакты Arduino UNO перед включением следует проверить отсутствие касания контактами платы разъема USB и при необходимости на плату приклеить изолятор. Схема Дисплей 2.4 TFT 240х320 сенсорный + MicroSD. Питание 5 вольт поступает на цепи схемы и микросхему U1 стабилизатор напряжения 3,3 вольта. Информационные сигналы проходят через микросхемы 74xx541 – буферы шин данных. IC1 микросхема ADS7843 – контроллер сенсорных экранов. Это 12 битный АЦП с устройством выборки-хранения, синхронным последовательным интерфейсом и низкоомными ключами управления сенсорными контактами. Основной компонент модуля – TFT1 совмещенный со специализированным контроллером жидкокристаллический экран. Ссылки на описание ЖКИ и различных типов контроллеров в конце страницы. Кнопка На краю платы модуля расположена кнопка. Кроме сенсорной клавиатуры дисплей 2.4 TFT 240х320 сенсорный + MicroSD имеет механическую кнопку. Ее контакты соединяют с общим проводом контакт 1 соединителя J4. Это расположенный с краю соединителя J4 возле контакта 3V3 неподписанный контакт. Кнопка может использоваться для нужд компонуемого прибора. При работе совместно с Arduino контакт 1 соединителя J4 подключается к линии сброс. Нажатие кнопки вызывает сброс Arduino. Начало работы Большая часть обеспечения работы модуля принадлежит программе микроконтроллера. Для этого удобно использовать опубликованные в интернете существующие программные решения. За основу берут написанные для Arduino программы и модифицируют их под аппаратные средства разрабатываемого прибора. Когда мы пытаемся обуздать дисплей 2.4 TFT 240х320 сенсорный + MicroSD можно получить неожиданные результаты: белый экран, весь экран с шумом, сенсорные функции не работают или инвертируется позиция по координате Y, инвертируются цвета. Дело в том, что в дисплей различные производители устанавливают различные типы основного контроллера ЖКИ: ST7781, Spfd5408, IL9341, Sitronix ST7783262K, S6D0154 и другие. Их описания в конце страницы. Прежде всего нужно определить какой тип контроллера дисплея применен в вашем модуле. Микросхема и ЖКИ экран это одно устройство. Установить тип можно только программным путем. Для этого используют микроконтроллерный модуль Arduino UNO и программу LCD_ID_Reader Version 1.2, которая читает идентификатор микросхемы. LCD_ID_Reader не требует установки дополнительных библиотек. Также есть программа определения типа контроллера в библиотеке самурай, речь о ней пойдет далее. Программное обеспечение Arduino Для различных контроллеров ЖКИ разработаны различные библиотеки. Для контроллера SPFD5408 используется библиотека JoaoLopesF. По сути это доработанная для SPFD5408 библиотека от Adafruit. В ней есть возможность калибровки сенсорного экрана. Для контроллеров S6D0154 диагональ 2,8 дюйма ILI9488 диагональ 3,95 дюйма 320 x 480 точек ILI9327 диагональ 3,6 дюйма ILI9341 NT35702, совместим с ILI9327 Библиотека самурай По умолчанию эта библиотека предназначена для экранов с диагональю 2,8 дюйма. На меньших пропадает часть изображения. Для диагонали 2,4 дюйма в файле TFTLCD-Library/Adafruit_TFTLCD.cpp надо нейтрализовать строки: //#define TFTWIDTH 320 //#define TFTHEIGHT 480 и убрать символы комментария в строках: #define TFTWIDTH 240 #define TFTHEIGHT 320 Программа определения типа контроллера ЖКИ – graphicstest. В монитор последовательного порта будет выведен тип контроллера ЖКИ. Для работы сенсорного экрана измените #define YP A1 #define XM A2 #define YM 7 #define XP 6 Для контроллеров ILI9325 ILI9328 И для контроллера с кодом идентификации 0xC505 Библиотека adafruit/TFTLCD-Library Для ILI9325D библиотека UTFT Для контроллера ST7781 установить: Smoke-And-Wires/TFT-Shield-Example-Code adafruit/Adafruit-GFX-Library adafruit/Touch-Screen-Library Установка библиотеки, тестирование, описание библиотеки, шрифты, определение координат нажатия, работа с микроSD картой, конвертирование из формата 24-bit в 16-bit здесь Сенсорная поверхность Дисплей 2.4 TFT 240х320 сенсорный + MicroSD передает программе три величины: координаты нажатия (X и Y) и давление Z. Используется резистивная технология сенсорного экрана. Поверхность состоит из двух полимерных слоев, покрытых резистивным материалом, выступающим в качестве электродов. Слои склеиваются по краям. Под управлением программы данные поступают из микросхемы IC1 для обнаружения нажатия. Микроконтроллер прибора получает 10-битное число (0..1023) для каждой оси. Программно эта величина масштабируется в соответствии с размерами экрана. Пять проводов сенсорной поверхности (четыре сигнальных и один общий) подключены через тонкий шлейф к контроллеру ЖКИ. Для контроллера SPFD5408 используется библиотека 4-wire resistive touchscreens . Скопируйте разархивированные и переименованные папки: Для контроллера ЖКИ ST7781 применяется библиотека контроля нажатия. Также установите. Скачайте и разархивируйте демонстрационный код . Скопируйте папку SWIFT-Shield из извлеченного архива в папку библиотек Arduino. Графический тест Для модуля с контроллером IL9341. Подключите дисплей 2.4 TFT 240х320 сенсорный + MicroSD к Arduino UNO. Загрузите библиотеки adafruit/TFTLCD-Library и Adafruit-GFX-Library. Попробуйте пример graphictest в библиотеке adafruit/TFTLCD. На экране должно быть изображение как показано выше. Если дисплей 2.4 TFT 240х320 сенсорный + MicroSD ничего не отображает или показывает только статическую картинку, то можно попробовать изменить программу graphictest. Модификация программы заключается в жесткой установке типа контроллера дисплея. Строку 60 замените на: uint16_t identifier = 0x9341; //Need hardcode here (IC) Для контроллера ЖКИ SPFD5408. Создайте два графических файла формата BMP со следующими параметрами: 320 точек ширина картинки, цвет 24 бит и объем не превышающий 250 Кбайт. Имя файла должно состоять из восьми латинских букв. Скопируйте файл в корневой каталог карты microSD. Если эксперимент пройдет удачно, то на карту можно записать много картинок. Тест будет выводить их на экран поочередно. Скачать следующие библиотеки : TFT-Shield-Example-Code Распакуйте и скопируйте в папку SWTFT-Shield в библиотеки Arduino. Adafruit GFX graphics Переименуйте распакованные папки в Adafruit_GFX. Они должны содержать .cpp и .h файлы. Если имя папки отличается, то Arduino не распознает ключевые слова из библиотеки. Arduino library resistive touchscreens Переименуйте раскрытую папку в TouchScreen. Библиотеки, примеры и картинки можно скачать отсюда Подключите USB-кабель к ПК и откройте Arduino IDE. Далее откройте Under File—>Examples –> SWTFT-Shield. Результаты работы программных примеров. Graphicstest Graphicstest Rotationtest. Откройте последовательный монитор Arduino IDE и выберите скорость 9600 и New Line в нижней части окна. При нажатии на кнопку Send будут появляться различные изображения. Ttfbmp. Файлы BMP записанные на micro SD карту будут выводится на экран. Ttfpaint. Можете выбрать любой цвет чтобы рисовать или писать на сенсорном экране. Проект: Осцилограф на основе Arduino UNO R3 и дисплея 2.4 TFT 240х320 Работа совместно с Arduino Mega 01 02 видео Описание ЖКИ индикатора монитора на основе контроллера SPFD5408A Описания контроллеров ЖКИ SPFD5408A ILI9320 ILI9325 ILI9328 ILI9341 S6D1121 Библиотека Arduino для подключения TFT дисплеев на чипе ILI9341 Библиотека UTFT для цветных TFT дисплеев для Arduino Библиотека Arduino для подключения TFTLCD Touch Screen Library TFT LCD Library GFX Library Latest SD Card Library
  48. 2 points
    Точное время - всегда актуальный вопрос. В большинстве случаев высокая точность не нужна и настроить время на вашем оборудовании можно по наручным, кухонным или напольным с кукушкой часами, да хоть по положению солнца, и этого будет более чем достаточно для большинства людей. Но вот, что делать, если хочется высокой точности? Верно, начинаем синхронизироваться с любым попавшимся NTP сервером в интернете, он в свою очередь синхронизируется с другим (возможно даже более точным, а может быть и нет) сервером. Цепочка может быть достаточно длинной, но в один прекрасный день может появится желание убрать посредников и найти самые точные часы на планете и спрашивать время у них. А какие часы самые точные? Атомные! Кстати на wikipedia имеется отличная статья про время! И вот тут пораскинув мозгами, начинаем судорожно вспоминать, в каком это супермаркете мы последний раз видели их в продаже и желательно с USB интерфейсом, можно даже розового цвета... Вы тоже не видели? Печаль. А ведь у нас над головой, на высоте порядка 19400 км висят куча спутников систем позиционирования (GPS / ГЛОННАС), а чтобы они работали им нужно знать точное время. Именно для этой цели у каждого из этих трудяг на борту имеются атомные часы! Отлично, давайте узнавать время у этих ребят. И так, немного задержавшись на сайте MikroTik можно найти пакет gps-xx.xx.npk который позволяет расширить возможности маршрутизатора и позволит ему определять свои точные координаты на поверхности нашей планеты. Чтобы установить пакет, достаточно просто скопировать его на маршрутизатор (сделать это можно перетащив .npk файл в файловый менеджер WinBox) и перезагрузиться. Теперь нам нужен GPS приемник. Общение будет идти по протоколу NMEA 0183, PDF. Мой маршрутизатор собран на базе стационарного компьютера, а следовательно можно смело брать приемник с USB интерфейсом. В наличии имеется отличный экземпляр от GlobalSat - BU-353U4. После подключения приемника переходим к настройки маршрутизатора. [admin@Kitsum] > port print Flags: I - inactive # DEVICE NAME CHANNELS USED-BY BAUD-RATE 0 serial0 1 Serial Console 9600 1 3:2 usb2 1 4800 Отлично, маршрутизатор видит что-то на порту usb2, запоминаем его Flag (1) и выставляем настройки согласно техническим характеристикам от производителя. Естественно, что для Вашего "свистка" настройки могут отличаться. [admin@Kitsum] > /port [admin@Kitsum] /port> set numbers=1 baud-rate=4800 data-bits=8 parity=none flow-control=none stop-bitsrs=1 Все настройки с портами Вы можете провести через Web интерфейс или WinBox в разделе System -> Ports Теперь осталось дело за малым. Сообщим маршрутизатору, что на порту usb2 висит GPS приемник, и он может им овладеть, то есть воспользоваться, ... блин использовать! И естественно, мы желаем, чтобы время, полученное в телеграмме от спутников считалось эталонным и использовалось как системное. [admin@Kitsum] > /system gps [admin@Kitsum] /system gps> set enabled=yes port=usb2 set-system-time=yes Теперь мы может посмотреть, какими именно данными мы начали располагать в следствии, этих сверх сложных манипуляций! Внимание: естественно, что при холодном старте, данные начнут поступать не сразу. [admin@Kitsum] > /system gps [admin@Kitsum] /system gps> monitor date-and-time: feb/08/2016 14:44:42 latitude: N 00 18' 13.236'' longitude: E 00 54' 5.236'' altitude: 325.299988m speed: 0.000000 km/h destination-bearing: none true-bearing: 133.419998 deg. True magnetic-bearing: none valid: yes satellites: 9 -- [Q quit|D dump|C-z pause] В данном случае получилось поймать сигнал с 9 спутников. Каждый из них передает нам свои координаты, а самое главное - время со встроенных атомных часов. Большая часть информации вычисляется уже по месту (скорость, высота ...). Мы практически добились нужного результата. Естественно мы получаем время по Гринвичу (UTC+0), меня это не устраивает, видимо и Вас тоже. Необходимо подправить часовой пояс. Это можно сделать в System -> Clock [admin@Kitsum] > /system clock [admin@Kitsum] /system clock> set time-zone-autodetect=no time-zone-name=Europe/Moscow И так, теперь Ваш маршрутизатор знает самое точное время на планете и им стоит поделиться хотя бы со всеми желающими в локальной сети. А таких поверьте, будет не мало. В современном мире все устройства жаждут обладать этой информации. Как же без этого Вам кофеварка сварит благородный напиток, или телевизор выключится и оградит молодое поколение от всего того, что оно и так потом узнает, а пока должно делать уроки, ммм? Необходимо поднять собственный NTP сервер и делается это сверх сложной и длинной командой. [admin@Kitsum] > /system ntp server [admin@Kitsum] /system ntp server> set enabled=yes manycast=yes Ну, или просто выставлением соответствующей галочки в System -> NTP Server И все было бы просто великолепно, если бы устройства в сети знали, что мы владеем более точным временем, чем time.windows.com, time.nist.gov да и сотни других серверов. Первая мысль, которая посетила меня - просто подменю ip адреса в записях DNS и "вуаля", но я даже понятия не имею с чем синхронизируется мой телефон, телевизор и у кого, после очередного обновления, захочет узнать время мой компьютер. Мы знаем, что NTP протокол использует 123 UDP порт для общения. Предлагаю перехватывать все запросы, из нашей локальной сети, адресованные на этот порт во внешний мир и заворачивать их на внутренний IP маршрутизатора! У меня все сетевые интерфейсы локальной сети объедены в Bridge и весь трафик ходит во внешний мир через через NAT и masquerade, внутренний адрес маршрутизатора 10.10.10.1 Добавим новое правило в NAT [admin@Kitsum] > /ip firewall nat [admin@Kitsum] /ip firewall nat> add action=dst-nat chain=dstnat dst-port=123 in-interface=bridge1 protocol=udp to-addresses=10.10.10.1 to-ports=123 На этом все. PS: зачем? потому что хочется и есть возможность!
  49. 2 points
    Ко мне обратился товарищ с просьбой уменьшить размер данного скетча т.к. места в его проекте уже совсем нет, а авторизация необходима как воздух. Мое мнение, что стоило бы сменить контроллер, было отвергнуто в силу долгого ожидание посылки из поднебесной и хочется прямо здесь и сейчас. Необходимо выбросить лишнее и сэкономить крошки на ATmega328p устанавливаемой в Arduino UNO / NANO Компилируем изначальный скетч (под чип W5100) и смотрим, сколько он весит, это будет отправной точно. Sketch uses 15 908 bytes (49%) of program storage space. Maximum is 32 256 bytes. Global variables use 524 bytes (25%) of dynamic memory, leaving 1 524 bytes for local variables. Maximum is 2 048 bytes В ходе быстрого кромсания выкидываем: библиотеку Base64, функцию auth_update() и все переменные, связанные с авторизацией. Хочу заметить, что изначально подразумевалось все это использовать для возможности изменять учетные данные в Web морде и хранить их в EEPROM. В угоду экономии места логин и пароль будет жестко задан в программе. Проверка авторизации осуществляется в 40 строке кода, в неё же зашит хэш Base64 - login:password if (readString.lastIndexOf(F("Authorization: Basic bG9naW46cGFzc3dvcmQ="))>-1) { После повторно компилируем программу и сравниваем вес. Sketch uses 14 756 bytes (45%) of program storage space. Maximum is 32 256 bytes. Global variables use 414 bytes (20%) of dynamic memory, leaving 1 634 bytes for local variables. Maximum is 2 048 bytes Получаем экономию: Скетч уменьшился на 4%, что составляет 1152 байта Оперативка освободилась на 5%, что составляет 110 байт Не густо, но этого оказалось достаточно, по этой же причине данный пост получил право на жизнь. Остается только придумать логин и пароль и самостоятельно получить из них хеш Base64, а затем вписать его в скетч. Напоминаю, что логин и пароль пишутся одной строкой через разделитель двоеточие ":". Если для примера взять логин Admin, а пароль СhIcKeN, то должна получится строка Admin:СhIcKeN Пишем её в наш online конвертер Base64 и получаем на выходе необходимый нам хеш QWRtaW46Q2hJY0tlTg== Base64 online converter Текст в Base64 (encode) Base64 в Текст (decode) PS: идея онлайн конвертера Base64 взята с сайта http://webtoolkit.info, в связи с этим я обязан разместить на них ссылку.
  50. 2 points
    Доброе время суток. После одного из обновлений Windows появились сбои в работе программы. Пришлось заново компилировать все это хозяйство. Плюс решено все-таки начать переводить программу на правильный язык программирования и делать её Мультиплатформеной. По этим причинам выкладываю все исходники и последний собранный вариант с некоторыми мелкими фиксами. Итак, как уже упоминалось ранее, программа написана на PHP и, чтобы превратить её в исполняемый файл понадобится среда разработки DevelStudio Проект DVS и распакованный проект с дополнительными файлами и собранной программой (в каталоге build) прикреплены к посту. Почти весь код описан в файлах в каталоге scripts. Серверная часть по-прежнему актуальна и описана в предыдущем сообщении. ZabbixTrigger.dvs.tar ZabbixTrigger.zip
×
×
  • Create New...