Jump to content
iT4iT.CLUB

Recommended Posts

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

esp8266_wether_station_1.png

esp8266_wether_station_2.png

 

 

При всей привлекательности микроконтроллера ESP8266 с его большим объемом памяти, железной поддержкой Wi-Fi и массой разных плюшек, он не лишен недостатков. Самый основной - ограниченное количество поддерживаемых одновременных TCP соединений равное 5. Если превысить этот лимит, то контроллер потеряет связь с окружающим миром, при этом watchdog будет думать, что все в порядке, а следовательно, даже не попытается нам помочь. Будем стараться это помнить!

Стоит начать с концепции

  1. Доступ к данным метеостанции нужно получать без установки внешних приложений и под любой операционной системой. Для этих целей подойдет практически любой современный браузер. Меня всем устраивает Chrome.
  2. Раз уж за основу взят HTTP протокол, стоит озаботиться экономией трафика и ограничением числа TCP соединений. Хорошим тоном будет передача всего необходимого для формирования страницы контента только при первом обращении, а все последующие операции, такие как отображение показаний с датчиков или настройку контроллера, производить через API. В этом нам поможет JQuery.
  3. А вот, чтобы ослабить болевые ощущения от передачи файлов с SPI Flash в браузер, стоит предусмотреть систему кэширования, например, Etag. Это позволит отдавать тяжелый контент единожды, а при последующих загрузках страницы просто подтверждать его актуальность на уровне Web сервера микроконтроллера и кэш браузера вступит в игру, неимоверно уменьшив время загрузки страницы! "Вы были правы в одном, Мастер: переговоры были недолгими." © Звездные войны. Эпизод 1
  4. Из-за того, что метеостанция с датчиками и контроллером должна располагаться на улице, жизненно необходимо предусмотреть возможность обновлять прошивку ESP через Web интерфейс.
  5. Аналогичным образом должны обновляться файлы Web сервера расположенные на SPI Flash. Этот и предыдущий пункт вкупе позволят обновлять функционал микроконтроллера из домашней сети или из интернета, если конечно в этом возникнет острая необходимость.
  6. Чтобы никто посторонний не могу вмешаться в работу устройства или изменить файлы Web сервера, последний должен хотя бы как-то себя защищать. Пускать в панель управления только после авторизации, блокировать доступ при попытках брутфорса пароля. В конце концов, контроллер обязан самостоятельно генерировать ключи (salt) для авторизации, дабы сделать алгоритм непредсказуемым и исключить потенциальный взлом, в случае если злодей завладеет исходниками проекта. Понятно, что кому она там нужна, эта метеостанция, если её не завязывать с умным домом, если только из-за спортивного интереса, но как говориться “Береженого Бог бережет”.
  7. Датчики стоит расположить по уму - в метеобудке, а вот контроллер в сухом и закрытом боксе. Объединить их между собой, как мне кажется, удобнее по I2C шине - минимум проводов, максимум удобства.
  8. Практически на всех вариантах плат ESP-xx имеется штатный светодиод, можно воспользоваться им как для индикации режимов и состояния микроконтроллера, так и для вывода какой-либо промежуточной информации.
  9. Что касаемо режимов работы ESP8266, как ни странно, но он должен находить домашнюю Wi-Fi сеть и подключаться к ней. Если вдруг звезды не были к нам благосклонны, и домашняя беспроводная сеть приказала долго жить, контроллер обязан перейти в режим точки доступа (AP) дабы к нему можно было подключиться с какого-либо устройства и перенастроить его на другую сеть. А вот пока последнее не произошло, ESP должен периодически сканировать эфир в поисках долгожданной домашней точки доступа и, если боги были к нам милосердны, и домашняя сеть появилась в эфире, незамедлительно переключиться в режим клиента (STA) и в пылу страсти воссоединиться с ней.
  10. Ну и естественно, как же без отправки данных на внешние ресурсы, сейчас без этого не обходится ни одна уважающая себя кофеварка, не говоря уже о метеостанции. Думаю, что основным блюдом станет протокол MQTT, это уже облегчает возможность интеграции с умным домом, стулом или той же кофеваркой. Ну а на закуску добавим поддержку "ThingSpeak" и "Народного мониторинга". При желании можно нарастить функционал, благо памяти у микроконтроллера еще много.

Как я себе это представляю

Учтите, что на видео, данные с датчиков, эмитируются самим микроконтроллером, это нужно для наглядности. В жизни метеорологическая обстановка намного спокойнее слава Богу.

Перейдем к физической сборки устройства

Как по мне, так самый оптимальный вариант, это воспользоваться отладочной платой NodeMCU V3 и базой для неё. Таким образом, мы получим отличный комплект с разведенной на его борту всей необходимой обвязкой и возможностью питать устройство от 5 до 24 Вольт.

