Предыстория
Пару лет назад я разработал электронное устройство для автополива на модульной основе. По факту в условиях городской квартиры оно оказалось ненужным. С течением времени выяснилось, что гораздо более привлекательными являются обыкновенные датчики влажности почвы, которые сигнализируют о том, что пора полить растения. Ранее я уже приобрел пять таких датчиков, причем они позиционируются как коррозиестойкие. Назначение этих датчиков – работа совместно с Arduino. Причем, на датчик с Arduino подается 5 Вольт.

Для моей новой задачи они не подходили, поэтому я решил заказать пару автономных датчиков, которые имеют встроенный микроконтроллер и работают от батарейки CR2032 (3 Вольта).
И вроде бы неплохие датчики по 130 рублей оказались, но смутили три особенности:
- пищат
- на основе микроконтроллера attiny44a и даже разъем ICSP для программирования имеется, но исходника программы-то нет (upd: на самом деле есть и есть. Китайцы не меняются, и это очередной западный опенсорсный проект, реализованный без каких-либо изменений).
- невозможно внести изменения в настройки определения уровня влажности почвы (upd: можно путем правки исходного кода).
Тем не менее, попробуем ради интереса реализовать свой собственный вариант в виде приставки.
Задачи
Поэтому я пораскинул мозгами и решил модифицировать свои старые датчики, сделав их автономными и адаптировав для питания от батарейки CR2032. Были поставлены следующие задачи:
- сделать небольшую приставку с микроконтроллером, по ширине примерно соответствующую ширине датчика, чтобы ее можно было приклеить к датчику эпоксидным клеем
- приставка должна моргать светодиодом раз в секунду, когда почва наполовину сухая и моргать раз в полсекунды, когда почва высохла
- использовать имеющиеся держатели CR2032, которые мне очень не нравятся, но от них нужно постепенно избавляться
- использовать имеющиеся в наличии микроконтроллеры attiny85 и вывести ICSP для программирования
- написать программу на сях (AVR-GCC), чтобы занимала поменьше места и поменьше ела
- внести минимальную модификацию в сам датчик
Доработка датчика
Описание изготовления самоделки начну с доработки датчика. Чтобы понять, что там вообще внутри происходит, пришлось найти его схему.

По схеме видим, что у нас есть всего один лишний для нас элемент, от которого следует избавиться: XC6206P302 (на датчике он подписан U2) – это понижающий преобразователь с 5 до 3-х вольт. Он нам мешает, потому что при подаче 3-х Вольт от батарейки на вход, он их просто не пропустит. Поэтому сдуваем его феном и, не думая, соединяем два вывода перемычкой (нуль-резистором), как это уже было реализовано китайцами в другой модификации.
Теперь наш датчик может работать от батарейки CR2032.
Проектирование печатной платы
Схема печатной платы банальна до невозможности и представляет собой обвязку attiny85 со светодиодом, кронштейном для батарейки, разъемом ICSP (SMD) и тремя выводами для подключения датчика. На схеме указан резистор 36R, но по факту был установлен 200R, потому что светодиод попался очень яркий.
Печатная плата была спроектирована в KiCAD 6, который я всем рекомендую. В шестой версии серьезно изменено поведение при трассировке дорожек, и теперь их даже можно сглаживать, не используя дополнения. Единственное, что я не смог понять: зачем было менять местами цвета рамок компонентов лицевого и заднего слоя. Но к этому можно привыкнуть.
Я стараюсь разводить дорожки таким образом, чтобы можно было использовать односторонний фольгированный текстолит. Не поместившиеся на одном слое соединения выполняются в виде изолированных перемычек из наборов для Arduino.
Кронштейн для батарейки на рендере отличается от фактически использованного, но по расположению выводов он идентичен, а их габариты практически совпадают.
Минутка юмора
Когда я брался за проектирование как-то не подумал, а сколько это может сейчас стоить, потому что все было в наличии. А потом посмотрел цены на attiny и тихо выпал в осадок.
Наверное, стоит в перспективе заменить attiny85/45/25 на китайские attiny44a, которые сейчас стоят в разы дешевле.
Создание печатной платы
Создание печатной платы по методу лазерно-утюжной технологии – это невероятно унылое и скучное занятие, к тому же однажды мной уже описанное в подробностях, поэтому здесь я приведу коллаж из трех вытравленных плат (для экономии фольгированного стеклотекстолита) до травления и после снятия тонера.
В итоге, после сверловки, монтажа компонентов и присоединения датчика, все выглядит примерно так:
Настройки Code::Blocks
Программа была написана с помощью Code::Blocks 20.03. Сейчас подробно остановлюсь на этом моменте, потому что на usamodelkina.ru никто практически не описывает программирование микроконтроллеров, и начинающим ребятам будет это полезно. Заранее извиняюсь перед местными зубрами, которым это будет скучно, но я подробно здесь напишу настройки Code::Blocks 20.03 для Windows и Linux, потому что многих останавливает сложность данного процесса.
Сначала нужно установить на компьютер avr-gcc-10.1 или более поздний.
Я сделал коллаж из настроек исполняемых файлов, либ, библиотек и директив, которые затем нужно внести в Code::Blocks.
Все это прописывается в Settings/Compiler... или в Project/Build options...
Под Linux все несколько сложнее.
Компилятор из дистра ставится старый, и с ним ничего не собирается. Поэтому нужно поставить новый отсюда. Если у вас Debian-based дистрибутив, то нужно установить следующие библиотеки, иначе ничего не заведется:
sudo apt install avr-libc srecord
Далее вы должны сделать описанное для Windows, но дополнительно обязательно нужно проставить флаги оптимизации (-O или -Os – для скорости или размера hex-файла по желанию), иначе требовательный линуксовый компилятор не захочет компилировать ваш код.
Создание программы
Разберем основные моменты исходного кода. В следующем фрагменте прописываются директивы, которые устанавливают человеко-ориентированные шаблоны для кода. Я это делаю, чтобы не мучиться с битами, и каждый раз не писать внешне абсолютно бессмысленный бред для любого нормального человека. Тут мы задаем четыре шаблона: для установки вывода на выход, на вход, установка высокого и низкого состояний на выходе.

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

Таким образом, в основной программе мы сначала устанавливаем используемые порты attiny85 на вход и выход:
SET_OUTPUT(DDRB, PB4); // Устанавливаем LED в режим OUTPUT
SET_INPUT(DDRB, PB3); // Устанавливаем AOUT (ADC3) в режим INPUT
Далее идет функция настройки АЦП:
initADC();
Разберем ее содержимое. В коде ниже содержатся сдвиговые операции на регистрах, которые определяют настройки используемого АЦП (ADC3). В регистре ADMUX сначала мы определяем, что не нужно использовать левый сдвиг, так как мы используем 10-битный АЦП, а не 8-битный, потом задаем опорное напряжение в виде внешнего источника питания (3V), затем выбираем АЦП ADC3 (PB3). В регистре ADCSRA мы включаем АЦП и устанавливаем делитель на 16, чтобы определить скорость сбора данных.

Более подробное описание как все это работает вы можете найти в мануале на ATtiny25/ATtiny45/ATtiny85 в разделе 17.13 Register Description (стр. 134).
Далее мы задаем две используемые константы: для воздуха и условной половины от мокрого (водяного) состояния. Константы взяты из довольно толковой статьи. Понятно, что 465 = (620 + 310) / 2.
const int air_val = 620;
const int middle_val = 465;
// const int water_val = 310;
Далее мы в бесконечном цикле производим измерение значения на АЦП, как усредненное из пяти измерений:
uint16_t raw_adc = ADC_Read_Avg(5);
Если raw_adc оказывается меньше, чем middle_val, значит у нас пока болото. Если raw_adc находится между middle_val и air_val, значит мы на этапе просушки, и можно начинать мигать. Если raw_adc больше air_val, значит мы уже испарились, и нас давно пора поливать.
После компиляции бинарный файл hex оказывается в папке /bin/Release. Именно оттуда его нужно брать.
Загрузка программы
Программа загружается в микроконтроллер через выполненный на плате разъем ICSP с помощью программатора USBAsp (клон). Для этого используется свободный софт avrdudej-0.1.jar.
Ниже представлены фьюзы для Attiny85, рассчитанные с помощью калькулятора фьюзов. Используется встроенный тактовый генератор на 8 МГц и делитель на 8, так как у нас в приоритете экономия батарейки, а не производительность.
На следующих скриншотах представлены использовавшиеся настройки avrdudej:
Проверка
Проверка показала, что значения констант были выбраны идеально: при полном погружении датчика в воду светодиод перестает мигать, при неполном погружении светодиод мигает раз в секунду, при нахождении на воздухе светодиод мигает раз в полсекунды, как и задумывалось.
В перспективе планируется:
- закрепить приставку непосредственно на датчике
- реализовать watchdog, чтобы приставка засыпала и просыпалась – для экономии батарейки (сделано)
Искренне надеюсь, что эта статья будет полезна начинающим для освоения работы с микроконтроллерами.
Ссылка на проект kicad 6
Ссылка на проект Code::Blocks (с реализованным сном по таймеру)
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.