В данной публикации я поделюсь опытом о создании IoT устройства с ноля: от появления идеи и воплощении ее в «железе» до создания микропрограммы для контроллера и web-интерфейса для управления созданным устройством через сеть интернет.


До создания этого устройства я:


  • Почти не разбирался схемотехнике. Только на уровне принципов работы
    резистора/транзистора… Я не имел никакого опыта в создании сколь-нибудь сложных схем.
  • Никогда не проектировал печатных плат.
  • Никогда не паял SMD компонент. Уровень владения паяльником был на уровне припаивания проводов и какого-нибудь реле.
  • Никогда не писал таких сложных программ для микроконтроллера. Весь опыт был на уровне «зажги светодиод в Arduino», а контроллер ESP8266 я встретил впервые.
  • Совсем немного писал на C++ для «большого брата», но это было более десятка лет назад и все давно забылось.

Конечно, опыт работы программистом (главным образом это Microsoft .NET) и системное мышление помогли мне разобраться в теме. Думаю, сможет и читатель этой публикации. Полезных ссылок и статей в интернете море. Самые, на мой взгляд интересные, и помогающие разобраться в теме, я привожу по ходу статьи.


Постановка задачи


Я живу в частном доме под Минском, и собственный бассейн, пусть и простейший каркасный, является неотъемлемой частью того набора «бенефитов», который получают многие, живущие в загородном доме. В нашем нестабильном климате оказалось, что в бассейне купаться некомфортно, если он стоит на открытом воздухе: вода выхолаживается ночью, а ветренная погода днем не делает купание комфортным. В прошлом году я своими руками построил геодезический купол фуллера над бассейном, поставил горочку и повесил тарзанку – дети довольны.



Фотоотчет строительства купола на Flickr.


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


На лето «отопительный» контур котла с помощью вентилей переключается на подогрев
бассейна. Подогрев воды бассейна осуществляется с помощью титанового теплообменника, по первичному контуру которого проходит теплоноситель (горячая вода без примесей) из отопительного контура, а по вторичному – вода из бассейна, нагнетаемая насосом рециркуляции системы фильтрации. Поскольку бассейн я использую с хлоратором (много интересного по теме расписано на ForumHouse), в воде содержится немного соли и теплообменник нужен титановый. Нельзя просто так взять и пустить воду напрямую через котел – иначе все трубы разъест солью.



Проходя через теплообменник, теплоноситель, нагретый котлом, с температурой около 70-90 °C отдает тепло воде из бассейна, нагревая ее на пару градусов. Сам теплоноситель при этом остывает на пару десятков градусов, и возвращается в котел с тем, чтобы быть снова
подогретым. Соотношение остывания воды от котла с нагревом воды бассейна зависит от многих факторов: мощности теплообменника и скорости циркуляции воды в первичном и вторичных контурах.


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


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


Необходимо предусмотреть возможность защиты перегрева теплообменника.


Быстрое решение


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


Контролировать перегрев только по датчикам температуры невозможно: система обладает большой инерционностью: после внезапного останова воды в контуре бассейна, при
отключении котла, температура еще продолжает какое-то время расти, т.к. котел все еще по инерции гоняет подогретую воду по контуру, не допуская перегрева «себя, любимого».


Поэтому важно среагировать как можно раньше: а именно по останову потока воды в контуре
бассейна.


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


Датчики температуры было решено использовать Dallas DS18B20, их легко подключить сразу несколько штук на одной шине 1-Wire.



Решено было повесить по паре датчиков на вход и выход как вторичного, так и первичного
контура: всего 4 датчика. Дополнительным преимуществом такого подхода является
возможность мониторинга параметров системы: можно отслеживать насколько охлаждается теплоноситель в первичном контуре и насколько нагревается вода из бассейна во вторичном контуре. А значит – отслеживать оптимальность нагрева и прогнозировать время включения нагрева.


Места установки датчиков на теплообменнике и подводящих трубах

Параметры устройства


Первый прототип устройства был собран на базе Arduino Uno, и успешно запущен.



Но тут же выяснилось, что хотелось бы большего. Подогрев 16 кубометров воды даже всего на
несколько градусов – дело не быстрое. И хотелось бы прямо с работы отслеживать параметры нагрева, включать/выключать его. А заодно интересно было бы снимать графики нагрева, например за сутки.


Ну и раз мы уже получаем IoT устройство, то почему бы нам не контролировать заодно удаленное включение хлоратора бассейна и насоса для него?


Техзадание


Итак, было решено разработать устройство – многофункциональный контроллер бассейна. Он должен уметь:


  • Управлять подогревом бассейна через теплообменник, включая/выключая газовый котел для нагрева воды.
  • Не допускать перегрева теплообменника, контролируя наличие потока воды бассейна во вторичном контуре и превышения температуры вторичного контура.
  • Отображать статистику нагрева в реальном времени (температура на входе и выходе обоих контуров).
  • Записывать (логгировать) значения температур во флеш-память. Отображать данные за
    определенный период в виде графика.
  • С помощью реле уметь включать/выключать насосы бассейна и хлоратор.
  • Управлять всеми параметрами устройства дистанционно, через встроенный микро-веб сервер.

Было еще искушение прикрутить Blink, MQTT. Но от этих «наворотов» на первом этапе
было решено отказаться. И тем более, не хотелось бы выносить возможность управления куда-то наружу. Встроенного веб сервера для моих целей вполне достаточно. А безопасность обеспечивается тем, что в домашнюю сеть из внешнего мира можно войти только через VPN.


Аппаратная часть


В качестве контроллера было решено использовать дешевый и популярный ESP8266. Он отлично подходил для моих целей, кроме одного момента: согласования уровней сигналов 5-вольтовых датчиков с 3.3 вольтовой логикой контроллера. В принципе, датчики Dallas вроде бы работают и на 3 вольтах, но у меня от контроллера до датчиков достаточно длинная линия, около 7 метров. Поэтому лучше напряжение повыше.


Было определено, что необходимо иметь по «железу»:


  • Контроллер ESP8266 или его старший брат ESP32 (в виде модуля DevKit).
  • Согласование уровней сигналов для датчиков.
  • Регулятор питания 5-вольтовой частью схемы.
  • Модуль управления реле.
  • Часы RTC + флеш память для записи логов.
  • Простейший 2-строчный LCD дисплей для отображения текущих значений датчиков и состояния прибора и реле.
  • Несколько физических кнопок, для управления состоянием устройства без доступа через web.

Многие компоненты из списка продаются в виде модулей для Arduino и многие модули совместимы с логикой 3.3в. Однако «слепливать» все это на макетной плате пучками проводов не хотелось, ведь хочется иметь аккуратный красивый «девайс». Да и за деньги, отданные китайцам за модули можно вполне нарисовать и заказать свою индивидуальную печатную плату, а ожидание её приезда будет компенсировано сравнительно быстрым и надежным монтажом.


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


Принципиальная схема


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


Первая же сложность с которой я столкнулся: вариантов DevKit контроллера ESP8266 или ESP32 существует достаточно много, некоторые из них отличаются расположением выводов и их назначением, а некоторые даже по ширине. Решено было разрисовать схему так, чтобы можно было поставить DevKit любой ширины и с любым расположением выводов, а по сторонам от него — по 2 ряда парных отверстий-перемычек, и впоследствии проводками соединить нужные выводы, применительно к конкретно купленному контроллеру.


Место под контроллер и 2 ряда парных перемычек: JH1 и JH2 на схеме:



Расположение пинов входа 5v и выхода 3.3v питания встроенного стабилизатора, а также GND мне показались однотипными у разных DevKit, но все же я решил перестраховаться и тоже сделать их перемычками: JP1, JP2, JP3 на схеме.


Перемычки со стороны подсоединения их к компонентам схемы, я решил подписать функциями, которые они вероятно будут выполнять.


А вот как это выглядит вместе с DevKit ESP8266, который я в итоге купил и поставил

Здесь D1 (GPIO5) и D2 (GPIO4) отвечают за I2C шину, D5 (GPIO14) за 1-Wire, D6 (GPIO12) – за получение импульсов с датчика потока.


Принципиальная схема:



(изображение кликабельно)


Несмотря на наличие на борту ESP8266 встроенного стабилизатора питания на 3.3в, нам еще нужно иметь 5 вольт для питания датчиков и LCD, и 12 вольт для питания реле. Решено было сделать питание платы 12 вольтовым, а на вход поставить регулятор напряжения AMS1117-5.0, дающий на выходе нужные 5 вольт.


Для согласования уровней сигналов по шине 1-Wire я использовал полевой транзистор BSS138 c с «подтяжками» по напряжению с обеих сторон.



Очень хорошо про согласование уровней написано в статье Согласование логических уровней 5В и 3.3В устройств.


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



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


На I2C шину я повесил часы реального времени DS3231SN и флеш-память AT24C256C для хранения логов. Встроенная в ESP8266 флеш-память не годится, потому что обладает малым количеством циклов перезаписи (10 тыс. против 1 миллиона у AT24Cxxx, если верить даташитам).


Управление реле организовано на связке чипов PCF8574AT и ULN2803A.



Первый чип представляет собой I2C расширитель портов микроконтроллера. Состояние активного выхода или входа PCF8574AT выбирается выбором адреса по шине I2C.
Чип имеет некоторые интересные особенности, хорошо описанные в статье I2C расширитель портов PCF8574.


Напрямую нагрузкой (реле) управлять чип не может. Для этого используется транзисторная матрица ULN2803A. Есть особенность: матрица легко может притянуть свои выходы с нагрузкой к земле, а это значит, что, если на второй полюс реле будет подано напряжение питания, по обмотке реле потечет ток и контакты реле замкнутся. К сожалению, при таком включении мы получаем побочный эффект: значение сигнала от контроллера инвертируется, и все реле «перещелкиваются» при включении схемы. Я пока не придумал, как убрать эту особенность.


Подробнее про чип описано здесь.


Расширитель портов PCF8574AT так же может использоваться на вход: на часть входов к нему можно повесить аппаратные кнопки, считывая их значения по шине I2C. На схеме пины 4-7 могут быть использованы для чтения состояния кнопок. Главное не забыть программно включить встроенную подтяжку соответствующих ног к питанию.


В то же время я оставил разводку и на транзисторную матрицу, на случай если вдруг захочется подключить дополнительные реле. Для возможных подключений все выводы я завел на коннекторы (точнее на отверстия под них, куда могут быть подпаяны провода или впаян стандартный 2.54 мм DIP разъем).


Пин INT расширителя портов может быть использован для быстрой реакции на нажатие кнопки. Его можно подсоединить к свободному порту на контроллере и установить сработку прерывания по изменению состояния этого пина.


Двухстрочный LCD дисплей так же управляется через расширитель PCF8574AT. Основной момент: питание дисплея осуществляется от 5 вольт, в то время как сам дисплей управляется 3-вольтовой логикой. К слову, стандартные Arduino-адаптеры для I2C не рассчитаны на двойное напряжение. Идею такого подключения я нашел где-то на просторах интернет, к сожалению, ссылку я потерял, поэтому не привожу первоисточник.


Печатная плата


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


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


Печатную плату я сделал размером 97x97 мм. Она с легкостью помещается в стандартную разделочную электро-коробку. Кроме того, платы размерами менее 100х100 дешевы в изготовлении. Изготовление минимальной партии из 5 плат по разработанному макету обошлось в 5 USD, еще около 9 USD стоила их доставка в Беларусь.



Проект платы лежит на сайте EasyEDA и доступен каждому желающему.


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



Фотографии обеих сторон платы

Лицевая сторона:



Тыльная сторона:



Программная часть


Для программирования микроконтроллера, учитывая задел в виде прототипа на Arduino Uno, было решено использовать среду Arduino с установленной ESP8266 Arduino Core. Да, на ESP8266 можно использовать Lua, но, говорят, бывают подвисания. Мне же, учитывая критически важную выполняемую функцию, совсем бы этого не хотелось.
Сама среда Arduino мне кажется немного морально устаревшей, но, к счастью, есть расширение для Visual Studio от Visual Micro. Среда позволяет использовать подсказки IntelliSence по коду, быстро переходить к объявлениям функций, рефакторить код: в общем все то, что позволяет себе среда для «взрослых» компьютеров. Платная версия Visual Micro позволяет еще и удобно отлаживать код, но я довольствовался бесплатным вариантом.

Структура проекта


Проект состоит из следующих файлов:
Структура проекта в Visual Studio

Файл Назначение
WaterpoolManager.ino
Объявление основных переменных и констант. Инициализация. Главный цикл.
HeaterMainLogic.ino
Основная логика управления реле котла (по температурам) и вспомогательными реле.
Sensors.ino
Считывание данных сенсоров
Settings.ino
Настройки устройства, сохранение их в флеш-памяти контроллера
LCD.ino
Вывод информации на LCD
ClockTimer.ino
Считывание показаний часов RTC, или симуляция часов
Relays.ino
Управление включением/выключением реле
ButtonLogic.ino
Логика реакции на состояния аппаратных кнопок
ReadButtonStates.ino
Считывание состояний аппаратных кнопок
EEPROM_Logging.ino
Логгирование данных датчиков в EEPROM
WebServer.ino
Встроенный веб-сервер для управления устройством и отображением состояний
WebPages
В этой папке хранятся страницы веб-сервера
index.h
Основная страница отображения состояния устройства. Идет считывание текущего состояния с помощью вызова ajax. Refresh каждые 5 секунд.
loggraph.h
Выводит лог данных датчиков и состояний реле в виде графика. Используется библиотека jqPlot – все построение происходит на стороне клиента. Запрос к контроллеру идет лишь на бинарный файл – копии данных из EEPROM.
logtable.h
тоже, но в виде таблицы
settings.h
Управление настройками устройства: установка пределов по температурам, потоку воды, периодичности логгирования данных
time.h
Установка текущего времени

Библиотеки
EepromLogger.cpp
Библиотека записи логов во флеш
EepromLogger.h
crc8.cpp
Подсчет 8-битного CRC для библиотеки
crc8.h
TimeSpan.cpp
Структура для управления отрезками времени
TimeSpan.h

Опрос датчиков


При старте устройства происходит поиск датчиков температуры по шине OneWire и занесение их адресов в массив tempSensAddr. Датчики заносятся в порядке их отклика по шине и порядок в дальнейшем не меняется. Запоминается индекс последнего датчика в массиве (устройство умеет работать с 4мя или меньшим количеством датчиков):


while (ds.search(tempSensAddr[lastSensorIndex]) && lastSensorIndex < 4)
{
       Serial.print("ROM =");
       for (byte i = 0; i < 8; i++) {
              Serial.print(' ');
              Serial.print(tempSensAddr[lastSensorIndex][i], HEX);
       }
       if (OneWire::crc8(tempSensAddr[lastSensorIndex], 7) != tempSensAddr[lastSensorIndex][7]) {
              Serial.print(" CRC is not valid!");
       }
       else
              lastSensorIndex++;
       Serial.println();
}
ds.reset_search();
lastSensorIndex--;
Serial.print("\r\nTemperature sensor count: ");
Serial.print(lastSensorIndex + 1, DEC);
Кроме того, с целью диагностики опрашивается их состояние (температуры). Основные данные при инициализации выводятся в Serial и на LCD для диагностики:
// Read sensor values and print temperatures
ds.reset();
ds.write(0xCC, TEMP_SENSOR_POWER_MODE); // Request all sensors at the one time
ds.write(0x44, TEMP_SENSOR_POWER_MODE); // Acquire temperatures
delay(1000); // Delay is required by temp. sensors