esp-nodemcu.jpg

Отладочная плата на базе, и смотрится хорошо, и удобства хоть отбавляй.

nodemcu_base3.jpgnodemcu_base5.jpg

Заливаем прошивку, образ SPI Flash и подключаем четырьмя проводами датчики. Справится даже ребенок.

Ссылки:

  1. Базовая плата для NodeMCU V3 с преобразователем питания 5-24V в 5V
  2. Отладочная плата ESP8266 от NodeMCU

Естественно никто не запрещает Вам развести свою плату. Если Вы это сделаете, скиньте нам свое творение, возможно мы перейдем на него. В идеале, все должно размещаться в метеобудке.

Датчики взятые за основу

Датчик уровня освещенности BH1750

Скрытый текст

GY-302-BH1750.jpg

  • Интерфейс шины I2C
  • Диапазон измерений от 1 до 65535 Lx
  • Фильтр световых шумов 50/60 Hz
  • Возможность смены адреса на шине
  • Не требует калибровки
  • Рабочая температура от -40 до 85 градусов C
  • Питание от 2.4 до 3.6 V

Датчик атмосферного давления BMP085/180

Скрытый текст

bmp180.jpg

  • Интерфейс шины I2C
  • Диапазон измерения от 300 до 1100 hPa
  • Встроенный датчик температуры
  • Не требует калибровки
  • Питание от 1.8 до 3.6 V

Датчик влажности SI7021-A20

Скрытый текст

A40-Industrial-High-Precision-Si7021-Humidity-Sensor-with-I2C-Interface-for-Arduino-Free-Shipping.jpg

  • Интерфейс шины I2C
  • Диапазон измерений от 0 до 100% RH
  • Погрешность измерения 3% RH в диапазоне от 0 до 80% RH
  • Рабочая температура от -40 до 125 градусов C
  • Встроенный датчик температуры с диапазоном измерения от -40 до 85 градусов C
  • Не требует калибровки
  • Питание от 1.9 до 3.6 V

Альтернативные датчики

Датчик влажности HDC1080

Скрытый текст

HDC1080-GY-213V.jpg

  • Интерфейс шины I2C
  • Диапазон измерений от 0 до 100% RH
  • Погрешность измерения 2%, устаревание (износ) 0.25% в год. На последнее значение могут влиять внешние факторы.
  • Рабочая температура от -20 до 70 градусов C
  • Встроенный датчик температуры с диапазоном измерения от -40 до 125 градусов C
  • Не требует калибровки
  • Питание от 2.7 до 5.5V

Датчик влажности HTU21D

Скрытый текст

HTU21D.jpg

  • Интерфейс шины I2C
  • Диапазон измерений от 0 до 100% RH
  • Погрешность измерения 2%, устаревание (износ) 0.5% в год. На последнее значение могут влиять внешние факторы.
  • Рабочая температура от -40 до 125 градусов C
  • Встроенный датчик температуры с диапазоном измерения от -40 до 125 градусов C
  • Не требует калибровки
  • Питание 3V, максимум 3.6V

Сборка 3 в 1 из датчиков BH1750, HTU21D и BMP180

Скрытый текст

HTU21D-BMP180-BH1750-HTU21D-3-IN-1-Temperature-Humidity-Pressure-Light-Sensor-Triad-Module.jpg

  • Все используемые датчики описаны выше
  • Очень компактные размеры

Комплексный датчик BME280 для измерения температуры, влажности и атмосферного давления

Скрытый текст

BME280.jpg

  • Интерфейс шины I2C
  • Рабочая температура от -40 до 85 градусов C
  • Диапазон измерение влажности от 0 до 100% RH с точностью 3% в диапазоне от 20 до 80% RH. Устаревание (износ) 0.5% в год.
  • Диапазон измерения давления от 300 до 1100hPa
  • Диапазон измерения температуры от -40 до 85 градусов C
  • Напряжение питания от 1.7 до 3.6V

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

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

В этот раз мы воспользуемся более серьезным вариантом – "Метеорологическая будка Стивенсона". Она способна защитить датчики от прямых воздействий окружающей среды, но при этом имеет открытую структуру со стенками в виде жалюзи. Удобно, красиво и самое главное – правильно!

Будка печатается на 3D принтере по эскизам опубликованным на Thingiverse неким kowomike, спасибо добрый человек! Архив с эскизами можно будет скачать в конце поста.

Stevenson1.jpgStevenson2.jpg

Фото готовой будки

IMG_0034.JPGIMG_0035.JPGIMG_0038.JPG

Шпилька М8 крепится через зажимной хомут к мачте уличной антенны.

Скрытый текст

IMG_0031.JPGIMG_0033.JPG

Примерка. Шпилька практически не укорачивалась, чтобы не закрывать будку параболической Wi-Fi антенной.

Хотя в моем случае все это сделано не правильно т.к это солнечная сторона дома. Доступа на теневую сторону дома у меня нет, поэтому приходиться довольствоваться тем, что имеем. По прошлой метеостанции мне говорили "на солнечной стороне все эти измерения - сферический конь в вакууме, слепи %описание-многА-букАв% и закрепи на теневой стороне дома".

Я пока живу в панельном многоквартирном доме, как и не малая часть нашей страны. Доступ к теневой стороне дома (а для меня, по факту, это окна в подъезде) - прямой вызов всем гопникам района трущимся рядом, любопытным соседям с бегающими глазками и всей элите человечества скрашивающей фоном мою унылую и слишком простую, по их мнению, жизнь. Думаю, что мысль я донес.

IMG_0075.JPGIMG_0078.JPGIMG_0079.JPG

Датчики располагаются на разных уровнях. В основании находится датчик освещенности BH1750 и смотрит ровно вниз. Мне кажется, так он будет меньше пачкаться и покрываться пылью и при этом смотреть наружу сквозь минимальное количество препятствий для солнечного света. Вообще размещение этого датчика, это целая головная боль. Как не крути, все будет не то. Оставил так, ведь по сути важны не сами показания, а тенденция изменения. Хотя кого я пытаюсь обмануть, точность важна всегда! Предлагайте свои варианты.

Скрытый текст

IMG_1513.JPG

Намного проще обстоят дела с датчиком атмосферного давления BMP180 и влажности SI7021, кстати, с последнего мы также будем забирать данные о температуре. Их размещаем в оставшемся свободном пространстве будки, благо его там с избытком, но не в конусе т.к пространство в нем менее проветриваемое.

IMG_1136.JPGIMG_1137.JPG

Все хозяйство подключается между собой следующим образом

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, закреплена через ножки для крепления компьютерных материнских плат в корпусах.

1_esp8266_weather_station_v2.JPG2_esp8266_weather_station_v2.JPG

Разъемы для подключения внешних датчиков и питающей линии установил на местах где была пара штатных заглушек. Закрепил все через переходную пластину, выпиленную из куска фольгированного текстолита. Естественно, предварительно пластина была протравлена, а вся медь искоренена, ибо в этом случае она нам не друг.

Скрытый текст

3_esp8266_weather_station_v2.JPG4_esp8266_weather_station_v2.JPG

Также была предусмотрена проставка из полиэтиленового поролона (используется в качестве упаковочного материала при транспортировке грузов) между текстолитом и корпусом, общей толщиной 5мм, а после затяжки крепежных винтов, его толщина не превышает 1мм. Это было сделано из-за опыта эксплуатации предыдущего (временного) бокса для этой метеостанции. Без проставки влага быстро найдет путь вовнутрь, и срок службы устройства снизится.

Производим примерку.

Скрытый текст

5_esp8266_weather_station_v2.JPG6_esp8266_weather_station_v2.JPG

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

Скрытый текст

8_esp8266_weather_station_v2.JPG7_esp8266_weather_station_v2.JPG

Все самое сложное позади, остается только вывести на один разъем шину i2c с питание 3.3 Вольта, а на другой подвести пины питания платы расширения. Но т.к у меня валялся "хвост" отрезанный когда-то от не рабочего блока питания маршрутизатора, и я не побрезговал им воспользоваться по прямому назначению.

9_esp8266_weather_station_v2.JPG10_esp8266_weather_station_v2.JPG

Далее останется все подравнять, проверить качество монтажа, возможность замены платы NodeMCU, если это будет необходимо при эксплуатации и самое главное, дважды проверить, что и куда припаяно. Мои кривые руки и невнимательность уже наказывали меня, а т.к ждать новые запчасти долго, повторять не хочется.

11_esp8266_weather_station_v2.JPG12_esp8266_weather_station_v2.JPG

Общий вид получился таким

Скрытый текст

13_esp8266_weather_station_v2.JPG14_esp8266_weather_station_v2.JPG15_esp8266_weather_station_v2.JPG

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

16_esp8266_weather_station_v2.JPG17_esp8266_weather_station_v2.JPG18_esp8266_weather_station_v2.JPG

19_esp8266_weather_station_v2.JPG20_esp8266_weather_station_v2.JPG21_esp8266_weather_station_v2.JPG

Требования (!!!Читать обязательно!!!)

  1. Arduino IDE с поддержкой контроллера ESP8266, версия 2.4.2 (на версиях выше работоспособность не проверялась)
  2. Установленный модуль в Arduino IDE для загрузки файлов во Flash память микроконтроллера. Как установить описано тут.
  3. Любой модуль на базе ESP8266 c Flash 4MB (3MB выделяем под SPIFFS)
  4. В параметрах выставляем lwIP версии 2 и максимальную производительность (lwIP v2 Higher Bandwidth)
  5. Сам архив с последней версией проекта. Скачать можно в конце статьи или по этой ссылке.

esp8266_ws_install_1.png esp8266_ws_install_2.png esp8266_ws_install_3.png

Обязательные библиотеки (!!!Читать обязательно!!!)

  1. ArduinoJson (v5.13.2)
  2. PubSubClient

Ссылки на библиотеки сенсоров указаны в комментариях к коду. Сами библиотеки, как и обслуживаемые ими сенсоры, не являются обязательными. Вы вольны использовать любые датчики, как физические, так и программные.

Порядок установки (!!!Читать обязательно!!!)

  1. Изучите файлы проекта с примерами использования тех или иных сенсоров. Все файлы с примерами начинаются с префикса users_, это users_auto.h, users_bme280_x2.h и т.д. Загрузите необходимые Вам библиотеки или используйте эти файлы как пример для добавления иных датчиков.
  2. Выставите необходимые настройки для контроллера в среде разработки Arduino IDE. Пример настроек указан на скриншоте выше. Обязательно убедитесь, что выбрано правильное распределение места для внутренней файловой системы, это значит, что 3MB должно быть выделено под файловую систему. Также проверяем, чтобы использовался lwIP v2 в режиме максимальной производительности (lwIP v2 Higher Bandwidth).
  3. Произведите загрузку программы с помощью среды разработки (Ctrl + U).
  4. Произведите загрузку содержимого каталога data в файловую систему. Меню/Инструменты/ESP8266 Sketch Data Upload
  5. Перед тем как устанавливать метеостанцию на постоянное место жительства, подтянуть GPIO-0 (пин D3 на плате NodeMCU) к питанию 3.3V. Во время данной процедуры, питание на контроллере должно отсутствовать.

Первый запуск (!!!Читать обязательно!!!)

Помните, что вся конфигурация микроконтроллера производится исключительно через web интерфейс. Никаких изменений значений тех или иных параметров в коде не требуется, а подобную практику будем считать плохим тоном.

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

Подключитесь к данной сети с любого удобного устройства и перейдите в панель управления (для этого имеется соответствующая иконка, запутаться невозможно), контроллер будет доступен по адресу http://espws.local или http://192.168.4.1 При попытке входа в панель управления будет запрошено имя пользователя и пароль, по умолчанию admin/admin. После входа в панель управления перейдите в раздел "Основные настройки WiFi" и укажите имя и пароль Вашей домашней сети, а также, при необходимости, укажите пароль для подключения к точке доступа поднимаемой контроллером в аварийном режиме. Если все сделано правильно, то контроллер подключится к домашней сети в течении 5-и минут.

Если Ваша домашняя сеть скрыта, то после первоначальной настройки необходимо перезагрузить контроллер. Это необходимо из-за частичной поддержки работы со скрытыми сетями. После перезагрузки контроллер увидит Вашу сеть и запомнит её MAC адрес. Помните об этом если захотите сменить домашний маршрутизатор.

Хотите помочь проекту или спонсировать новый?

Файлы

 

