Хабрахабр

Фиаско. История одной самоделки IoT

Большинство статей пишется по принципу «Я/мы это сделал/и, глядите как круто!». Эта же публикация посвящается провальному проекту. Добро пожаловать под кат…

Это продолжение моей публикации Разработка умных устройств на примере контроллера теплого пола на ESP8266

Планировка — евротрешка, коридор, кухня-гостиная на первом этаже, с/у, детская и спальня на втором. Я живу в небольшом доме, который построен по моему проекту. При этом перекрытия деревянные, на втором этаже плавающий пол, ТП — в плите ГВЛ. Из нестандартного — стены арболит, фундамент УШП, отопление исключительно ТП. Управляет котлом китайский программируемый на неделю беспроводной термостат. На первом этаже 3 петли труб ТП (фактически одно помещение), на втором — тоже три, но каждая петля отвечает за одно помещение (спальня, с/у, детская), За тепло отвечает настенный газовый котел 14кВт. Мозги на батарейке, реле спрятано. В каждый день недели у него четыре периода, в каждый период можно задать нужную температуру. Но мне часто нужно больше чем есть. Работает отлично. Посмотрел я предлагаемые решения, ничего мне не понравилось. Захотел я покомнатное регулирование температуры. А по специальности я — программист. И попалось мне на глаза слово «Ардуино». И понеслось…

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

Датчики температуры

Я пытаюсь их исключить или скрыть, если исключить не получается. У меня не любовь к проводам в интерьере. Датчики долго работают от батареек и вещают на частоте 433мГц. И несколько извилистым путем я пришел к использованию в качестве датчиков температуры в комнатах использовать беспроводные датчики от китайских метеостанций. Забегая вперед скажу — каждый производитель метеостанции изобретает свой протокол передачи данных датчиком. Вполне симпатичные, можно выбрать разного цвета, с экраном и без экрана. Я разработал библиотеку, которая принимает данные от 4 типов датчиков. В процессе экспериментов я анализировал протоколы 5 типов датчиков — у них у всех разные форматы передачи данных. Основным инструментом анализа данных стал китайский логический анализатор. С пятым связываться не стал — его протокол не похож на остальные отсутствием границ пакетов. Стоит совсем немного, пользоваться просто — рекомендую приобрести всем ардуинщикам. Без подобного инструмента выполнить анализ протоколов — практически не реально.

Этот подход позволил нивелировать шум в эфире и понизить нагрузку на процессор, по сравнению с подходом с прерываниям при изменении уровня на пине приемника. Я реализовал библиотеку на принципе семплирования, частота 10кГц. Для отладки использовался логический анализатор:

Сигнал с данными отладки


3...6 каналы — данные для отладки

Приведу примеры датчиков и их особенности.

  • Тип 1: Передача данных каждые 35 секунд. Период не изменяется и это является проблемой при использовании 3х и более датчиков — часы в датчиках идут немного по-разному, сигналы могут иногда накладываться, и один-два датчика выпадают на час-два-три раз в неделю-две. 6 пакетов данных за 0.8сек. ID датчика меняется при каждом включении. Нет данных о состоянии батареи.

    Внешний вид

    Данные


    Сверху — данные приемника, стрелками отмечены помехи
    Снизу — данные передатчика.

  • Тип 2: Период передачи данных — 40...80 секунд, в зависимости от канала. Самый лучший на мой взгляд протокол — 15 пакетов данных за 0.6сек, есть контрольная сумма. ID датчика меняется при включении, есть передача данных состояния батареи. Самый слабый передатчик — когда поместил приемник в коробку, качество приема заметно ухудшилось. Вероятно лечится внешней антеной для приемника.

    Внешний вид

    Данные


    помехи отсутствуют

  • Тип 3: Период передачи данных 50..55 секунд, в зависимости от канала. 7 пакетов за 0.6сек. ID меняется при включении, есть передача данных состояния батареи. Неплохой выбор.

    Внешний вид

    Данные

    Практически идентичны типу 1

  • Тип 4: Период передачи данных 56...76 секунд, в зависимости от канала. Экрана нет. Изменяемый при включении ID не обнаружен. Есть ли отличия в ID у разных экземпляров — не знаю, у меня такой датчик один. Данные о состоянии батареи — есть. Мощный сигнал, пропуска передачи практически не наблюдал.

    Внешний вид

    Данные

    не сохранились

  • Тип 5: Период передачи не замерял, переключателя каналов нет, протокол не глубоко не анализировал.

    Внешний вид

    Данные