char tempString[10];
for (byte addr = 0; addr <= lastSensorIndex; addr++) {
       ds.reset();
       ds.select(tempSensAddr[addr]);
       ds.write(0xBE, TEMP_SENSOR_POWER_MODE); // Read Scratchpad
       tempData[addr] = ds.read() | (ds.read() << 8); // Read first 2 bytes which carry temperature data
       int tempInCelsius = (tempData[addr] + 8) >> 4; // In celsius, with math rounding
       Serial.print(tempInCelsius, DEC); // Print temperature
       Serial.println(" C");
}

Согласно даташиту, датчики требуют не менее 750 ms задержки между запросом значения температуры и получением ответа от датчика. Поэтому в коде введена задержка с небольшим запасом.


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


#define TEMP_MEASURE_PERIOD 20 // Time of measuring, * TEMP_TIMER_PERIODICITY ms
#define TEMP_TIMER_PERIODICITY 50 // Periodicity of timer calling, ms

timer.attach_ms(TEMP_TIMER_PERIODICITY, tempReadTimer);
int tempMeasureCycleCount = 0;

void tempReadTimer() // Called many times in second, perform only one small operation per call
{
       tempMeasureCycleCount++;
       if (tempMeasureCycleCount >= TEMP_MEASURE_PERIOD) {
              tempMeasureCycleCount = 0; // Start cycle again
       }

       if (tempMeasureCycleCount == 0)
       {
              ds.reset();
              ds.write(0xCC, TEMP_SENSOR_POWER_MODE); // Request all sensors at the one time
              ds.write(0x44, TEMP_SENSOR_POWER_MODE); // Acquire temperatures
       }
       // Between phases above and below should be > 750 ms
       int addr = TEMP_MEASURE_PERIOD - tempMeasureCycleCount - 1;
       if (addr >= 0 && addr <= lastSensorIndex)
       {
              ds.reset();
              ds.select(tempSensAddr[addr]);
              ds.write(0xBE, TEMP_SENSOR_POWER_MODE); // Read Scratchpad
              tempData[addr] = ds.read() | (ds.read() << 8); // Read first 2 bytes which carry temperature data
       }
}

В начале каждого цикла tempMeasureCycleCount происходит запрос к датчикам на чтение их значений. После того как проходит около 50 таких циклов (а в сумме это 50*20 = 1000 ms = 1 sec), происходит чтение значения каждого датчика, по одному за раз. Вся работа разбита на кусочки, чтобы код, работающий в прерывании по таймеру, не отнимал много времени у контроллера.


Значение датчика потока вычисляется следующим образом. По прерыванию на пине, на котором висит датчик мы увеличиваем значение счетчика тиков, пришедших с датчика потока:


pinMode(FLOW_SENSOR_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(FLOW_SENSOR_PIN), flow, RISING); // Setup Interrupt
volatile int flow_frequency; // Flow sensor pulses
int flowMeasureCycleCount = 0;

void flow() // Flow sensor interrupt function
{
              flow_frequency++;
}

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


flowMeasureCycleCount++;
if (flowMeasureCycleCount >= 1000 / TEMP_TIMER_PERIODICITY)
{
       flowMeasureCycleCount = 0;
       litersInMinute = (flow_frequency / FLOW_SENSOR_CONST); // Pulse frequency (Hz) = FLOW_SENSOR_CONST*Q, Q is flow rate in L/min.
       flow_frequency = 0; // Reset Counter
}

Логгирование данных от датчиков и о состоянии прибора


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


После некоторого «кумекания» была придумана и реализована следующая модель записи:



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


struct LogEvent
{
       unsigned char litersInMinute = 0;
       unsigned char tempCelsius[4]{ 0, 0, 0, 0 };
       unsigned char deviceStatus = 0;
}

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


Поскольку было бы слишком накладно по объему записывать данные о текущем времени (timestamp) для каждой записи, то данные организуются в большие блоки, по N записей в каждом. Timestamp для каждого блока записывается только один раз, для остальных – вычисляется на основе информации о периодичности логгирования.


unsigned int logRecordsInBlock = 60 * 60 / loggingPeriodSeconds;     // 1 block for hour
unsigned int  block_size = sizeof(Block_Header) + logRecordsInBlock * (record_size + crcSize);
unsigned int  block_count = total_storage_size / block_size;

Например, при периодичности логгирования раз в 30 секунд, мы будем иметь 120 записей в блоке, а размер блока будет равен около 840 байт. Всего у нас поместиться 39 блоков в памяти флешки размером в 32 килобайта. При такой организации получается, что каждый блок начинается по строго определенному адресу в памяти, и «пробежать» по всем блокам – не проблема.


Соответственно, при внезапном обрыве записи при прошлом выключении устройства, мы будем иметь недописанный блок (т.е. в котором отсутствует часть записей). При включении устройства, алгоритм ищет последний по времени валидный заголовок блока (timestamp+crc). И продолжает запись, начиная со следующего блока. Запись осуществляется циклически: самый свежий блок перезатирает данные самого старого блока.


При чтении идет последовательное чтение всех блоков. Невалидные блоки (те, у которых не проходит проверка CRC для timestamp) игнорируются целиком. Записи в каждом блоке читаются до момента встречи первой невалидной записи (т.е. той, на которой оборвалась запись в прошлый раз, если блок не был записан целиком). Остальные игнорируются.
Для каждой записи вычисляется актуальное для неё время, основанное на timestamp блока и порядковом номере записи в блоке.


LCD


В устройстве использован дисплей QC1602A, способный отображать 2 строчки по 16 символов. В первой строке выводится актуальная информация о текущих значениях датчиков: потока и температурах. В случае превышения заданного лимита, возле значения появляется восклицательный знак. Вторая строчка показывает состояния реле нагрева и насоса, а также время, прошедшее с момента включения или выключения нагрева. Каждые 5 секунд дисплей во второй строке кратковременно показывает актуальные лимиты. Фотографии дисплея в различных режимах приведены в конце публикации.


Графики


При запросе через встроенный веб-сервер данные логгинга читаются в бинарном виде с помощью JavaScript:


var xhttp = new XMLHttpRequest();
xhttp.open("GET", "logs.bin", true);
xhttp.responseType = "arraybuffer";
xhttp.onprogress = updateProgress;
xhttp.onload = function (oEvent) {
  var arrayBuffer = xhttp.response;
  if (arrayBuffer) {
       var byteArray = new Uint8Array(arrayBuffer);
                …
}};
xhttp.send(null);

Чтение их в каком-нибудь популярном недвоичном формате, например ajax, было бы непозволительной роскошью для контроллера, прежде всего из-за большого объема, который должен был бы вернуть встроенный http сервер.


По этой же причине, для построения графиков используется JavaScript библиотека jqPlot, а сами файлы JS библиотек подгружаются с популярных CDN.


Пример графика работы устройства:



Наглядно видно, что около 9:35 устройство было включено на подогрев, котел плавно начал нагревать контур отопления (датчики T3, T4), вслед за этим начала расти температура контура бассейна (датчики T1, T2). Где-то около 10:20 котел переключился на нагрев горячей воды в доме, температура контура отопления упала. Затем еще через 10 минут котел вернулся к нагреву воды бассейна. В 10:50 произошла авария: внезапно отключили насос циркуляции воды в бассейне. Поток воды резко упал до ноля, реле нагрева выключилось (красный пунктир на 2м графике), предотвращая перегрев. Но устройство по-прежнему осталось в состоянии нагрева (красная линия на 2м графике). Т.е. если бы насос был снова был включен, и температуры были бы в норме, устройство вернулось бы к нагреву. Замечу, что после аварийного выключения насоса, температуры в контуре воды бассейна (T1, T2) начали резко расти за счет перегрева теплообменника. И если бы не резкое отключение котла, была бы беда.


Встроенный веб-сервер


Для общения с внешним миром используется стандартный класс ESP8266WebServer. При старте устройства, оно инициализируется в качестве точки доступа с дефолтным паролем, заданным в #define AP_PASS. Автоматически открывается web-страница для выбора доступной сети wi-fi и ввода пароля. После ввода пароля устройство перезагружается и коннектится к заданной точке доступа.


Готовое устройство


Готовое устройство было помещено в стандартную разделочную коробку для электропроводки. В ней было выпилено отверстие для LCD, и отверстия для разъемов.



Фотографии фасада устройства в разных режимах

С отображением времени, прошедшего после включения:



С отображением лимитов:



Заключение


В заключение хочу сказать, что, разрабатывая подобное устройство, я получил отличный опыт с схемотехнике, разработке печатных плат, навыки монтажа SMD компонент, в архитектуре и программировании микроконтроллеров, вспомнил почти уже забытый C++ и бережному обращению памятью и прочим ограниченным ресурсам контроллера. Так же в некоторой степени пригодились знания HTML5, JavaScript, навыки отладки скриптов в браузере.


Эти скилы и удовольствие, полученное при разработке устройства, – и есть основные полученные бенефиты. А исходные коды устройства, принципиальной схемы, печатных плат – пожалуйста, пользуйтесь, дорабатывайте. Все исходные коды проекта лежат на GitHab. Аппаратная часть в общедоступном проекте на EasyEDA. Даташиты к чипам, используемым в проекте, я собрал на сетевом диске.

Комментарии (105)


  1. FGV
    13.06.2018 11:41

    ams1117-5.0 сильно греется при работе?


    1. olartamonov
      13.06.2018 13:03

      Экранчик с его подсветкой, реле, наиболее вероятное внешнее питание — 12 В…

      Один-два ватта могут легко образоваться, на полигон сажать надо.


    1. KSVl Автор
      13.06.2018 17:14

      Горячая, но не обжигает…


  1. olartamonov
    13.06.2018 12:58

    Не надо так плату разводить.

    1) «Землю» никогда не разводят тонкой дорожкой, оббегающей всю плату, это прямой путь к неочевидным сбоям. В вашем случае — тупо полигоны с обеих сторон на всю плату, кроме высоковольтных частей, и переходных отверстий побольше.

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

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

    4) Не используйте ULN2803.


    1. Vermut666
      13.06.2018 13:19

      (Disclaimer: уровень моих знаний примерно как у автора)

      Не используйте ULN2803.

      А почему? Я как раз использую. На нем какое-то проклятие?

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

      А есть где-то легкая статья про эти слова?


      1. olartamonov
        13.06.2018 13:24

        А почему? Я как раз использую. На нем какое-то проклятие?


        Большое падение напряжения, около вольта. Замедляет срабатывание реле и сужает его рабочий температурный диапазон чуть ли не до 25±5 °С. Ставьте обычный полевик типа IRLML2402 плюс на обмотку защитный TVS типа SMAJ5.0CA — SMAJ10CA.

        А есть где-то легкая статья про эти слова?


        У TE довольно много статей про продление жизни контактов реле

        http://www.te.com/commerce/DocumentDelivery/DDEController?Action=srchrtrv&DocNm=13C3236_AppNote&DocType=CS&DocLang=EN
        http://www.te.com/commerce/DocumentDelivery/DDEController?Action=srchrtrv&DocNm=13C3264_AppNote&DocType=CS&DocLang=EN

        Про шунтирование симистором — https://habr.com/company/unwds/blog/390601/, очень рекомендуется на индуктивных нагрузках.


        1. lingvo
          14.06.2018 11:39

          Ставьте обычный полевик типа IRLML2402 плюс на обмотку защитный TVS типа SMAJ5.0CA — SMAJ10CA.

          Лучше смарт ключи — BTS4140, NCV8450 или многоканальные VN808, VNI8200. Там все защиты уже стоят.


          1. olartamonov
            14.06.2018 12:04

            Воробьёв тоже эффективнее всего отстреливать из M-29 Davy Crockett.

            Но из рогатки как-то проще.


            1. lingvo
              14.06.2018 12:14

              Но из рогатки как-то проще.

              Но не надежнее. Человек же вроде как не игрушку делает, а серьезный проект, который может дел натворить. Не касаясь выбора других решений в данном проекте — тут-то зачем экономить, если особенных знаний нет? Автор еще не разобрался, как убрать "перещелкиваение" ULNки при включении питания, а вы ему полевик подсовываете — думаете он с ним быстро разберется?


              1. olartamonov
                14.06.2018 14:05

                Я боюсь спрашивать — а чем вас не устраивает надёжность коммутации обмотки реле транзистором с TVS, что вы туда хотите запихнуть аж хайсайд-ключ с десятью видами защит?

                Защита от переполюсовки, перегрузки, перегрева и электростатических разрядов вам для коммутации обмотки реле зачем нужны?


            1. iig
              14.06.2018 12:16

              Что одно, что другое — стОит копейки. В чем сложность распаять 1 корпус вместо 2?


              1. olartamonov
                14.06.2018 14:06

                Не хочу вас расстраивать, но корпусов в любом случае два.


                1. lingvo
                  14.06.2018 14:45

                  Почему?


                  1. olartamonov
                    14.06.2018 14:47

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


                    1. lingvo
                      14.06.2018 15:33

                      Ну они выдерживают до 1Дж энергии. Это ж какой мощности реле должно быть?


                      1. olartamonov
                        14.06.2018 15:52

                        У NCV8450 это, положим, 29 мДж, что немножко меньше.

                        И я таки не понял, в чём глубокий смысл замены 5-центового транзистора с таким же 5-центовым TVS на 50-центовый хайсайд-свитч. Лучше от этого станет что конкретно?


                        1. lingvo
                          14.06.2018 16:04

                          У NCV8450 это, положим, 29 мДж, что немножко меньше.

                          Ну пусть будет хоть 29мДж. Так для какой мощности реле этого недостаточно?


                          И я таки не понял, в чём глубокий смысл замены 5-центового транзистора с таким же 5-центовым TVS на 50-центовый хайсайд-свитч. Лучше от этого станет что конкретно?

                          Ну во первых не хайсайд, а просто смарт-свич. Они есть и лоусайд и скорей всего дешевле. Во первых избавляетесь от TVS или диода, во вторых получаете защиту от КЗ и перегрузки. Ну и применить его легче.


                          1. olartamonov
                            14.06.2018 16:30

                            От КЗ в обмотке реле? От перегрузки обмоткой реле? Транзистор управляется логическим уровнем, что может быть ещё легче?


                            1. lingvo
                              14.06.2018 17:09

                              От КЗ в обмотке реле? От перегрузки обмоткой реле?

                              Ну да.


                              Транзистор управляется логическим уровнем, что может быть ещё легче?

                              Ну конечно, все очень легко — вы посоветовали 20-Вольтовый транзистор в 12-Вольтовую схему, да еще и зашунтировать обмотку TVSом на 5 Вольт. Думаете автору будет легко это все применить? Я думаю нет, так как дым у него повалит довольно быстро.


                              1. olartamonov
                                14.06.2018 17:13

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

                                Ну, то есть, вы же ведь их видели, так?

                                (пожав плечами) Ну да, не посмотрел напряжение питания. Пусть поставит IRLML9301, там 30 В. Даташиты, полагаю, автор умеет читать без особых проблем.


                                1. lingvo
                                  14.06.2018 17:26

                                  Я так понимаю, что мой с вами опыт с реле отличается на года.


                                  Повидал, также как и схемы, вроде предложенной вами, служащие для питания исключительно на плате установленных релюшек, но тем не менее с гавкнувшими транзисторами, которые закорачивались накоротко и держали реле своей цепкой хваткой. Только рубильник помогал. Ах да, все из-за того, что кто-то из снабженцев решил, что можно поставить реле подешевле… Или после ремонтника, у которого вместо нужного реле оказалось под рукой другое, но с очень подходящим футпринтом...


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


                                  1. olartamonov
                                    14.06.2018 17:31

                                    Потому, что его использование в этой роли бессмысленно.

                                    Напоминает ардуинщиков, которые лепят оптрон между ключевым транзистором и выходом микроконтроллера, потому что он «отсекает помехи от реле».


                                    1. iig
                                      14.06.2018 17:49

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


                                      1. olartamonov
                                        14.06.2018 17:55
                                        +1

                                        Есть некоторая разница в том, чтобы ради обеспечения надёжности писать на C без ошибок — и чтобы ради того же писать на Ada.

                                        Надёжность аппаратной части вы можете повышать до бесконечности — поставьте супрессоры на каждую ногу микроконтроллера, сделайте 6-слойную плату с сигнальными линиями исключительно во внутренних слоях, не забудьте про radhard компоненты на диапазон -55...+125 °С, ни в коем случае не используйте корпуса из материалов, отличных от стали, и разъёмы без винтовой фиксации и рейтинга IP68…

                                        Всегда пожалуйста.

                                        Главное — не забывайте, что всё это не имеет смысла.


                                        1. iig
                                          14.06.2018 18:34

                                          Надёжность аппаратной части вы можете повышать до бесконечности


                                          Главное вовремя остановиться ;)

                                          И я таки не понял, в чём глубокий смысл замены 5-центового транзистора с таким же 5-центовым TVS на 50-центовый хайсайд-свитч. Лучше от этого станет что конкретно?

                                          Ну во первых не хайсайд, а просто смарт-свич. Они есть и лоусайд и скорей всего дешевле. Во первых избавляетесь от TVS или диода, во вторых получаете защиту от КЗ и перегрузки.


                                          Сам я этих деталюх никогда не видел. Но. СтОит ли повышать надежность/ремонтопригодность устройства ценой, скажем, $10 удорожанием его на $0.4? В некоторых случаях да, в некоторых нет.
                                          В хобби-проекте — скорее да, чинить в случае чего придется автору.


                                          1. olartamonov
                                            14.06.2018 18:41
                                            +1

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

                                            Потому что вы усиленно решаете то ли выдуманную проблему, то ли реальную, но другую.


                                            1. iig
                                              14.06.2018 19:23
                                              -1

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


                                              А вы не пробовали не приписывать оппоненту свои фантазии? Идею использовать драйвер для реле подал lingvo. Обоснование его не выглядит фантастичным.


                                              1. olartamonov
                                                14.06.2018 19:32

                                                Обоснование его не выглядит фантастичным.


                                                «Снабженцы купили реле подешевле, в результате чего ток обмотки реле превысил допустимые для мелкого полевика три ампера, полевик пробило, а реле продолжило работать, спокойно рассеивая на своей обмотке несколько десятков ватт»?

                                                А я смотрю, у вас и со схемотехникой всё хорошо. Не хуже, во всяком случае, чем с программированием.


                                                1. iig
                                                  14.06.2018 22:07

                                                  "С этими словами гроссмейстер зачерпнул в горсть несколько фигур и швырнул их в голову противника" (ц)
                                                  : Ь


                                    1. lingvo
                                      14.06.2018 20:19

                                      olartamonov, извиняюсь, вы для своих устройств проходили испытания на электромагнитную совместимость, безопасность и климатику?


                                      1. olartamonov
                                        14.06.2018 21:20

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

                                        Так что и не буду.


                                        1. lingvo
                                          14.06.2018 22:01

                                          Причем здесь обмотка реле к моему вопросу? Я спрашивал про испытания по отношению к вашей реплике:


                                          Надёжность аппаратной части вы можете повышать до бесконечности — поставьте супрессоры на каждую ногу микроконтроллера, сделайте 6-слойную плату с сигнальными линиями исключительно во внутренних слоях, не забудьте про radhard компоненты на диапазон -55...+125 °С, ни в коем случае не используйте корпуса из материалов, отличных от стали, и разъёмы без винтовой фиксации и рейтинга IP68…
                                          Всегда пожалуйста.
                                          Главное — не забывайте, что всё это не имеет смысла.

                                          А про сгоревшие транзисторы — действительно не приписывайте мне того, что я не говорил.
                                          Я писал, что я лично менял эти реле? Я писал что-то про марку транзистора, что вы вдруг решили, что он 3 ампера должен выдерживать?


    1. KSVl Автор
      13.06.2018 17:19

      Спасибо за советы!
      Отвечаю по пунктам:
      1. Да, по земле в EasyEDA можно маску наложить, так что все где пусто — земля. И экранирование, как я понял, и дорожки толще.
      2. Реле у меня по 12вольт цепи замыкают контакторы на DIN-рейке, которые находятся далеко от коробки, в щитке в куполе (а сам девайс в доме у котла). Поэтому мне все-равно сколько там между дорожками и их толщина.
      3. Тут реле переключаются достаточно редко. Только при вклбючении/выключении подогрева по команде с устройства и по срабатыванию защиты. Не вижу проблем. Если вдруг обмотка реле сгорит, просто выключится подогрев.
      4. Почему? Поясните.


      1. olartamonov
        13.06.2018 17:29

        4. Почему? Поясните.


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


        1. Alexeyslav
          13.06.2018 23:56

          Там же вроде по тексту упоминается о том что реле всё же запитаны от 12В… для них не столь критично падение на 1В. Кроме того, даже если питать реле от 5В источника я видел реле рассчитанные на 4В, вероятно, как раз для таких ситуаций. Не вспомню правда линейку моделей реле… там их целый ряд был с одним конструктивом и разным напряжением обмотки от 3В до 24В.


    1. MurikS
      13.06.2018 23:17

      3.1) еще надо бы диод параллельно катушке реле.


      1. KSVl Автор
        13.06.2018 23:18

        Поясните, зачем? В ULN 2803 все есть. Рассчитано на двигатели, есть защита от индукционных наводок.


        1. MurikS
          13.06.2018 23:25

          Это было ответ на комментарий olartamonov в котором предлагалось не использовать ULN2803, я и дописал про диод.


      1. olartamonov
        13.06.2018 23:37

        Лучше не диод, а биполярный TVS на 5-8 В (при ключевом транзисторе на 20 В), например, SMAJ5.0CA.

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


        1. iig
          14.06.2018 10:32

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


          Есть результаты измерений? В миллисекундах и тысячах срабатываний?


          1. olartamonov
            14.06.2018 10:43

            1. iig
              14.06.2018 11:02

              Спс.
              Миллисекунды — существенная разница. Не задумывался. Деды-прадеды завещали диод ставить, а оно вот как…
              По сроку жизни контактов — не увидел результатов. Интересно, число срабатываний контактов из даташита по какой методике измеряют?


              1. olartamonov
                14.06.2018 11:06

                По сопротивлению контактной группы.

                http://www.appliedrelaytesting.co.uk/media/appnotes/an050303.pdf


                1. iig
                  14.06.2018 11:18

                  Не увидел, каким образом они запитывают обмотку реле.


                  1. olartamonov
                    14.06.2018 11:21

                    Вообще без супрессии импульсов обратного хода, скорее всего.


              1. lingvo
                14.06.2018 11:34

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


                1. Alexeyslav
                  14.06.2018 15:26

                  у ULN-ок общий вывод диодов висит «в воздухе», вместо соединения его на общий(не "-" питания, а ОБЩИЙ для нагрузки в данной конструкции это +12В) туда можно вкорячить супрессор и получим то что нам надо — защиту ключей от выбросов самоиндукции и ускорение отключения реле. Правда, супрессор надо подобрать так что на него могут разрядится в наихудшем случае все реле одновременно. Обычно это не проблема с обычными релюшками.



  1. Kriminalist
    13.06.2018 13:16

    Статья отличная, но у меня основной вопрос — экономическая целесообразность. Возможно, газ у вас дёшев, но не рассматривали ли вы вариант с солнечным нагревом воды? Прокачивать воду через условно 20 м чёрной трубы? Вы на самом деле переносите тепло от котла к бассейну с очень низкой эффективностью, и это летом, когда дармового тепла хватает.


    1. KSVl Автор
      13.06.2018 17:23

      Читал на том же ForumHouse про нагрев бассейна. Там есть огромная тема по этому поводу. Черная труба — это все игрушки для таких объемов.


      1. Alexeyslav
        14.06.2018 00:05

        вероятно имелось в виду не одну трубу пустить и радоваться, а целый массив на 100кв.м. (10x10м) солнечного коллектора. В хороший солнечный день такой массив может дать 5-6кВт тепловой мощности. Впрочем, видел проекты и на одну трубу но с отражателями особой формы которые в довольно широких пределах независимо от положения солнца фокусировали свет на небольшой трубе проходящей в фокусе зеркала. зеркало может быть достаточно большим и собирать много энергии в солнечный день. Правда, пишут что на наших широтах(Белоруссия, Украина) солнечные коллекторы не так уж сильно эффективны — солнечных дней в году у нас мало. Но в других регионах, они работают даже при низких температурах наружного воздуха. Надо просто посмотреть графики инсоляции в ваших местах, прикинуть стоимость газа на подогрев и стоимость солнечного коллектора.
        Может и имеет смысл какая-никакая экономия?


  1. lingvo
    13.06.2018 13:39
    +1

    Хороший DIY проект. Но сорри, буду критичен:


    В заключение хочу сказать, что, разрабатывая подобное устройство, я получил отличный опыт с схемотехнике, разработке печатных плат, навыки монтажа SMD компонент, в архитектуре и программировании микроконтроллеров, вспомнил почти уже забытый C++ и бережному обращению памятью и прочим ограниченным ресурсам контроллера. Так же в некоторой степени пригодились знания HTML5, JavaScript, навыки отладки скриптов в браузере.

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


    Эти скилы и удовольствие, полученное при разработке устройства, – и есть основные полученные бенефиты

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


    1. SergeyMax
      13.06.2018 14:52
      +1

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

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


    1. igrushkin
      13.06.2018 15:00

      Моя практика показывает, что эти скиллы накапливаются и переходят на качественно иной уровень. Я начал с мигания диодом, как и все, потом IoT, потом сделал полукоммерческий девайс с Bluetooth вообще без ардуиновщины, на базе «боевого » SDK от Nordic. Но последнее стало возможно ТОЛЬКО благодаря Ардуино вначале


      1. lingvo
        13.06.2018 16:26

        Я ж говорю, если хобби становится работой, приносящей и удовольствие и деньги, то это хорошо. Но если все это сделано ради одного проекта, который надо поставить и забыть о нем на годы, то это совсем другое.
        Для дальнейшего совершенствования себя с учетом данного проекта автору статьи наверняка понадобятся знания по ЭМС, методам защиты от помех, возможно не один раз переосмыслить и переписать свой код, возможно побороться с периодическими зависаниями на первом этапе. Вопрос — нужно ли ему все это? Он к этому стремился?
        Или, возможно, он просто хотел сэкономить на железе пару сотен рублей и воспользовался советом коммьюнити, где ему сказали — конечно, вперед, дерзай на ESP. Вот и получилась статья для Хабра.


        Вот я, например, сделал себе "Умный Дом" такой, чтобы не выносил мозг и чтобы работал как часы, так как это не хобби, а необходимость, и так как свободного времени мало, и денег не так чтобы много. И хоть я обладаю почти всем багажем знаний, что здесь указывается, я не разводил плат, не писал на C++ да и вообще о моем Умном Доме и статьи особо не напишешь. Все скучно и обычно — но я так и хотел.


    1. KSVl Автор
      13.06.2018 23:05

      Да, хочу еще замутить по умному дому много чего… Было бы время.
      Да, не против был бы поработать в этой области, мне интересно, но пока в другой предлагают больше.
      А найдите мне пожалуйста девайс схожей функциональности на рынке. Хоть даже за 500$. Ссылку плиз в студию!
      Ну и согласен со вторым комментатором, что со временем идет качественная трансформация, даже если полученные знания напрямую не применяются.
      P.S. В последнем комменте написал про время…


      1. Alexeyslav
        14.06.2018 00:08

        Называется он… промышленный контроллер. Программируется графически и на стандартных языках промавтоматики. Вроде самый простой вариант стоит 200$. Например контроллер S7-1200.


        1. KSVl Автор
          14.06.2018 08:54
          +1

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

          Я вижу в этом смысл, если делать умный дом целиком, это проект на килобаксы. Ну и если нужно потом будет прикрутить «еще один» бассейн, то да, тогда это то что надо.


          1. Alexeyslav
            14.06.2018 09:23

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


        1. lingvo
          14.06.2018 09:36

          Сейчас в моду вошли так называемые СофтПЛК — обыкновенный компьютер + ПЛК рантайм. Это очень удобно, так как софт не привязан к конкретному железу и последнее можно выбирать по своему усмотрению — от дешевого одноплатника до супернадежного и производительного сервера. Также тот же самый компьютер помимо ПЛК может выполнять кучу других задач. Я в своих проектах использую Raspberry Pi + Codesys.
          В качестве I/O используются промышленные модули ввода/вывода. Я использую EtherCAT — так как на ebay их полно, другие используют дешевые модули на Modbus TCP с Али. Преимущество такого подхода — легкая расширяемость, широкий выбор, компьютер полностью развязан от I/O, также модули обычно сертифицированы под промышленные стандарты ЭМС и безопасности, поэтому нет проблем с "очень тонкие дорожки, супрессор для защиты, подтяжки и т.д", которые тут поднимались.
          Задачи IoT в данном подходе решает установка на тот же ПЛК такой штуки как "сервер удаленного доступа и визуализации" — как я их называю. Т.е. это софт, который связывает различные сетевые протоколы, обеспечивает Web сервисы и прочие удобства. У меня хороший опыт с NodeRED и OpenHAB для этих целей, которые, ессно, тоже прекрасно уживаются на том же Raspberry Pi.


          А найдите мне пожалуйста девайс схожей функциональности на рынке. Хоть даже за 500$. Ссылку плиз в студию!

          На том же ForumHouse у меня есть проект умной ванны, где сделан аналогичный контроллер.


          1. lingvo
            14.06.2018 09:57

            Ах да, насчет изучения. Самым сложным тут является изучение коммандной строки Linux, чтобы повводить нужные команды. Для программистов, по идее не должно быть проблем.
            Второе по сложности — изучение среды Codesys, хотя я не знаю, что там может быть сложного — через час вы уже сможете сделать и запустить в реальном железе свой первый проект.
            Главный прикол, что не железо обязывает, а вы выбираете на каком языке или какими методами вы все это будете программировать.
            Программисты обычно выбирают паскале-подобный ST
            Электрики любят Ladder Diagram, так как это повторяет работу релейных схем
            Я люблю Матлаб, так как там удобное моделирование алгоритмов управления и автоматов состояний и я использую его по работе.
            Тот, кто любит работать по шагам выбирает CFC.


            Отладку в реальном времени, и протоколы берет на себя Codesys — тут ничего изучать не нужно.


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


            Но никаких знаний по разработке печатных плат и схем, SMD — монтажа, C++, например, не требуется.


            ПС я по работе и схемы развожу и SMD монтаж делаю и на Cи программирую и МК разные применяю. Но то серийка с совсем другими требованиями. Т.е. мне изучать ничего не нужно, но тем не менее для такого проекта я бы точно плату не делал. Обленился наверное.


          1. KSVl Автор
            14.06.2018 19:24

            Интересный у вас проект с ванной… но… у вас один «2-канальный модуль силовых реле» стоит как весь мой девайс, если считать железо. И то, в Германии. Большая часть немецкого ибея (чтобы купить Beckhoff и комплектуху) не высылает в Беларусь. Да и растаможка у нас всего что выше 22 евро — это +30% к стоимости и +5 евро сверху за услуги.
            Так что можете вашу сумму в 538 евро умножать надвое.
            А если здесь все это брать, будут везти под заказ, снова x2.

            И это у вас еще нету модуля с web. Т.е. не включишь наливаться, если скажем вас нету дома или вы на другом этаже. Добавьте еще евро 200-300 (думаю, будет не меньше стоить).


      1. atmega168
        14.06.2018 19:10

        Не обязательно использовать контроллер. Еще есть программируемые реле (zelio logic, omni и т.д.), они несколько дешевле и ПО чаще всего бесплатное и свободно скачиваемое. У них есть ограничения но в целом для простой автоматизации подходят. Правда длинная программа в них не влезает, особенно если мало опыта составления программ.


  1. Alexeyslav
    13.06.2018 14:21

    значение сигнала от контроллера инвертируется, и все реле «перещелкиваются» при включении схемы. Я пока не придумал, как убрать эту особенность.

    По умолчанию, при сбросе контроллера все выходы находятся в 3-м состоянии(поидее) поэтому простая подтяжка к нулю должна убрать проблему. Но непонятно почему это вообще является проблемой, реле дергаются явно не из-за этого — даже висячий в воздухе вывод ULN-ки ничего не даст т.к. по факту это простые составные транзисторы, им для срабатывания нужен входящий ток. От помех может конечно сработать, но и помеха должна быть достаточно мощная. Но чтобы стабильно и при сбросе контроллера — тут что-то не так. Возможно, контроллер в процессе инициализации дёргает свои ножки да ещё на значительное время раз даже реле успевают щелкать(полагаю порядка 50-100мс минимум).
    Решить проблему можно простым костыльным методом — устроить задержку подачи питания на реле, может даже при помощи ещё одного реле, полевого транзистора и DRC-цепочки или, что предпочтительнее, супервизора питания с одновибратором.
    Да, значение сигнала с контроллера всё-таки не инвертируется, лог. «1» по прежнему означает срабатывание реле.


    1. proton17
      13.06.2018 15:29

      Дело в том, что никто не хочет читать внимательно даташиты, по старту выводы PCF8574 утянуты к питанию через резистор 100кОм. ULN это дарлингтон с нехилым коэффициентом передачи и ему хватает даже такого тока чтобы открыться. На мой взгляд вообще PCF8574 мутная хрень с его квазидвунаправленными пинами. Лучше взять PCA9554.


      1. proton17
        13.06.2018 16:37

        image
        Вот схема ячейки ввода-вывода. Самый верхний транзистор включается только в момент записи в порт для быстрого переключения в лог.1, потом состояние держит только утяжка в 100мкА. Она же включена по старту. В лог.0 утягивается нормальным транзистором.


    1. KSVl Автор
      13.06.2018 18:23

      Вот что я имел в виду, когда говорил про инвертирование:
      "

      Проблема действительно в PCF: «At power on, the I/Os are high.»


      т.е. при включении до тех пор, пока с контроллера программно по I2C я не переведу выходы PCF в низкое состояние, они будут с высоким уровнем сигнала. А значит высокий уровень идет на ULN, а она же инвертирует сигнал и притягивает выход к земле. Упс, и через реле потек ток, т.к. вторым концом обмотки реле на питании.

      А как советуете грамотно подтянуть выходы PCF к нулю, так что бы при переводе в высокий уровень это все не сгорело?

      Из статьи
      «Еще на схеме порта виден транзистор (3), который как раз может подтянуть порт к питанию напрямую. Но увы, он включается только на короткое время, чтобы обеспечить быстрое переключение порта в логическую единицу.» Вот в это время не сгорит?


      1. proton17
        13.06.2018 18:40
        +1

        Использовать PCA9554, она пин-2-пин c PCF8574. У нее нормальные выходы типа push-pull, без всяких утяжек, по старту выводы в tristate.


        1. proton17
          13.06.2018 18:48

          Немного поправлюсь, утяжка в 100кОм там тоже есть, но ее легко утянуть в землю 2-3кОм. С PCF8574 так не прокатит, она тогда никогда в лог.1 не переключится.


  1. Alexeyslav
    13.06.2018 14:45

    Да, ещё пару слов по самой плате… глаза перфекциониста вытекли раз 20 только от первого взгляда. Многое уже сказано комментарием выше, но на что надо обращать внимание в первую очередь — это ШИРИНА ДОРОЖЕК, особенно в силовой цепи — у вас с контактов реле идут тончайшие волосинки дорожек… они ещё не перегрелись? Да и в других местах где место позволяет сделать достаточно широкие дорожки надо делать широкие дорожки.
    Ещё у вас в районе батарейки очень характерный пример — места вокруг навалом, но изгибы дорожек устроены так что они подходят друг к другу на минимальное расстояние. Вот этого надо избегать. Перенеси изгиб одной дорожки на 5мм, и другой на 5мм и выглядеть будет гораздо лучше и разойдутся за километр.
    Может, кстати, именно из-за этих косяков и щелкают реле при подаче питания.
    В таких случаях всем советую эту книгу легко ищется в электронном виде. Просто почитать и принять к сведению. Она актуальна не только для цифровых и не только для высокоскоростных, пусть вас заголовок не запутывает. Практически любое цифровое устройство высокоскоростное(забудем про микросхемы 133, 155, 176 и 561 серии) даже если выдаёт импульсы частотой в 1Гц.


    1. KSVl Автор
      13.06.2018 18:26

      Сорри, быстро рероутил плату, забыл расширить дорожки.
      Как видно на фото, даже в заказанной черновой версии платы они широкие.

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

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

      Знаю, что крутые «перцы» презирают аутороутинг. Для меня же это не приципиально, да и способ наделать меньше ошибок.

      Спасибо за ссылку на книгу!


      1. Alexeyslav
        13.06.2018 23:50

        Если нагрузки никакой, можно было использовать оптосимисторы. Со снабберной цепочкой правда, ибо контакторы сложная нагрузка для симистора. Впрочем и для контактов реле тоже, несмотря на маленький ток.
        Автороутинг штука конечно офигенная, но только если его правильно настроить — задать запрещённые зоны, указать минимальное расстояние до соседних шин и т.д. и то даже в этом случае часто мозг видит сразу более оптимальный путь который программа нащупала бы часов через 8 оптимизации. Простые автороутеры не видят ситуаций где сигнальную дорожку можно прервать перемычкой в виде резистора нулевого сопротивления и это сильно упростит ситуацию на плате и т.д. миллион подобных моментов.


  1. ABy
    13.06.2018 14:45
    +1

    Первое фото из статьи напомнило марсианский купол из видиоигры или плакат из советского журнала на тему освоения Марса. Не сразу понял что эта штука реальна. Очень круто. Сорри за оффтопик.


    1. Alexeyslav
      13.06.2018 15:03

      Насколько мне известно, такой купол не с головы взяли а это математически просчитанная конструкция — как из минимального количества материала построить максимально объёмное и прочное укрытие. Кроме всего прочего, у купола минимальное ветровое сопротивление.


  1. NordicEnergy
    13.06.2018 15:05

    Чтобы не сделать такого трешака, достаточно просто иметь логику и знания школьной физики. Плата просто мрак! Зачем делать дороги 0.15 мм? Автор не смог что ли найти в САПР, где изменить ширину? Да и чего мелочиться, можно было в HDI плату загнать и сделать землю проводником 50 мкм (0.05 мм), ведь китайцы так тоже могут.


    1. Alexeyslav
      13.06.2018 15:12

      В проекте печатной платы по ссылке ширины силовых дорожек на реле всё-таки увеличены.


      1. NordicEnergy
        13.06.2018 15:16

        Я смотрю на готовое устройство, а там минимальные по 4-му классу дороги + отверстия с минимальной юбкой. Это боль… адская. Да и на силовой части не дорожка должна быть, а все таки полигон.


    1. SergeyMax
      13.06.2018 15:15

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


      1. NordicEnergy
        13.06.2018 15:19

        Вот что делает человек, когда не знает «как надо»? Мне думается он идет, гуглит и смотрит как делают другие люди. Боюсь предположить куда глянул автор, видимо в таблицу на сайте производителя в пункт — «минимальная ширина зазора».

        P.S. даже первая плата у меня была лучше, т.к. был журнал Радио и можно было посмотреть «как надо». Сейчас есть интернет, его же не только для порно придумали))


        1. Alexeyslav
          13.06.2018 16:06

          Интернет вообще плохой вариант, т.к. там очень много примеров «как не надо делать» и никто не говорит что так делать НЕ НАДО, в итоге люди копируют косяки друг у друга внося свои и удивляются откуда глюки. Чего хорошего, если начнёшь в пух и прах разносить чью-то конструкцию указывая на многочисленные косяки сочтут что «придираешься» «оно же работает», а если будешь настаивать то просто выпилят с концами а косяки продолжат своё путешествие. А если у человека есть способность отличить хорошее от плохого, то ему и примеров чужих не надо.


        1. KSVl Автор
          13.06.2018 18:30

          Делал той шириной, который предлагает EasyEDA при автороутинге. Сорри, в проектировании плат я не спец. Но оно работает! :)

          Про автороутинг писал выше в комментах.


      1. Alexeyslav
        13.06.2018 15:58

        Первую вообще от руки рисовал лаком, там дорожки технологически тоньше 2мм не получались.
        А более менее современные не заказные уже делал фоторезистом, и очень долго вылизывал прежде чем воплотить в «железо» ибо внутренний перфекционист грыз.
        image
        image


    1. KSVl Автор
      13.06.2018 23:00

      Ребята, я программист! Печатка для меня и схемотехника: слава Богу что разобрался. А вот с другой стороны полно девайсов, где схемотехника отличная, а софт нормальный написать «ниосилили». Особенно у китайцев. Или надо какую-то корявую приладу ставить, которая еще под Windows 98 была написана.
      Сорри, невозможно быть во всем профи. Не пиннайте сильно.


      1. NordicEnergy
        14.06.2018 00:34

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

        P.S. написать что ли статью аля «10 правил проектирования печатных плат» или в таком духе, а то только критиковать не есть красиво)


        1. KSVl Автор
          14.06.2018 08:44

          А вот напишите! Я же первый почитаю и спасибо скажу :)


        1. Alexeyslav
          14.06.2018 09:26

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


        1. Tomasina
          14.06.2018 09:44

          Да-да! Напишите.
          И языком попроще, да без воды, а то суперумных книжек достаточно, но на пятой странице уже читать не тянет.


          1. Alexeyslav
            14.06.2018 10:02

            Языком попроще можно только культ Карго вырастить. Чтобы быть в теме надо глубоко вникать, знать как минимум математику и т.д. а тогда уже и книжки понятными становятся…


            1. olartamonov
              14.06.2018 10:23

              Не надо.

              Для 99 % любительских изделий, чтобы не делать в них грубых ошибок, достаточно знать и понимать (sic!) не слишком длинный набор правил, плюс уметь пользоваться калькуляторами типа Saturn PCB Toolkit.

              P.S. Если проводить аналогию для программистов, то далеко не каждый проект требует строгого соблюдения MISRA C — обычно вполне достаточно знать базовые правила.


        1. Godless
          14.06.2018 12:26

          написать что ли статью аля «10 правил проектирования печатных плат»

          Дада. =) все хотят.


          1. Alexeyslav
            14.06.2018 15:28

            Если бы это были 10 простых формальных правил, они бы были внедрены в софт по разводке плат как дополнительные правила DRC-контроля.


            1. Godless
              15.06.2018 09:36

              Это понятно. Речь о том, что просящим было бы интересно перенять какой бы то ни было опыт.


              1. Alexeyslav
                15.06.2018 11:56

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


  1. me21
    13.06.2018 16:22

    Мой опыт работы с ESP8266 на базе модуля ESP-07 был не очень радужным. Почему-то периодически модуль зависал. Это случалось где-то раз в месяц.
    У вас нестабильности работы не наблюдается?


    1. KSVl Автор
      13.06.2018 23:17

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


  1. Tomasina
    13.06.2018 17:52

    Это же не купол Фуллера, там шестигранники используются.


    1. KSVl Автор
      13.06.2018 18:36

      Есть пяти, есть немного и шести. В примыканиях. Делал по проекту отсюда.


  1. DZimasik
    13.06.2018 18:31

    Чуть не упал со стула, когда увидел ширину дорожек под реле. Хорошо что впоследствии вы это исправили)


  1. mihnik
    13.06.2018 18:31

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

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

    p.s. А так прекрасная работа, спасибо.
    p.p.s/ Купол отдельное удовольствие доставил, да.


    1. KSVl Автор
      13.06.2018 18:33

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


  1. stardust1
    13.06.2018 21:00

    Очень интересно было прочитать. В начале мне кажется вы прибеднялись, а потом такой проект. Сколько времени эта часть проекта у вас заняла?


    1. KSVl Автор
      13.06.2018 22:56

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


  1. usbstor
    13.06.2018 22:53

    Не было идеи запустить устройство в серийное производство?


    1. KSVl Автор
      13.06.2018 22:57

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


    1. r00tGER
      14.06.2018 10:18

      А смысл?
      Ни один подрядчик-строитель бассейнов не будет использовать подобную автоматику.

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