Edited by Kitsum
Обновлена инструкция по установке
  • Like 5

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Добрый день. Вопрос почему не разместить датчик давления на основной базовой плате с контроллером, и также с него вторым датчиком снимать температуру (разместив основной блок в помещении дополнительно увидим температуру в помещении..

Share this post


Link to post
Share on other sites

@academyit Да действительно, можно организовать и так, тут кому как нравится.

Меня интересовала только уличная информация, да и цель была разместить всю конструкцию, вместе с контроллером, за пределами жилой зоны. Но не могу не согласиться, Ваш вариант более полезен! Возможно сделаю так в будущем, длинны кабелей хватит вполне.

IMG_1682.JPG

Share this post


Link to post
Share on other sites

Посмотрел подумал. Хочу переделать под себя может и вам есть смысл переделать схему на датчик BME280 (можно замерять сразу: давление, температуру, влажность). Датчик освещения оставить как есть.

Поставить контроллер INA219 контролировать заряд и разряд аккумулятора. И сделать питание от солнечной батареи.

Я планирую такой вариант сделать. В комплексе затраты не увеличатся за счет уменьшения одного датчика влажности (то есть можно стоимость устройства оставить на одном уровне)

P.S. можно еще поставить лазерный дальномер VL53L0X прикрутить для измерения осадков (но пока это еще мысли)

Edited by academyit

Share this post


Link to post
Share on other sites

@academyit Я уже задумывался об автономной работе, но нужно иметь довольно большой запас емкости аккумулятора. По крайней мере если хочется оставить контроллер с полноценным web сервером и его плюшками. Если это не требуется, то можно уводить контроллер в сон и передавать показания раз в 15-30 минут. Можно передавать дамп данных, например, в виде JSON строки содержащей массив, заполненный за тот-же период времени пока контроллер не выходил в эфир.

От литий-ионных аккумуляторов придется отказаться т.к использование их в уличных условиях, особенно зимой, при не удовлетворительном заряде со стороны солнечной батареи, а это вполне возможно, приведет к гибели аккумулятора и потери устройства. В принципе это не особо критично если устройство стоит дома, но кардинально все меняет если устройство работает автономно в поле, условно говоря. Как мне кажется, достойной заменой может послужить Литий-железо-фосфатный аккумулятор (LiFePO4, LFP), он отлично работает при отрицательной температуре (естественно в пределах разумного), имеет не плохие показатели в основных характеристиках и как бы является следующим витком эволюции. Но все это пока только в теории, в руках я их еще не держал.

По поводу измерения осадков. По началу я хотел собирать весь комплекс, то есть измерение осадков, скорости и направления ветра, но потом спустился на землю. У меня не частный дом, и установить конструкция в независимом от окружающих построек места у меня нет, а, следовательно, и точность этих показаний будет +/- трамвайная остановка. Я отчетливо вижу по текущим графикам, как стена дома дает температурные шумы, если так можно выразиться, на датчики и показания уплывают.

Но если всем этим пренебречь, то стоит взглянуть, как реализовываются, проверенные временем, конструкции метеостанций. Лазерный дальномер, точнее принцип его работы, может пригодиться для определения уровня облачности, но не для уровня осадков. Вот как получают данные по осадкам.

Геометрия емкостей и их расположение относительно друг друга не дают возможности заполнять их водой одновременно. Их объем нам известен заранее, а, следовательно, при заполнении одной из емкости, происходит изменение масс относительно оси и емкость опустошается, а мы по прерыванию фиксируем это получаем количество осадков. Естественно нужно учитывать множество факторов, например, время между прерываниями, площадь воронки над сенсором с которой мы и собираем осадки ну и т.п

Датчик направления ветра и анемометр, как мне кажется, нужно делать без физической связи с электроникой. Например, для направления ветра использовать электронный компас и магнит закрепленный на оси хвостовика.

А вот для анемометра подойдет оптопара из обычного принтера с шаблоном на котором находится темная полоса с мелкими просветами для сенсора.

IMG_1727.JPGIMG_1728.JPG

Ну или как альтернатива оптический сенсор ролика обычной компьютерной мышки с самой осью ролика.

rolicki.gif

В общем для метеостанции есть еще куда копать и о чем писать. Но самое главное, это контроллер, который нам позволяет реализовывать все эти игрушки.

Share this post


Link to post
Share on other sites

На основе доплеровского метода, делаются (датчики осадков, скорости и направления ветра). зимой качалка не будет работать просто замерзнет.

http://ru-patent.info/20/15-19/2017169.html

У меня частный дом, стоит метеостанция передает данные по gprs в сеть. Измеряет (влажность, давление, температуру (несколько датчиков)). Температуру также передает из помещений, температуру воды отопления подача и обратка. (была сделана для удаленного мониторинга - больше всего отопления чтобы не ездить зимой на дом каждый раз при сомнениях.

Сейчас есть интерес расширить функционал... (маловато будет). И уже больше мониторить и управлять тепличным хозяйством. Поэтому от AVR решил перепрыгнуть на ESP8266. C доплеровскими расчетами вряд ли он справиться хотя надо подумать. 

 

Vaisala-WXT520-Weather-Transmitter.jpg

Edited by academyit
  • Like 1

Share this post


Link to post
Share on other sites

Да еще продолжение в тему метеостанции, поднял свои наработки пролежали с 2015 года. Это управление тепличным хозяйством поэтому к метеостанции можно прикрутить:

1. Температура улица

2. Влажность улица

3. Давление

4. Освещенность

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

Дополнительные датчики для связки в теплице

6. Датчик температуры воздуха теплица

7. Датчик влажности воздуха теплица

8. Датчик влажности земли теплица.

9. Датчик CO

10. Датчик PH (раствора при гидропонике) температурно зависимый от раствора воды.

11. Датчик температуры раствора воды или земли (опционально)

Share this post


Link to post
Share on other sites

Приветствую @academyit

Почитал по поводу использования эффекта Доплера в метеостанции. Да действительно, этот вариант очень привлекателен, но в тоже время немного сложнее в реализации как физически, так и программно. Возможно, в будущем попробую сделать для себя что-то подобное.

По поводу тепличного хозяйства.

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

Share this post


Link to post
Share on other sites

Согласен что это должны быть разные устройства у меня так сделано. дом на одном контроллере теплоузел. Метеостанция на другом. теплица на третьем. Но есть момент теплица должна работать также анализируя и внешние параметры (к примеру если я знаю что день будет теплый и солнечный мне можно уменьшить отоплении теплицы или его отключить заранее, не дожидаясь критической температуры в теплице.). Теплоузел в интернет не выходит умышленно. Кстати есть момент никто не задумывается о взломе управляющих систем злодеями. Ведь можно так навредить или обогрев выключить и все за морозиться. Или наоборот нагрузить систему что проводка погорит образно. Никто не уделяет должного внимания безопасности!

Теперь о измерении направления ветра. Было много вариантов, от оптических энкодеров — заводских (дорого) или самодельных в виде нескольких пар светодиодов и фотодиодов, и диска с кодом Грея (сложно и много компонентов), до магнита и 4-8 герконов (слишком просто и неточно). AS5040 – магнитный энкодер. Так как особая точность не нужна, то аналоговый выход энкодера подключен к ADC микроконтроллера.

FULLTEXT01.pdf

Edited by academyit

Share this post


Link to post
Share on other sites

Безопасность автоматизированных систем домашнего производства, на данный момент, далека от идеала. Если с центральным узлом (сервером) все довольно хорошо т.к. обычно используется система под управлением полноценной операционной системой, то с периферией (микроконтроллеры) все обстоит не так весело. Сложность понимания и организации систем шифрования поднимают планку входного уровня, и львиная доля энтузиастов попросту не тратит на это свое время. Хотя есть варианты организации относительно безопасной связи на уровне микроконтроллеров, например, AES шифрование. ESP вообще из коробки поддерживает SSL, что весьма радует. 

Как по мне, так конечный пользователь должен держать связь только с сервером, а доступ к периферии нужен только во время пусконаладочных работ или при диагностике неисправностей, хотя последний пункт под вопросом. Каналы связи также необходимо развязывать и не использовать домашнюю беспроводную сеть, да и проводную тоже, для связи повседневной вычислительной техники (телефоны, компьютеры) и роя микроконтроллеров. Отдельная экосистема за NAT-ом в домашней сети со строгим доступом только к центральному серверу через проброшенные порты или, на худой конец, DMZ. Хотя это меня уже понесло в философию со своими понятиями добра и зла.

По поводу энкодера. Действительно интересный вариант, но имеет минус в виде цены. По возможности закажу себе его.

Share this post


Link to post
Share on other sites

Цена вопроса может сказаться в дальнейшем в надежности системы. На данный момент разработал универсальную плату правда под AVR (предыдущие разработки). Запаивать можно что удобно а остальное все зависит от прошивки. Сейчас делаю тоже под ESP8266.

на плате распаян контроллер atmel328p, bmp180, приемник и передатчик RF433, реле для управления. разъем для датчика влажности и температуры по два канала. 

Далее колодка куда можно вставить SIM180l или USB переходник. Разъем для внутрисистемного программирования и I2C.

Не реклама

IMG_20170411_190332_HDR.jpg

  • Like 1

Share this post


Link to post
Share on other sites

"SI7021, кстати, с последнего мы также будем забирать данные о температуре." а не маловат ли диапазон измерения температуры для нашего региона.?

Share this post


Link to post
Share on other sites

@EndWar 

На мой взгляд, вполне достаточно. Но всегда можно воспользоваться другим датчиком, благо обновить прошивку можно через Web интерфейс без разбора метеостанции.

Share this post


Link to post
Share on other sites

Да нет, я не критикую! Идея и реализация на высоком уровне. Просто подумал, что опечатка... Это в BMP180 диапазон измерения -40 +85, а в SI7021 -10 +85

2017-04-23_16-34-28.png

Ой... Извиняюсь, я не прав... Это высокая точность -10 +85, диапазон как Вы и указали, -40 +85...

Edited by EndWar

Share this post


Link to post
Share on other sites

Спасибо! Идеи есть, но детали придут не раньше чем через две три недели... Соберу, обкатаю, выложу тут "свой" вариант, но и к Вам за советом обращусь не раз уверен.. )) Вы на instructables.com этот проект не публиковали.?