В итоге блок приемника реализовал на Arduino Pro Mini c отдачей данных по i2c slave.

Arduino Mega

Мой контроллер имел командный интерфейс, управлялся посредством вводимых через UART команд. Это первая платформа, на которой я сделал контроллер. У меня есть плата Mega от Robotdyn, совмещенная с ESP8266 и вот на этой плате я планировал построить свою разработку. На том этапе, я планировал сделать WEB-интерфейс на ESP8266 и общение ее с Мегой по UART. Но в процессе знакомства с ESP8266 я понял, что этот небольшой чип вполне способен совместить в себе функции контроллера и интерфейса.
Особое достоинство платы — большое число внешних портов.

ESP8266

Для этой платы есть огромное количество библиотек. Я использовал вариант платы WeMos D1 mini, у нее небольшие размеры и достаточное для меня количество выводов — с учетом использования расширителя портов. Собрал я контроллер на этой плате. Например me-no-dev/ESPAsyncWebServer — отличная библиотека web-сервера с поддержкой web-сокетов. Все красиво работает. Разработал web-интерфейс. Или я что-то сделал криво, или какая-то из используемых библиотек кривая. Но по непонятной мне причине — аптайм не больше суток. При превышении — рестарт или даже зависание (не смотря на имеющийся watchdog. К тому же, есть ограничение на 5 одновременных подключений. С учетом того что мой web-интерфейс состоит из почти десятка файлов, а браузеры загружают страницы в 5 параллельных потоков — добиться рестарта элементарно. с зависаниями я поборолся использованием внешнего watchdog'а). Стал искать другие решения. Для себя я решил — эта плата может использоваться только в качестве клиента.

Скрины интерфейса

ESP32

В ESP32 всего больше — частоты, памяти, ног, … Но вот беда — библиотека me-no-dev/ESPAsyncWebServer на ней не работает в плане web-сокетов. Это вроде как наследник ESP8266. Вылетает. Совсем. Другой библиотеки web-сервера с поддержкой web-сокетов я не нашел.
Что-то связанное с многопоточностью.

На данном этапе я принял решение использовать плату с linux — ничего более подходящего не придумал.

Вроде их не много:
Мои требования к плате.

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

Orange Pi i96

Можно поставить Ubuntu или DietPi на встроенную память. Данная плата подходила по всем параметрам — нет видео-выхода, WiFi, встроенная flash память, слот SD карты. Нельзя сделать точку доступа. Но беда этой платы — ее ПО. В топку. Ну а самая большая проблема — при рестарте меняется MAC адрес и ничего с этим сделать не получилось. (На момент написания статьи, на 4pda, в ветке посвященной аналогу этой платы (2g IOT) появилось сообщение о том что возможно победить смену MAC)

Onion Omega 2+

С прошивкой из коробки все завелось, экран не нужен, UART не обязателен. Шикарная документация. Node.js поставилось (версии 4.х, но мне не принципиально). SSH по-умолчанию включен. По сравнению с вариантом моей разработки на ESP8266 добавился отдельный контроллер Arduino Pro Mini, для анализа данных приемника данных датчиков температуры. Поставились (с помощью бубна) библиотеки sqlite и i2c для Node.js.
Кроме i2c, никакие аппаратные интерфейсы мне больше не нужны. Проводные датчики с интерфейсом 1wire подключены через мост 1wire<->i2c (DS2482-100). Контроллер приемника соединен с Omega как i2c slave. Я не стал разбираться, портировал на js ту библиотеку DS2482, что работала на ESP8266. Для этого моста есть библиотека для node.js, но у меня она не заработала в части поиска датчиков.

Эта проблема решается прошивкой версии 2, она не в статусе релиза, но работает. Но вот беда — WiFi на Omega-2 работает не стабильно, после перезагрузки роутера не переподключается. Но выяснилась проблема — иногда плата отваливается от роутера Zyxel и снова подключается после перезагрузки роутера или через час-два-три сама без перезагрузки роутера. Стало гораздо лучше. 3в или чуть выше) и добавления внешней антенны — омега ей очень обрадовалась. Или начинает жутко тупить — эта проблема ушла после изменения схемы питания (плата очень любит именно 3. А сильно нужен будет удаленный доступ — я могу удаленно перезагрузить роутер. Таким образом платой я в принципе доволен — то что нет иногда доступа меня не сильно волнует — в качестве основного интерфейса я использовал старый смартфон в доке, подключенный к точке доступа Омеги. Что подать на второй и как подключить внешний watchdog, который подает -, я пока не знаю. Вызывает непонимание — у Omega-2 два пина RST — на один надо подавать +, я так понимаю, это обрабатывается программно.

Интерфейс в интерьере

управление текстовыми командами, передаваемыми по web-сокету). Я уже описывал архитектуру ПО контроллера — она не изменилась (т.е. Многие процедуры/функции кода контроллера были просто транслированы с С++ на JS. Web-интерфейс перекочевал с ESP8266 c косметическими изменениями. Таким образом всю логику я организовал на SQL запросах. Другое дело, что наличие linux (OpenWRT) дало мне возможность использовать SQL базу данных — sqlite. Особенно мне понравилась возможность использования in-memory базы данных — я все временные и текущие данные расположил в этой базе (например — данные датчиков, данные о текущей требуемой температуре, ...). Это фактически мой первый опыт работы с sqlite.

Исходники

Мне кажется это стимулирует умственную активность, мою и читателей. Я обычно делюсь идеями, а не исходниками. Хотите получить исходники — пишите в личку.

Далее — ресурсные испытания. Собрал я все в железе, расположил в коробочке. Можно инсталлировать. После недельного аптайма — я решил что тест пройден.

Коробочка

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

Подключил реле котла.

Контроллер заработал как планировалось.

Для теста я решил чуть поднять температуру в одной из комнат на втором этаже.

Котел стал перегреваться и отключаться.

Оказалось, что температура воды на выходе из петли этой комнаты всего на пару десятых долей градуса меньше чем на входе! И тут пригодились сервисные датчики. Это значит, что тепло она не отдает. Вода не остывает! Значит все тепло дает первый этаж, а ТП на втором этаже еле греет пол. А во всем доме тепло при любой температуре за бортом (цель была чуть понизить температуру на втором этаже). Как следствие — покомнатное регулирование отопления в таких условиях не возможно.

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

Вместе с тем, что проект в целом не удачен, в процессе разработки я познакомился со многими технологиями, с которыми ранее был практически незнаком:

  • Программирование контроллеров
  • Узнал про шины данных 1wire, i2c, uart, ...
  • Обрел некоторые познания в устройстве web-сервера
  • Вроде не плохо разобрался в Web-frontend разработке: html, JavaScript, vue.js
  • Освоил Web-backend разработку: node.js

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

Те, кто дочитал до этого места — могут посмотреть, на то что получилось.

В процессе написания статьи обнаружилась еще одна неприятность с Omega-2 — модуль стал зависать. Жестко, ресет не помогает, только отключение питания. В чем проблема — пока не знаю. Может не нравится повышенное питание — сейчас ему подается 3.8В. Попробую заменить модуль питания. Не смотря на то, что проект не выполняет своих функций, пока что оставлю его в режиме термометра (как говорится, что на Ардуино не делай — получится метеостанция). Но в любом случае, тема мне интересна, я хочу добиться 100% доступности системы 24/7. Если замена блока питания не поможет, попробую систему LinkIt Smart 7688. Она вроде аппаратно идентична Омеге. Может быть будет более стабильна.

Исходя из этого — я пока не нашел для себя идеальный вариант платы для самоделок 🙁

А node.js на телефон вроде можно поставить. Вероятно в качестве мозгов следующего проекта я попробую использовать смартфон на android — датчики к нему подключать придется по wifi, но проблем со стабильностью брендовых телефонов практически нет.

Буду признателен если поделитесь своим видением по вопросам выбора платы для DIY.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть