Перейти к содержимому

Термостат на ESP32 с удаленным управлением. Часть 2. Схема и компоненты

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

Плата рассчитана на источник питания 12 вольт, так как большинство охранных сенсоров требуют напряжения питания не менее 9 вольт. Поэтому на палате предусмотрен собственный стабилизатор 5В для питания ESP32 DevKitC, который также можно использовать и для питания реле. Но плата вполне стабильно работает и от блока питания 9В, только нужно применить реле на соответствующее напряжение. Если вы не планируете подключать проводные “охранные” сенсоры – вполне можно применить источник питания 5В и обойтись без стабилизатора.

 

Список компонентов

Список необходимых компонентов я разобью на два отдельных списка – “основной” – если вы решите собрать только устройство телеметрии и термостата, и “дополнительный” – если вы захотите собрать личную охранно-пожарную WiFi сигнализацию совмещенную с термостатом. В списке каждый компонент – это работающая ссылка на поиск на AliExpress (на момент написания статьи), можно сразу кликать, выбирать и заказывать. Итак, поехали.

Только термостат

  • Плата ESP32 DevKitC v4 – основной компонент устройства, без него никуда. Выбирайте модуль ESP32-WROOM-32D или ESP32-WROOM-32E с печатной антенной, если точка доступа WiFi находится недалеко от места будущей установки устройства; либо ESP32-WROOM-32U или ESP32-WROOM-32UE с дополнительной антенной. Плата разведена именно под эти платки.

  • Однорядный разъем под ESP32 – его мы будем использовать в качестве панельки под плату ESP32. Выбирайте модель с 19 гнездами (на используемой ESP32 DevKitC v4 плате 38 выводов) – то есть 19P 10pcs. Нам потребуется 2 штуки, указанного количества хватит на 5 подобных проектов.

  • Реле SRD-12VDC-SL на с катушкой 12 вольт (или на 5 вольт, если будете питать реле от стабилизатора на плате; либо на 9 вольт, если применить соответствующий источник питания). Обычные китайские реле, для управления газовым котлом и лампами освещения вполне пригодны. Нам понадобятся 2 штуки, обычно продаются сразу по 10.

  • Резисторы пленочные стандарта “iTAK s0yiDeT” со стальными (наверное для прочности) выводами. Нам понадобятся следующие номиналы: 4.7K ~ 5.1K (для “подтяжки” шины I2C и DS18B20, а также в цепи базы транзисторов, управляющих нагрузками – их нужно много); 680R ~ 1K0 (для задания тока через светодиод, 2 штуки). Если вы планируете оснастить устройство проводными зонами сигнализации, дополнительно понадобятся: 36K (ограничение тока базы и тока коллектора входного транзистора, 10 штук); 100K (подтяжка линии к питанию +12В, 5 штук). Все резисторы продаются пакетами по 100 шт., стоят копейки, хватит надолго.
  • Диоды 1N4148 в корпусе DO-35 – они включаются параллельно индуктивной нагрузке (например реле) и могут понадобиться в схеме защиты проводных зон. В пакете 100 штук.

  • Винтовые клеммы с шагом 2,54 мм KF128 – очень удобная вещь для подключения сенсоров и датчиков. Нам понадобятся: 4 штуки на 4 контакта, 1 штука на 5 контактов, и если будете подключать проводные датчики сигнализации – 5 штук на 3 контакта.

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

  • Интегральный стабилизатор на напряжение 5 вольт в корпусе ТО220 – категории “третий сорт не брак”. Все стабилизаторы, что я пробовал с Ali, без радиатора раскаляются даже при питании только ESP32, и это без учета тока через катушку реле при включении нагрузки (если вы будете ставить пятивольтовые реле). Но на небольшом радиаторе – вполне потянет. Тот же 7805, выпаянный из старого модема ZyXEL, ведет себя гораздо лучше. Нам нужен только один.

  • Коробка монтажная 100 х 100 мм в качестве корпуса, купленная в ближайшем магазине электротоваров. Цвета: белый / сосна / бук.

 

Сенсоры

Кроме собственно деталей для устройства, понадобятся “внешние” датчики и сенсоры. Здесь всё будет зависеть от того, какие цели и задачи вы ставите перед устройством. Я использую только цифровые датчики (NTC резисторы дадут гораздо меньшую точность, особенно если учитывать особенности реализации ADC на ESP32).

