Ничего не найдено :(
    В гостях у Самоделкина! » Электроника » Автономный контроллер для датчика влажности почвы

    Автономный контроллер для датчика влажности почвы



    Предыстория

    Пару лет назад я разработал электронное устройство для автополива на модульной основе. По факту в условиях городской квартиры оно оказалось ненужным. С течением времени выяснилось, что гораздо более привлекательными являются обыкновенные датчики влажности почвы, которые сигнализируют о том, что пора полить растения. Ранее я уже приобрел пять таких датчиков, причем они позиционируются как коррозиестойкие. Назначение этих датчиков – работа совместно с 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 (с реализованным сном по таймеру)
    Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.
    Подборки: attiny85 cr2032 Датчик

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

    Сигнализатор нарушения освещения - 2

    9
    Идея
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    9
    Описание
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    10
    Исполнение
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    Итоговая оценка: 9.33 из 10 (голосов: 1 / История оценок)

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

    15 комментариев
    Eig Автор
    ino53,

    я в любом случае буду делать еще один вариант на attiny202 (84 рубля стоят сейчас, придут через месяц). Тогда уже сделаю измерение напряжения питания для обоих вариантов. Сигнализировать можно будет тем же светодиодом - SOS на морзянке например.

    Черкану конечно, без проблем.

    ino53
    Eig, насчет длительности - ладно, а вот насчет индикации - когда сделаете - не забудьте черкануть. smile 
    Eig Автор
    ino53,

    емкость CR2032 от 210 до 240 мАч. Attiny85 в активном режиме потребляет примерно 1мА. Продолжительность этого активного режима целиком и полностью зависит от того, насколько часто мы проводим опрос датчика. Сейчас он у меня опрашивается раз в 24 секунды, но это потому, что режим отладки. Можно опрашивать значительно реже. Светодиод мигает раз в полсекунды 10 раз подряд после опроса, при этом потребление, наверное, 10-15 мА и не мигает, если влажно. Самая прожорливая NE555 - 5мА постоянно, но это в том случае, если она не КМОП. КМОП потребляет какие-то жалкие микроамперы. Я не знаю, КМОП она или нет.

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

    Индикации нет никакой. Нужно сделать.

    ino53
    Eig, простите грубого железянщика, последний вопрос к возвышенным программерам (без обид, шутю!) Длительность работы без замены бат. и как индицируется подход к порогу ее разрядки. smile 
    Eig Автор

    Выяснилось, что никакой доработки приставки для установки ее на датчик не требуется. Просто с датчика выпаевается разъем JST XH2.54, а в соседние свободные отверстия после этого припаевается приставка с помощью штыревых вилок. В итоге все выглядит очень неплохо.

    VICTOR_ZH
    Eig, да увидел, моя невнимательность. В любом случае МК тем и хорош, что 90% всех проблем можно решить правкой кода)



    Eig Автор
    VICTOR_ZH,

    если вы посмотрите внимательно, то измерения там именно по таймеру. Ватчдог будит эту фигню раз в 8 секунд, а внутри вектора счетчик. Если счетчик отсчитал более 3, то запускается измерение и затем обнуляется счетчик. Нужно только убрать лишние включения/отключения АЦП - в этом вы правы.

    Спасибо, я уже на пути к выздоровлению. Всех благ.

    VICTOR_ZH
    Eig, ценники то да - самое печальное. Чип и дип сам по себе никогда гуманностью не отличался, а теперь и китайцы подняли стоимость своего барахлишка. При повторении я бы подумал над энергосбережением при таком питании - что-то вроде периодических измерений по таймеру вместо непрерывных в цикле (за пол часа влажность в горшке радикально не изменится). А так - это ваша конструкция, главное работает как задумывалось. Выздоравливайте скорее)



    Eig Автор
    VICTOR_ZH,

    да ничем не обусловлено, если честно. Это демо, я особо не заморачивался. По идее там нужно брать внутреннее опорное 1.1V. Засыпания и просыпания по ватчдогу я вообще добавил в последний момент - просто увидел у chirp! (в готовом датчике) и тоже захотелось.

    Код для АЦП я не описал подробно, да и включение светодиода тоже - это мое упущение наверное, но уже было так лень... На сайте код (внутри тега code) вставляется неправильно - многие символы неэкранированные и рушат разметку, а картинки вставлять уже сил не было, я сейчас болею, вы должны понять  smile 

    У меня была идея этот проект довести до ума, и тогда уже описать недостающие вещи. Нужно переделать саму плату, чтобы удобно было ее крепить, и купить attiny402 наверное - они хотя бы по 90 рублей сейчас, а не по 410.

    VICTOR_ZH

    Сейчас редко кто обходится без вайринга, респект))

    Один вопрос по преобразованиям отпал, когда посмотрел весь код - ответы нашлись в ADC_Read(), другой вопрос был по опорному - чем обусловлено? Батарейка все же разряжается со временем, а вы вгоняете в спячку проц в погоне за точностью..


    Eig Автор
    ino53,

    да, он полностью покрыт лаком. Это не то поделие из стартовых наборов для юных ардуинщиков, которое окисляется за сутки.

    ino53
    Eig, т.е. используется не активная (омическая) компонента датчика, а реактивная, ёмкостная... Ясно. smile Тогда он, видимо, полностью лакирован?... 



    Eig Автор
    ino53,

    отсюда

    Картинка классная

    Eig Автор
    ino53,

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

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

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

    отсюда

    Вот на этой схеме хотя бы изображен сам датчик.

    отсюда

    ino53

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

    Мне и со схемой непонятно... pardon Вот барабанит таймер, выдает импульсы постоянной частоты и амплитуды через R2 и D1 в собственно датчик, и, видимо, получается делитель с верхним резистором R2 и нижним - сопротивлением почвы, переменным, далее амплитуда импульса в точке J1.3 анализируется и т.д. Так? scratch 


    Привет, Гость!


    Зарегистрируйтесь

    Или войдите на сайт, если уже зарегистрированы...

    Войти

    Добавьте самоделку

    Добавьте тему

    Онлайн чат

    Последние комментарии

    Все комментарии