Jump to content
iT4iT.CLUB

Kitsum

Members
  • Content Count

    376
  • Joined

  • Last visited

  • Days Won

    198

Kitsum last won the day on May 17

Kitsum had the most liked content!

Community Reputation

194 Excellent

About Kitsum

  • Birthday April 2

Recent Profile Visitors

4,791 profile views
  1. Если Вам нужен графический интерфейс, то ставьте Raspbian, но если интерфейс нужен для установки софта или Вы будите пользоваться им очень редко, то ставьте Ubuntu Server. Для установки операционной системы действуйте по мануалу на официальном сайте Малины. Вам понадобится монитор и другая периферия на этом этапе. В процессе первого запуска, скорее всего у Вас спросят какой пароль задать пользователю root, обязательно запомните этот пароль. Возможно на каких-то этапах установки Вам будут предлагать доставить софт или произвести начальную конфигурацию, если не знаете, что от Вас хотят или сомневаетесь, то оставляйте все по умолчанию. После того как все будет готово, Вас должно выбросить в интерфейс операционной системы. Я пойду по более сложному пути и буду думать, что графической оболочки у Вас нет, а, следовательно, Вас встретит черный экран с предложением ввести логин и пароль. Для Raspbian по умолчанию используется логин "pi" пароль "raspbery", для Ubuntu Server логин и пароль "ubuntu", возможно первая буква заглавная. Нам необходимо выяснить какой ip адрес был присвоен малине в домашней сети (если Вы не задали его руками при установке системы). Сделать это можно следующей командой. ifconfig Если в выводе слишком много информации и Вы теряетесь, то можно убрать лишнее и оставить только данные по локальной сети. Для этого ведите следующую команду в которой укажите первые два октета Вашей сети. Скорее всего это 192.168 ifconfig | grep 192.168 Теперь Вы должны явно видеть выделенный малине ip адрес, мы будем использовать его для подключения с других устройств. Но если Вы используете DHCP, то данный ip рано или поздно изменится. Самым лучшим вариантом будет зайти в панель управления домашнего маршрутизатора и в настройках DHCP сервера закрепить за малиной данный адрес. Можно указать статический ip в самой малине, но тогда можно поиметь горя в будущем, в общем, сетью должен управлять Ваш маршрутизатор, а не рядовые хосты. Теперь мы можем подключиться к будущему серверу с домашнего компьютера. Подключаемся по SSH с помощью любого удобного клиента, например Putty. https://www.raspberrypi.org/documentation/remote-access/ssh/windows.md Авторизуемся под встроенным пользователем о котором упоминалось ранее и под которым Вы уже заходили на предыдущем этапе. Повышаем себе привилегии до root sudo su Обновляем информацию об актуальных пакетах apt update Обновляем имеющиеся в системе пакеты apt upgrade Устанавливаем MQTT брокер apt install mosquitto Брокер должен начать работать сразу после установки на начальной конфигурации, для домашнего сервера это вполне достаточно. Проверить статус брокера можно так: /etc/init.d/mosquitto status Теперь пора поднять web сервер, для дома прекрасно подойдет Apache, а заодно сразу поставим PHP и модуль позволяющий добавить в Apache поддержку .php скриптов. apt install apache2 php libapache2-mod-php Перезапустим web сервер /etc/init.d/apache2 restart Для установки MySQL сервера выполните следующую команду apt install mysql-server Во время установки СУБД Вас попросят задать пароль для основного пользователя root, этот пользователь не связан с ОС (просто одинаковые имена) и пароль распространяется только на MySQL. Для удобства можно указать тот же пароль, что используется системным пользователем root, это противоречит политике безопасности, но для теста малины вполне сойдет. Также я очень советую доставить Midnight Commander дабы чувствовать себя человеком при навигации по каталогам системы apt install mc Главное помните, что Midnight Commander обладает правами того пользователя, из-под которого запущен. В связи с этим, если вы захотите редактировать файлы конфигурации или выполнять иные задачи требующие права пользователя root, то всегда запускайте mc через sudo. sudo mc Вас попросят ввести пароль пользователя root и mc запустится от его имени. Для теста можно перейти в домашний каталог web сервера и создать там тестовый php скрипт. Все это сделать можно через Midnight Commander или выполнив следуюoe. командe echo "<?PHP phpinfo();" > /var/www/html/test.php Теперь перейдите в браузере на страницу http://server_ip/test.php чтобы убедиться в работоспособности. Кажется, на этом все, возможно я что-то пропустил, но это уже мелочи. Если будет нужно, то могу в свободно время снять видео как все это развернуть, вроде где-то валялась Raspbery PI 2. В общем пишите если будут вопросы. Если не определитесь какую систему сбора и анализа данных использовать, то можете посмотреть в сторону Zabbix. Тут на форуме есть тема, в которой описано как подружить MQTT и Zabbix. Но в любом случае, для начала посмотрите на другие системы, все-таки Zabbix это серверное решение и очень плотно работает с MySQL, что не очень хорошо для флешки которая используется малиной. Также можно использовать какой ни-ть HDD или SSD формата 2.5 дюйма место SD карты, но это уже отдельная история.
  2. @post125 Менее каменистый путь это брокер на Малине или любой аналогичный вариант. Ставите Ubuntu и одной командой устанавливаете MQTT сервер. В таком случает получаете полноценную систему с возможностью наращивать функционал, в том числе и запись данных куда угодно, хоть в СУБД. Заодно можно систему визуализации добавить, да и вообще, что угодно. А маршрутизатор, как не крути, это чисто транспортный узел со всеми вытекающими ограничениями по железу, а следовательно, и по программной части. Думаю, что вариант с OpenWRT + MQTT больше подойдет для удаленных систем, например, гаража.
  3. Контроллер жалуется, что не может найти точку доступа, но находит её при сканировании эфира. К сожалению, нет какой-либо дополнительной информации чтобы можно было явно указать на проблему. Попробуйте следующее: попытайтесь подключиться к другой точке доступа, например, можно использовать в этой роли сотовый телефон попробуйте сменить имя своей точки доступа, на время теста И еще, очень важное замечание. Обязательно перейдите на WAP2-PSK шифрование. И не скидывайте в открытый доступ скриншоты с настройками доступа к Вашему маршрутизатору. В данном случае, Вы засветили свой ключ доступа, и его обязательно нужно менять.
  4. т.к нет обратной связи для понимания когда, в данных режимах, необходимо подавать сигнал на открытие механического замка, то стоит отказаться от попытки удержания замка в открытом состоянии. Как-никак это делалось для электромагнита. В Вашем случае открыть дверь можно как мастер ключом после выхода из режима программирования, так и любым из добавленных ключей. В случае отсутствия ключей в памяти, что может быть только при монтаже замка, проблема решается при добавлении первого ключа, что опять же делается при монтаже замка. Так что просто удалите код отвечающий за управление замком в этих режимах и попробуйте на практике как это будет работать.
  5. Да, удалите в основном файле строку cron.add(cron::time_1m, [&](){ sensors.checkLine(); }, true); Всю инициализацию датчиков проведите самостоятельно без использования соответствующих функций при описании датчиков. Или замените указанную выше строку на разовый вызов метода checkLine sensors.checkLine(); Проверка датчиков на шине проводится через определение доступности адресов датчиков Wire.beginTransmission(sensor->address); /* ... */ sensor->status = (Wire.endTransmission() == 0); Скорее всего вы получаете не все данные при запросе данных для комплексного суточного графика в следствии чего json строка считается поврежденной и график не строится. А корень проблемы в том, что в данном случае контроллер передает данные по всем сенсорам, для которых активно ведение лога. Связано это с тем, что изначально не было графиков по конкретным сенсорам, существовал только комплексный график, соответственно и данные отдавались все и сразу. Получается, что Вы нашли придел для размера передаваемого объекта с данными. Часть кода уже переписана и прекрасно работает, но есть технические нюансы, из-за которых я не могу назвать какие-то конкретные строки. Ну и опять же, все приходится делать только в свободное время.
  6. Проверьте повторно этот код, возможно, как раз в конце суток, Вы пытаетесь писать за приделы массива, что приводит к краху. Работа index.htm не может влиять на микроконтроллер т.к весь код этого файла обрабатывается на стороне браузера. Контроллер принимает участие только в ответах на запросы API. По умолчанию контроллер полностью работает в автономном режиме, без подключения WiFi, сторонних сервисов, и внешней логики. Ставим в гараж, накидываем датчики, нагрузку, двигаем ползунки в web интерфейсе и в бой. Все остальное уже последствия различной степени интеграции в пользовательскую кухню. На данном этапе существования проекта можно легко добавить практически все идеи, описываемые в этой теме.
  7. А вот это оставлять так не стоит. Не пытались выяснить через какое время после старта это происходит или после какого события? Обратите внимание, что в Serial монитор периодически сбрасываются данные о свободной памяти (freeHeap), это значение не должно постоянно уменьшаться. Обычно, после выполнения всех заданий в планировщике это значение останавливается на фиксированной отметке и больше не уменьшается. Также для отслеживания памяти через web можно добавить программный сенсор. sensors.add(new knob_t(0, 81920, "1", "RAM", "Byte"), device::in, "ram", [&](){ return 81920 - ESP.getFreeHeap(); }); Это первое с чего стоит начать. Также можете отключать разные части кода и смотреть на работу в течении суток. И помните, что в ESP8266 v2.4.1 для Arduino IDE имеется утечка памяти. Я рекомендую использовать 2.4.2. В общем, не бросайте эту ситуацию. Лично я использую Zabbix, передача данных идет через MQTT. Но думаю, что стоит отталкиваться от того, на чем вы можете развернуть какую-либо систему мониторинга. Эту возможность планировалось реализовать в текущей версии, но выход ESP32 перебросил свободное время хобби микроконтроллеров на себя. Это вполне возможно в будущем.
  8. Вы вполне можете так сделать, но, как и нулевые значения, это по-прежнему будут не настоящие данные на протяжении всего начального суточного графика. Тут уже кому, что больше нравится. Лично для меня логически более понятно, когда данные начинают поступать от 0, особенно если отображаются несколько источников информации, я сразу вижу, когда контроллер начал его наполнение. Если требуется более детально рассмотреть динамику изменений и при этом исключить влияние на масштабирование со стороны пограничных значений, я использую выделение нужной области, в народе просто зуммирование. Выделение интересующей нас области Результат зуммирования Смотрите как будет удобнее лично Вам.
  9. Проблема действительно была в коде и искать её нужно в файле sensors.h, нас интересует метод clear String sensors::clear(float value) { if ((int)value == 0) return "0"; else if (value - (int)value == 0) return String((int)value); else return String(value); } Данный код используется для обрезания лишних нулей после запятой при формировании json объекта с данными журнала для их передачи в web интерфейс. Смысл был в уменьшении размера передаваемого объекта. Проблема крылась в самой первой проверке, её не смогут пройти числа меньше от -1 до 1 из-за приведения их к целому значению. Замените его на более явный и понятный код String sensors::clear(float value) { if (value == 0) return "0"; if (value - (int16_t)value == 0) return String((int16_t)value); return String(value); } Вот пример его работы на числах близких к нулю 0.000000, 0 0.123400, 0.12 0.500000, 0.50 -0.900000, -0.90 1.000000, 1 0.987654, 0.99 9.000000, 9 Есть другие, более лучшие способы обработки, постараюсь их рассмотреть в следующей версии проекта, но есть вероятность, что в этой части кода не будет нужды. Уверяю Вас, что все графики масштабируются одинаково. Все дело в том, что: Фактические показания барометра всегда находятся в узкой полосе по оси Y относительно лимитов этой оси График автоматически масштабируется под минимальные и максимальные значения переданных ему данных Изначально массив с данными для графика заполнен нулевыми значениями во всем своем диапазоне Получается, что пока все нулевые значения не будут вытеснены из массива, а это первые 24 часа работы, график будет строиться с учетом этих значений т.к для него это живые данные, хотя в человеческом понимании (появление значений по оси Y отличных от 0) это дает ошибочное чувство, что график только начал наполняться и визуально изменяться. Даже если Вы перезапустите контроллер и откроете график до того, как контроллер начнет перезапись массива с логами, Вы увидите полностью построенный график, но просто все значения по оси Y равны 0. Обратите внимание, как выглядит график давления после первых суток работы. Вот пример на сайте разработчика плагина, который демонстрирует динамическое обновление данных на графике, но, если Вы уделите просмотру этого демо чуть больше времени, то заметите как происходит автоматическое масштабирование графика по шкале Y в зависимости от минимального и максимального значения в переданном массиве данных. https://www.highcharts.com/demo/live-data Возможно в API можно найти свойство, отвечающее за выход значения по оси Y за определенные лимиты и регулирующее поведение графика, но это мои догадки, ответ нужно искать в документации от Highcharts.
  10. @init.d У Вас ряд явных проблем при работе с массивом. for (int i = 0; i < KEYS; i++) kst = DIS; // состояние датчика задается константой Место присвоения значения конкретному элементу массива, тут произведена попытка записать в память, где находится весь массив, значение константы DIS. Место этого код должен был выглядеть следующим образом. for (int i = 0; i < KEYS; i++) kst[i] = DIS; Вообще два одинаковых цикла for можно и одним заменить, но если честно, то наполнение массива kst не имеет смысла т.к массив был заполнен при объявлении, просто заполните его нужными значениями. boolean kst[KEYS] = {0}; Та же самая ситуация происходит и в цикле loop - двойные циклы и попытка перезаписать память, значениями которых там быть не должно. for (int i = 0; i < 3; i++) kst = ex1.digitalRead(i); for (int i = 0; i < 3; i++){ if (kst[i] == ACT) { // если хотя бы 1 ключ активен String state = "Active"; Serial.println (state); } } А хотели, видимо, получить это bool state = false; // Водим bool переменную чтобы не спамить Active в Serial если более одного порта активно for (int i = 0; i < KEYS; i++) { // Все делаем в одном цикле с лимитом указанным к KEYS kst[i] = ex1.digitalRead(i); // Пишем состояние порта в соответствующий элемент массива if (kst[i] == ACT) state = true; // Меняем состояние если хотябы один порт в состоянии ACT } if (state) Serial.println("Active"); // Сообщаем о состоянии ACT Ну и все в таком духе. А если по нормальному, то надо использовать прерывания, PCF8575 их поддерживает. Но опять вопрос, зачем нужен этот расширитель портов, если не задействованы стандартные порты микроконтроллера (в данном случае UNO). Выкидываем PCF и используем прерывания на стандартных портах. Почитать о них можно тут https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/ И в таком случае код будет выглядеть совсем иначе, а работать намного быстрее и стабильнее. Единственный минус, это всего два порта поддерживающих прерывания у UNO.
  11. Доброе время суток. Не совсем понятно, эти проблемы и на локальных графиках тоже или только на народном мониторинге? Если на локальных тоже провалы, значит вы в течении какого-то времени получаете такие данные т.к на наполнение медианного фильтра требуется время, а это не менее трех запросов данных (по умолчанию размер буфера фильтра равен пяти). Тут не все так просто, гарантировать целостность данных нельзя т.к никаких проверок попросту нет. Наличие данных, похожих на настоящие, в одном элементе массива не дает гарантии, что в других элементах все также хорошо. Для повышения надежности используется механизм проверки контрольной суммы, алгоритм выбирается в зависимости от конкретной ситуации. Например, мы отправляем 1 байт полезной нагрузки, пусть это будет чисто 123 или ‭01111011‬ в двоичной системе счисления, следом за ним отправляем еще 1 байт который будет представлять из себя контрольную сумму. Содержимое второго байта зависит от алгоритма, который мы выбираем, пусть это будет битовая операция "И" (AND) и по завершению расчетов мы хотим видеть 0, что будет сигналом о корректности данных. Таким образом второй байт должен содержать такую последовательность бит, чтобы в ходе операции получить значение 0. В нашем примере, второй бит должен содержать число 132 или ‭10000100‬ в двоичной системе счисления. На принимающей стороне производим расчет: 01111011 & 10000100 = 00000000 Также доступны и другие битовые операции https://ru.wikipedia.org/wiki/Битовые_операции Для каждой конкретной задачи требуется свой алгоритм, конечно не факт, что это будут именно битовые операции. Используется только медианный фильтр. Чтобы отключить его, перейдите в файл sensors.h и найдите строку medianFilter_t lastDimension; Замените её на float lastDimension; Медианный фильтр использует float для хранения значений, на практике он нужен только чтобы сгладит пиковые выбросы, спровоцированные кратковременными внешними изменениями в среде в которой находятся сенсоры. В последних исходниках проекта имеются только сжатые файлы, но поддерживаются оба варианта. Приоритет отдается сжатому файлу т.к его транспортировка требует меньше времени. Вы можете удалить архивную копию, но предварительно убедитесь, что на контроллере имеется его распакованный вариант, иначе могут быть небольшие трудности. Явного округления в коде не предусматривалось, давайте искать. Для начала, стоит посмотреть на данные передаваемые от контроллера в web интерфейс. Сделать это можно пройдя по ссылке http://espws.local/api/sensors/log (espws.local стоит заменить на ip адрес если пытаетесь открыть ссылку с устройства не поддерживающего mDNS или имеющего проблемы при работе с зоной .local). Еще более наглядный вариант, это зайти на главную страницы web сервера микроконтроллера, открыть режим разработчика в браузере (раздел network), далее открыть график и поймать запрос на страницу /api/sensors/log. В окне ответа сервера ищем вкладку с предварительным просмотром, там будет разобранный json ответ с данными. Просмотрите эти данные и попытайтесь определить, получаете ли Вы эти значения уже округленными или это происходит во время создания самого графика. На народном мониторинге используется тот же самый плагин для создания графиков, что и в проекте метеостанции. Вы можете изменять визуализацию как Вам больше нравится, но в приделах возможностей самого плагина. Вот ссылка на сайт разработчика https://www.highcharts.com/ они предоставляют очень наглядные демо и всю документацию для создания собственной визуализации данных, это могут быть не только графики. Постараюсь в ближайшее время воссоздать Вашу проблему с округлением, но с разовыми пропажами данных все сложнее т.к это касается непосредственно Вашего кода.
  12. Скорее всего Вы достигли придела в шаге шкалы для библиотеки 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
  13. @post125 в данном случае функция getSensorData1 должна быть объявлена до функции sensors_config, но у Вас есть другие проблемы в коде. Попробуйте такой вариант, не могу гарантировать его работоспособность, но общее понимание процесса он должен дать. #ifndef USERS_H #define USERS_H float slaveF1[8]; knob_t *F1_0 = new knob_t(0, 4, ".01", "батарея1", "V"); void getFullDataF1() { byte i, y; byte b[4]; Wire.requestFrom(0x01, 32); while (Wire.available()) { b[i++] = Wire.read(); if (i >= 3) { i = 0; slaveF1[y++] = *(float*)b; if (y >= 7) return; } } } float getPowerF1() { return slaveF1[0]; } void sensors_config() { Wire.begin(4, 5); cron.add(cron::time_5s, getFullDataF1, true); sensors.add(F1_0, device::out, 0x01, "battery1", getPowerF1, true); } #endif Т.к Вы выбрали механизм сбора всех данных за раз, то производить эту процедуру каждый раз когда требуются данные только по напряжению аккумулятора, нет никакого смысла. Считывайте данные отдельной задачей, а в коде сенсора просто забирайте нужный элемент массива из памяти. Также старайтесь избегать глобальных переменных, различные промежуточные операции можно делать прямо в ваших функциях и методах. Остальные ошибки по невнимательности или спешке, думаю нет смысла на них указывать.
  14. Доброе время суток. Схожий вопрос уже был в теме, посмотрите этот комментарий, его вторая половина посвящена графику https://it4it.club/topic/55-meteostanciya-na-esp8266-ot-it4itclub/page/19/?tab=comments#comment-999 На всякий случай опишу ключевые места связанные с графиком. За обновления лога с сенсоров отвечает задача в планировщике, по умолчанию она вызывается каждые 10 минут, найти её можно в основном файле проекта. cron.add(cron::time_10m, [&](){ sensors.logUpdate(); }, "httpSensorsLog"); В файле sensors.h, в классе sensors имеется свойство, отвечающее за размерность массива в котором хранятся данные с сенсоров. По умолчанию стоит значение 144, что при вызове задачи обновления каждые 10 минут дает нам данные за полные сутки. class sensors { public: /* ... лишнее вырезано .... */ private: /* ... лишнее вырезано .... */ byte logSize = 144; } sensors; Изменяя эти значения можно получить нужный временной диапазон начала и конца графика с удобным шагом между точками на графике. Теперь нас интересует файл index.htm в каталоге data, по умолчанию он сжат в .gz с параметром ultra. Распаковываем и вносим следующие правки, по завершению редактирования сжимаем его обратно в .gz. Нас интересуют две функции в которых происходит формирование графика, найти их можно по формуле используемой в расчете позиции первого элемента графика. Формирование графика происходит с лева на право, то есть от старшей временной позиции к младшей. Также в этих функция имеется упоминание об интервале между точками. Для общего графика var pointStart = new Date().getTime() - obj.timeAdjustment - 143 * 10 * 60 * 1000; // Начальная точка сутки назад var pointInterval = 600 * 1000; // Интервал между точками 10 минут Для графика по конкретному сенсору pointStart: new Date().getTime() - obj.timeAdjustment - 143 * 10 * 60 * 1000, pointInterval: 600 * 1000 Внесите изменения относительно правок в коде формирования лога на микроконтроллере. На этом все правки закончены, но я обязан напомнить, что массив с данными лога хранится в оперативной памяти, а она, как и все в этом мире, имеет свой конец. Также это означает, что при потере питания на контроллере, будут потеряны и данные. Сделано это для защиты от износа spi flash где можно эти данные сохранять. Также отмечу, что контроллер не хранит временные позиции снятых показаний, сделано это для экономии оперативной памяти. При расчете конечной точки временной шкалы графика, используется единственная временная отметка с указанием времени в миллисекундах, прошедших с последнего обновления данных. Относительно этой отметки и времени, установленном на устройстве, с которого происходит просмотр графика, производится формирование всей шкалы с данными. Рассматривался ли вариант со снятием показаний через RS232 ИБП и дальнейшая передача показаний, например, через SNMP по запросу от внешнего хоста? Можно таким образом подвязать различные системы мониторинга, например, Zabbix.
  15. Доброе время суток. Как Вы уже правильно заметили, библиотека wire.h уже объявлена в файле tools.h, объявлять её еще раз нет необходимости, но даже если и объявить его повторно, то это не даст совершенно никакого результата из-за определенных директив препроцессора, о которых можно почитать, например тут https://docs.microsoft.com/ru-ru/cpp/preprocessor/preprocessor-directives Что касаемо добавления собственных переменных, функций, классов и т.п, то тут нет никакого ограничения, это можно делать где угодно, главное, чтобы эти данные были в области видимости того кода где они будут востребованы. Я могу только направить, порекомендовав использовать уже имеющиеся файлы по их назначению. Допустим взять файл config.h, он содержит описание класса, предоставляющего интерфейс работы с файлами конфигурации, файл логически завершен (в той или иной степени) и любая другая информация, не имеющая прямого отношения к данному классу, там будет лишней. К таким файлам можно отнести следующие: config.h cron.h sensors.h webserver.h wifi.h Вносить изменения в эти файлы не рекомендуется, но не запрещается если Вы хотите доработать функционал, предоставляемый ими. Другие файлы более открыты для редактирования, и даже нуждаются в нем т.к проект дорабатывается каждым под собственные нужды. Я бы посоветовал вносить в них правки, соответствующие их логическому предназначению. gpio.h - если требуется описать управление какой-либо нагрузкой через порты микроконтроллера в том числе и через различные платы расширения. services.h - если требуется описать взаимодействие контроллера с внешними серверами или устройствами, например, через TCP/IP. tools.h - если требуется где-то описать вспомогательные утилиты которые не заслуживают вынесения их в отдельный файл проекта. Теперь, что касаемо пользовательских файлов users_auto.h users_bme280_x2.h users_ds18.h - нет в исходниках, но встречался в этой теме users_wspeed.h - нет в исходниках, но встречался в этой теме ... То это файлы с примерами конфигурации сенсоров для web интерфейса. Конечно можно пользоваться и ими, но только каким-то одним за раз. Я же рекомендую закомсентировать их в основном файле и создать свой собственный и описать в нем все необходимые сенсоры, подключить все необходимые библиотеки для этих сенсоров и т.п. А имеющиеся файлы используйте как подсказки для реализации задуманного. Ну и остается основной файл, он по сути, просто собирает все в кучу, но Вы можете вносить в него любые правки, даже разместить там все свои модификации, главное, чтобы Вам потом было удобно во всем этом разбираться. Надеюсь это поможет Вам определиться с выбором файлов для модификации, но, если есть сомнения, просто создайте собственный файл, возможно даже не один, и опишите все там, так Вы точно не запутаетесь. Возможно Вы имели в виду считывание из памяти ProMini, поправьте если я не прав. Я не знаю, как Вы организовали модель обмена данными между двумя контроллерами по i2c, имею только общее представление о проделанной Вами работе. Но посоветую обратиться к проверенному временем механизму, реализованному практически во всех популярных библиотеках, отвечающих за связь с датчиками на шине i2c. Общая суть очень проста: Есть набор команд, которые можно отправить своему Slave, они заранее оговорены, как и ответы на них. Команда может запрашивать данные как по определенному параметру, так и по группе параметров, например, температура или температура и влажность. Мастер всегда знает какой объем данных должен прийти в ответ на ту или иную команду, например, один Byte или массив из 8-и Byte, хотя никто не мешает принимать данные до тех пор, пока: не будет получен специальный Byte конца телеграммы, не будет превышен выделенный объем памяти под ответ, не будет пойман таймаут по тишине в эфире или таймаут из-за медленного ответа Slave. После получения ответа производим разбор данных и выделение полезной часть и тут мы возвращаемся к первому и второму пункту этого списка. Аналогичным образом можно отправлять конфигурационные команды, например, для управления нагрузкой на портах Slave. Просто выберите удобный и быстрый для Вас способ обмена данными.
×
×
  • Create New...