Для измерения температуры теплоносителя вариантов особо нет – здесь стоит применить цифровой датчик температуры DS18B20 или аналогичный. Его лучше взять без гильзы и просто очень плотно притянуть нейлоновой стяжкой к гайке на муфте “подачи” котла.

Для измерения температуры воздуха в помещении и на улице вариантов датчиков гораздо больше.

  • Если нет необходимости измерения относительной влажности воздуха – смело используйте тот же самый DS18B20, их можно подключить несколько на один и тот же вывод GPIO “гирляндой”.
  • Если необходимо измерение влажности – то можно применить любой I2C датчик температуры и влажности. Стоят они недорого, точность измерений, как правило, достаточно высокая. Перечень поддерживаемых сенсоров на текущий момент можно здесь. Но у I2C есть существенная проблема – сильно ограниченная длина провода, на практике это обычно два – три метра витой пары или телефонного кабеля. Для комнатного датчика обычно это не представляет проблемы.
  • Если для подключения датчика требуется более длинный кабель – то вариантов немного – либо DHT22 / AM2302, либо отказаться от измерения влажности и см. пункт 1.

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

Ещё вопрос – нужен ли датчик на улице? Совсем не обязательно – логика термостата “по умолчанию” на данный момент не использует его совсем. Но если есть возможность подключить – а почему бы и нет? Это позволит наложить график температуры в доме на график температуры на улице и делать какие-либо выводы.

В примере я буду исходить из трех сенсоров: DS18B20 для котла, SHT20 – в помещении и AM2302 на улице. Просто чтобы максимально “охватить” весь спектр применяемых решений.

  • Датчик температуры теплоносителя DS18B20 для измерения температуры теплоносителя. Его лучше взять без гильзы и просто очень плотно притянуть нейлоновой стяжкой к гайке на муфте “подачи” котла.

  • Комнатный сенсор FHT20 – вы можете применить любой I2C сенсор температуры и влажности, например: AHT10, SHT20, HTU21, SHT31. Самый точный из относительно недорогих – SHT31. Самый дешевый – AHT10, но он иногда “ловит глюки”. Я люблю использовать SHT20 в виде микромодуля в корпусе – стоит недорого, небольшой, выглядит опрятно (можно и на виду повесить), точность приемлемая. Поиском можно найти как FHT20. Именно под него и будет “заточена” прошивка, но вы можете использовать и любой другой.

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

  • Уличный сенсор AM2302 (DHT22). DHT22 далеко не самый точный сенсор, особенно в плане измерения влажности, но он позволяет использовать кабель длиной до 20 метров. Можно использовать готовый шилд с резистором и конденсатором, на котором уже установлен резистор подтяжки и фильтрующий конденсатор:

Но можно приобрести отдельно сенсор, тогда его лучше запитать от 5В, а вывод данных подтянуть резистором к 3.3 В на стороне устройства – так сенсор будет работать стабильнее (схемка будет ниже).

 

Охранно-пожарная сигнализация

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

  • Приемник 433 MHz SYN480R – на мой взгляд сейчас это самый лучший приёмник из тех, что я пробовал, подходит для всех китайских беспроводных датчиков дверей, окон, движения и т.д. И стоит недорого. К нему понадобится еще антенна-пружинка (можно сделать её самостоятельно).

  • Стабилизатор L78L33  3,3В – для того, чтобы “изолировать” приемник от микроконтроллера, он запитан от отдельного стабилизатора 3.3В.

Можно ещё один P6KE6.8А в цепь питания поставить – но не обязательно.

  • Зуммер на 3.3 или 5 вольт – для подачи звуковых сигналов в помещении. Можно использовать активный (который сам может звучать при подаче питания), можно использовать пассивный (на который нужно подавать импульсы, чтобы заставить его звучать). Прошивка по умолчанию поддерживает пассивный зуммер, однако её очень несложно переделать на активный.

  • Сирена + световой маяк – для подачи сигналов тревоги и индикации режима охраны я использую Маяк-12КП, но можно любой другой аналогичный.

  • Пульт управления 433 MHz – для переключения режимов охраны без использования смартфона. Не обязателен. Можно, в принципе, применить любой удобный, но мне больше нравиться “с крышечкой”, кнопку в сумке или кармане случайно нажать не получиться.

  • Потребуются также различные датчики движения, дверей, окон, дыма, и т.д. Но сейчас мы их обсуждать не будем, иначе будет “очень – очень многа букав”. Вы можете поискать их самостоятельно, либо я напишу отдельную статью (оставляйте свои пожелания в комментариях).

 