Share this post


Link to post
Share on other sites

@EndWar По совету друга думал написать на хабре, но так и не решился т.к ничего нового я не придумал. Возможно в будущем, если этот или другие проекты будут интересны людям.

Share this post


Link to post
Share on other sites
5 минут назад, Kitsum сказал:

 т.к ничего нового я не придумал. 

Может и "ничего нового", но реализация отменная.! У меня сейчас вот что. Так и то про версию купил, исходники закрыты, варианты модернизации и изменения минимальные... 

2017-04-23_17-59-20.png

Share this post


Link to post
Share on other sites

Друзья, хорошая новость, хотя слово "хорошая" тут под вопросом, но в любом случае, новость положительная.

Ранее оговаривалось, что ESP8266 держит не более 5 одновременных TCP соединений. Да, это действительно так и при превышения этого придела контроллер перестанет отвечать по сети. Активные сторожевые таймеры не смогут привести его в сознание и поэтому мы используем дополнительный сторожевой таймер на прерываниях.

После более детального выяснения ситуации и глубокого копания наткнулся на интересный вопрос на GitHub и, что самое главное, ответ на него https://github.com/esp8266/Arduino/issues/3185

В итоге мы можем сделать вывод, что имеющееся ограничение явно обусловлено возможностями микроконтроллера. Ведь это не полноценная сетевая единица в обыденной для нас информационной среде, а маленький муравей, который и так прекрасно справляется с возложенными на него задачами. В итоге если правильно распределять нагрузку и соблюдать порядок очереди соединений мы можем организовывать очень серьезные проекты.

PS: спасибо одной из социальных групп, администраторы которой были уверены, что возложенные нами обязанности на ESP8266 ему не по силам, а выявленная проблема является последствием моей криворукости. Ребята, именно Вы заставили усомниться и побудили еще раз разобраться в ситуации и подтвердить, что наше решение верное, спасибо!

extern "C" {
  #include "espconn.h"
}

espconn_tcp_set_max_con(8);

 

  • Like 1

Share this post


Link to post
Share on other sites

И так, пришла монтажная плата для Node MCU v3 о которой говорилось в оригинальном посте. Смотрится очень хорошо, удобно использовать для быстрого монтажа, правда пришлось отмывать от флюса, но это уже мелочи. Плату можно питать от 5 до 24 вольт и это очень удобно. Также мне в руки попало творение Китайской промышленности в виде сборки из трех датчиков.

  1. BH1750 - датчик освещенности (используется в оригинальной программе)
  2. BMP180 - всеми любимый барометр от BOSCH (используется в оригинальной программе)
  3. HTU21D - датчик влажности и температуры

IMG_1918.JPGIMG_1921.JPG

Плата с датчиками очень компактная, примерно 21x8 мм (без разъема), что очень привлекательно. На плате нет никаких преобразователей и конвертеров, по этому, питание и логика соответствуют 3.3 вольтам. И сразу хочу отметить, что расцветка проводов не соответствует описанию и придется аккуратно разобрать колодку и перекинуть провода, хотя кто-то может посчитать это лишним. На фото провода перекинуты!

IMG_1925.JPGIMG_1926.JPG

Что касаемо библиотек. Для датчика освещенности и барометра ссылки на библиотеки находятся в первом посте. Для датчика влажности можно использовать библиотеку от SparkFun Electronics опубликованную на GitHub

В целом мне понравилась эта сборка, работает хорошо, проблем с внедрением в метеостанцию не возникло, но ложка дегтя все же присутствует и это цена! На данный момент стоимость одной платы может в 2-3 раза превышать стоимость всех этих датчиков, купленных отдельно. Причем каждый датчик в отдельности будет находиться на плате со своей обвязкой, что естественно намного удорожает производство, но боги маркетинга делают свое дело.

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

IMG_1928.JPG

PS: Надеюсь эта информация будет для Вас полезна, и естественно общая ссылка на Али.

Share this post


Link to post
Share on other sites

Тоже присматривался к этой сборке датчиков для применения в этой погодной станции, но мелкое млекопитающее меня побороло.

Но вопрос у меня в другом 

-Не могли бы Вы просветить меня по поводу файла ncsi.txt обращение к которому постоянно происходит в режиме АР или при отсутствии интернета. Это большой брат? Как от попал в Ваш проект? Может это часть API? Поиск не дал вразумительного ответа.

Share this post


Link to post
Share on other sites

@zenone В проекте все возможные обращения могут быть только через API, который описан и открыт или непосредственно к самим файлам на flash. Я уверен, что не совсем корректно поставлен вопрос, думаю, что он появился из логов в Serial при обращении к web серверу микроконтроллера. Если я прав, то дело тут в устройствах с которых идет подключение к точке доступа (esp8266), они пытаются узнать различную информацию о самой точке доступа, получить различные списки технического характера ну и все то, что захочет разработчик ПО используемого на клиенте. Это поведение я заметил почти у всех мобильных устройств как под Android так и под iOS. Думаю, что стоит почитать по поведению мобильных платформ при подключении к открытым хотспотам в аэропортах и других общественных местах.

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

Вот пример того, как ведут себя iOS (10.10.10.100) и Android (10.10.10.101) сразу после подключения к метеостанции, работающей в режиме AP.

espws_http_1.png

Естественно, что операционные системы пытаются взаимодействовать со сторонними ресурсами, но увы, кроме esp их никто не ждет.

Через некоторое время полетят запросы к сторонним ресурсам, и оживятся некоторые системные службы.

Скрытый текст

Скорее всего на устройстве под управлением Android пытается обновить базы Kaspersky.

espws_http_2.png

PS: ну и естественно большой брат всегда с нами.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By Kitsum
      Просмотреть файл [esp8266] Библиотека CMD, реализует настройку микроконтроллера и управление вашей программой через терминал.
      Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой.
      Данная библиотека позволяет реализовать:
      Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n".
      Подключение библиотеки
      #include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс.
      cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым.
      void Setup() { Serial.begin(115200); command.add("test", myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции.
      В функции loop должна находится команда вызова обработчика.
      void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований:
      Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* ... */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры.
      Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером
      void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf("%i. %s\n", i, argv[i]); } } } Пример вызова пользовательской функции без параметров и с ними
      # test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится.
      Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0.
      if (!strcmp(argv[0], "wifi")) { Serial.println(F("Первый аргумент WiFi")); } else { Serial.println(F("Первый аргумент НЕ WiFi!!!")); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy
      char myVar[20]; strcpy(myVar, argv[0]); if (myVar == "123456") { Serial.prinln(F("ok")); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра
      String param1(argv[0]); // String param1 = argv[0]; Serial.printf("argv[0] length: %i\n", param1.length()); Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO"); if (param1 == "qwerty") { Serial.println(F("Hello QWERTY!")); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.
      Автор Kitsum Добавлен 05.12.2018 Категория Библиотеки  
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека smartBlink, реализует умное управление штатным светодиодом, что позволяет добавить индикацию состояния вашей программы или микроконтроллера.
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
      Автор Kitsum Добавлен 10.12.2018 Категория Библиотеки  
    • By Kitsum
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека Cron, реализует планировщик задач для периодического выполнения пользовательских функций.
      Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название.
      Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи.
      Данная библиотека предоставляет следующий функционал
      Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки
      #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду
      cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта
      cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами.
      Фундаментальные константы
      cron::second cron::minute cron::hour cron::day Самые распространенные значения
      cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы.
      cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д
      В функции loop должна находится команда вызова обработчика.
      void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору
      cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки.
      if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи
      uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи.
      Перезапуск таймера задачи производится следующим образом
      cron.update("Blink"); А так можно установить новый интервал вызова задачи
      cron.update("Blink", cron::time_10m); Остановка выполнения задачи
      cron.stop("Blink"); Проверка активности задачи
      bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров.
      Автор Kitsum Добавлен 09.12.2018 Категория Библиотеки  
    • By Kitsum
      Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название.
      Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи.
      Данная библиотека предоставляет следующий функционал
      Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки
      #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду
      cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта
      cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами.
      Фундаментальные константы
      cron::second cron::minute cron::hour cron::day Самые распространенные значения
      cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы.
      cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д
      В функции loop должна находится команда вызова обработчика.
      void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору
      cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки.
      if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи
      uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи.
      Перезапуск таймера задачи производится следующим образом
      cron.update("Blink"); А так можно установить новый интервал вызова задачи
      cron.update("Blink", cron::time_10m); Остановка выполнения задачи
      cron.stop("Blink"); Проверка активности задачи
      bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров.
    • By Kitsum
      Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой.
      Данная библиотека позволяет реализовать:
      Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n".
      Подключение библиотеки
      #include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс.
      cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым.
      void Setup() { Serial.begin(115200); command.add("test", myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции.
      В функции loop должна находится команда вызова обработчика.
      void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований:
      Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* ... */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры.
      Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером
      void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf("%i. %s\n", i, argv[i]); } } } Пример вызова пользовательской функции без параметров и с ними
      # test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится.
      Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0.
      if (!strcmp(argv[0], "wifi")) { Serial.println(F("Первый аргумент WiFi")); } else { Serial.println(F("Первый аргумент НЕ WiFi!!!")); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy
      char myVar[20]; strcpy(myVar, argv[0]); if (myVar == "123456") { Serial.prinln(F("ok")); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра
      String param1(argv[0]); // String param1 = argv[0]; Serial.printf("argv[0] length: %i\n", param1.length()); Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO"); if (param1 == "qwerty") { Serial.println(F("Hello QWERTY!")); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...