Схема соединений

Схема несложная, все подключения “стандартные”, если кто-то работал с Arduino – вопросов возникнуть не должно. ESP32 в данном случае “физически” задействована почти по максимуму – использованы все доступные выводы GPIO, работающие на “ввод-вывод” (несколько GPIO с ADC2 и работающие только на “вход“, в этом проекте не используются).

Примечание: об особенностях использования выводов ESP32 рекомендую ознакомиться в следующей статье: Чипы, модули и платы ESP32

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

Используемые выводы GPIO:

  • Шина I2C 0: CONFIG_I2C_PORT0_SDA 21 + CONFIG_I2C_PORT0_SCL 22. Основная шина для I2C сенсоров, на ней предусмотрены “отключаемые” резисторы подтяжки к +3.3В номиналом 4.7~5.1 кОм

  • Шина I2C 1: CONFIG_I2C_PORT1_SDA 17 + CONFIG_I2C_PORT1_SCL 16. Вторая шина для сенсоров, но уже без резисторов подтяжки (на большинстве модулей сенсоров они и так уже установлены). Если вторая шина I2C не нужна, на эти же выводы можно подключить преобразователь интерфейса RS485 и получать данные по протоколу Modbus RTU.
  • GPIO 33: системный светодиод, отображающий состояние устройства, синий или зеленый. Выводы GPIO ESP32 рассчитаны на ток до 40мА, поэтому к ним спокойно можно подключать светодиоды напрямую (без транзисторов).
  • GPIO 23: светодиод режима охраны, мигает при получении сигнала по радиоканалу RX 433.

  • GPIO 25: выход с открытым коллектором для подключения сирены
  • GPIO 26: выход с открытым коллектором для подключения маячка

Схема управления нагрузкой с открытым коллектором. Для маячка защитный диод на плате не установлен

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

  • GPIO 13: внутренний зуммер, у меня был использован обычный пассивный зуммер на 5 вольт из старого системника. Просто, тупо, подключен напрямую к выводу, второй вывод – на “землю”.
  • GPIO 15: на этот вход приходит сигнал с приемника 433 MHz. Тоже напрямую, без всяких резисторов.
  • GPIO 4: шина 1-WIRE – к этому выводу подключен датчик температуры DS18B20 (можно несколько параллельно), этот вывод должен быть подтянут к шине питания +3.3В резистором 4.7~5.1 кОм

  • GPIO 0: к этому выводу можно подключить датчик AM2302, для этого этот вывод должен быть подтянут к шине питания +3.3В резистором 4.7~5.1 кОм. Но здесь есть подвох – если вы поставите этот резистор непосредственно на плате, то вы не сможете загрузить в микроконтроллер прошивку USB-кабелем, так как этот вывод используется в плате для прошивки. Поэтому на плате резистор не предусмотрен – я обычно подключаю его “снаружи” разъема уже после изготовления и прошивки устройства.

Идеальная схема подключения AM2302. Но можно использовать питание и +3,3В

  • GPIO 27: выход для управления реле 1, это реле используется для управления котлом. Вы можете использовать либо нормально замкнутые контакты (включение реле будет блокировать работу котла), либо нормально разомкнутые контакты (включение реле будет разрешать работу котла). Схема приведена чуть ниже.
  • GPIO 32: выход для управления реле 2, это реле я использую для сброса AM2302 по питанию, когда он “жестко” зависает (с ними такое бывает, Китай однако), следует использовать нормально замкнутые контакты. Если вы будете использовать другой уличный датчик (или не будете использовать его вовсе), то это реле можно задействовать для других целей – например для управления освещением.

  • GPIO 18, 19, 12, 14, 2: используются как входы проводных зон охранно-пожарной сигнализации.

Вместо R2 я установил самовосстанавливающийся предохранитель. Описание работы схемы приведено в одной из прошлых статей.

Обратите внимание – для BC327 расположение выводов не совпадает с S8050, будьте внимательны

 


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

Печатная плата создана в Sprynt Layout 6, рассчитана она под самостоятельное изготовление методом ЛУТ. Размер платы 84 на 82 миллиметра. Вы можете найти файл с платой в папке layouts проекта на GitHub.

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

С помощью перемычки можно переключить реле с 12В на 5В – в зависимости от того, какие реле вы будет применять (я рекомендую использовать 12 вольтовые реле).

Отверстия под неиспользуемые выводы ESP32 DevKitC можно не сверлить, а просто вынуть пинцетом лишние клеммы из колодки.

Вот как выглядит полностью собранная плата:

 

В заключение приведу схему расположения элементов и подключения периферии к устройству:

 

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


Все статьи цикла “Термостат и ОПС”:

Прошивка K12 для ESP32 и ESP-IDF:

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


Пожалуйста, оцените статью:
[ 0 из 5, всего 0 оценок ]

5 комментариев для “Термостат на ESP32 с удаленным управлением. Часть 2. Схема и компоненты”

  1. Николай

    Привет.
    Шина 1-Wire позволяет подключать, параллельно/на одну шину, несколько устройств с интерфейсом 1-Wire. Но в коде я не нашёл где и как выполняется адресация к тому или другому устройству на данной шине. Не могли бы Вы подробнее, желательно с небольшим примером, рассказать как, используя Вашу библиотеку, работать с неколькими устройствами на 1-Wire шине в термостате.
    Ещё, хотел попросить, можно ли более подробно рассказать о коде для термостата. Коментарии в коде очень помогают, но иногда надо потратить много времени на то чтоб понять для чего та или иная переменная/константа/функция.
    Спасибо.

    1. У вас есть два способа:
      – поиск сенсора по индексу (адрес == ONEWIRE_NONE)
      – поиск сенсора по адресу (адрес == РЕАЛЬНЫЙ)
      Когда датчик один, незачем заморачиваться с адресами, это облегчает и его замену.
      Однако когда датчиков несколько, индексы могут сослужить плохую службу, так как вам заранее не известно, какой будет первым, какой вторым и т.д.
      Особенно если вы заходите заменить один из датчиков.
      В этом случае лучше определить его адрес и жестко прописать в коде. Адрес можно узнать на mqtt-клиенте – он присутствует в конце JSON-пакета для этого датчика.

      Смотрите здесь: https://github.com/kotyara12/telemeter_dzen/blob/master/lib/sensors/sensors.cpp#L230
      sensorBoiler.initExtItems(SENSOR_BOILER_NAME, SENSOR_BOILER_TOPIC, false, (gpio_num_t)CONFIG_GPIO_DS18B20, ONEWIRE_NONE, 1, DS18x20_RESOLUTION_12_BIT, true,

      1. Николай

        Спасибо за Ваш ответ.
        Да, я воспользовался индексами. Пока меня это вполне устраивает. Но Вы правы, приходится опытным путём какой датчик с каким индексом.
        Адресное обращение тоже пробовал, но что-то не заработало. В JSON адресов я не нашёл, но видел их в логах, в таком виде:
        00:00:03 [I] DS18x20 :: Found device #1 : 380318418fc9ff28
        00:00:03 [I] DS18x20 :: Found device #2 : f70516851eb9ff28
        в функции инициализации подставил эти адреса:
        sensorBoilerOut.initExtItems(SENSOR_BOILER_OUT_NAME, SENSOR_BOILER_OUT_TOPIC, false,
        (gpio_num_t)CONFIG_GPIO_DS18B20, 0x380318418fc9ff28, 1, DS18x20_RESOLUTION_12_BIT, true,
        &siBoilerTempOut, 3000, SENSOR_BOILER_OUT_ERRORS_LIMIT, nullptr, sensorsPublish);

        sensorBoilerIn.initExtItems(SENSOR_BOILER_IN_NAME, SENSOR_BOILER_IN_TOPIC, false,
        (gpio_num_t)CONFIG_GPIO_DS18B20, 0xf70516851eb9ff28, 2, DS18x20_RESOLUTION_12_BIT, true,
        &siBoilerTempIn, 3000, SENSOR_BOILER_IN_ERRORS_LIMIT, nullptr, sensorsPublish);

        но при запуске устройства получил ошибку инициализации (если мне память не изменяет) сенсоров.

        Может я не правильно указал адреса или это не те адреса которые надо использовать? Как, тогда, получить адреса?
        Спасибо.

        1. У вас, вероятно, ещё старые библиотеки. Там была такая ошибка, да.
          Скачайте с гитхаба – там лежит уже новый архив, в котором это поведение исправлено

  2. Николай

    Сорри, уже нашёл как обращаться к нужному сенсору.
    Но Ваш комент/пример, всё равно будет полезен.

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

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