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

Что для этого необходимо?

Как это собрать?

Калибровка

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

    Запишите показания на дисплее при воткнутом в сухой горшок сенсоре. Это - минимум влажности.

    Полейте цветок и дождитесь пока вода полностью впитается в землю и показания сенсора установятся на одном уровне. Запишите их. Это - максимум влажности.

    В скетче исправьте значения константы HUMIDY_MIN на значение минимальной влажности и HUMIDY_MAX на значение максимальной влажности. Заново прошейте Arduino Uno.

Масштабирование решения

Мы описали решение для одного растения. Но обычно требуется поливать несколько растений. Помимо очевидного решения - подключения к Arduino нескольких помп и датчиков влажности - существует более простое и дешёвое. Достаточно в трубке, которая идёт в комплекте с помпой проделать шилом дырочки на расстоянии около 30 см и воткнуть в эти дырочки куски стержней от обычных шариковых ручек. Выглядеть это будет так:

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

Исходный код

Для работы скетча вам понадобиться скачать и установить библиотеку для работы с дисплеем QuadDisplay2

irrigator.ino // Подключаем библиотеку для работы с дисплеем #include "QuadDisplay2.h" // даём разумное для пина, к которому подключена помпа #define POMP_PIN 4 // даём разумное для пина, к которому подключён датчик влажности почвы #define HUMIDITY_PIN A0 // минимальный порог влажности почвы #define HUMIDITY_MIN 200 // максимальный порог влажности почвы #define HUMIDITY_MAX 700 // интервал между проверкой на полив растения #define INTERVAL 60000 * 3 // переменная для хранения показания влажности почвы unsigned int humidity = 0 ; // статическая переменная для хранения времени unsigned long waitTime = 0 ; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9 ) ; void setup(void ) { // начало работы с дисплеем qd.begin () ; // пин помпы в режим выхода pinMode(POMP_PIN, OUTPUT) ; // выводим 0 на дисплей qd.displayInt (0 ) ; } void loop(void ) { // считываем текущее показания датчика влажности почвы int humidityNow = analogRead(HUMIDITY_PIN) ; // если показания текущей влажности почвы // не равняется предыдущему запросу if (humidityNow ! = humidity) { // сохраняем текущие показания влажности humidity= humidityNow; // и выводим показания влажности на дисплей qd.displayInt (humidityNow) ; } // если прошёл заданный интервал времени // и значения датчика влажности меньше допустимой границы if ((waitTime == 0 || millis() - waitTime > INTERVAL) && humidity < HUMIDITY_MIN ) { // включаем помпу digitalWrite(POMP_PIN, HIGH) ; // ждём 2 секунды delay(2000 ) ; // выключаем помпу digitalWrite(POMP_PIN, LOW) ; // приравниваем переменной waitTime // значение текущего времени плюс 3 минуты waitTime = millis() ; } }

Демонстрация работы устройства

Что ещё можно сделать?

    Несмотря на золочение, контакты сенсора влажности со временем корродируют. Быстрее всего корродирование происходит при подключённом питании. Срок жизни сенсора можно значительно увеличить, если подключить питание к нему через силовой ключ. Когда надо получить данные - включаем питание сенсора, снимаем показания и тут же выключаем питание.

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

    Устройство, работающее от батареек, будет значительно безопасней питающегося от сети. Идеальным вариантом было бы питание ирригатора от батареек. Но Arduino Uno, как известно, даже в режиме сна потребляет более 10 мА. Выходом может являться использование Arduino Mini, способный в режиме сна снижать потребляемый ток до сотен мкА.

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


ArdСистема автополива автоматизирует работу по уходу за комнатным цветком. В тематических магазинах продают такую конструкцию по безбашенной цене. Однако вещь стоящая, так как машина самостоятельно регулирует «порции» влаги для растения.

В этой статье читателю предлагается создать собственный автополив на arduino. Микроконтроллер в данном случае выступает системой управления периферийных устройств.

Необходимые инструменты и периферия для реализации проекта «Автополив» на базе микроконтроллера Arduino

Ирригатор – устройство, контролирующее влажность почвы. Приспособление передает данные на датчик влажности, который укажет сконструированному автополиву на начало работы. Для составления программы используется язык программирования С++.

Таблица с требуемыми материалами:

Компонент Описание
Микроконтроллер Arduino Uno Платформа соединяет периферийные устройства и состоит из 2 частей: программная и аппаратная. Код для создания бытовых приборов программируется на бесплатной среде – Arduino IDE.

Чтобы составить и внедрить программу на микроконтроллер, необходимо приобрести usb-кабель. Для автономной работы следует купить блок питания на 10 В.

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

USB-кабель Обязателен в конструировании системы «автополив на ардуино» для переноски кода.
Плата для подключения сенсора – Troyka Shield С помощью платы подключается сенсорная периферия посредством обычных кабелей. По краям располагаются контакты по 3 пина - S + V + G.
Нажимной клеммник Служит фиксатором для пучковых проводов. Конструкция фиксируется с помощью кнопки на пружине.
Блок питания, оснащенный usb-входом

Анализатор влажности почвы

Идеальное средство для подключения платформ. В конструкции предусмотрен фонарик, который говорит о начале работы.

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

● MAX глубины для погружения в землю – 4 см;

● MAX потребление электроэнергии – 50 мА;

● Напряжения для питания – до 4 В.

Помпа с трубкой для погружения в воду Управление осуществляется с помощью коммутатора. Длина кабеля достигает 2 метров.
Силовой ключ Создан для замыкания и размыкания электрической цепи. Если использовать приспособление при конструировании автополива ардуино, не потребуется дополнительных спаек. Подключение к основной панели осуществляется также 3 проводами.
Соединительный провод – «отец-отец» Несколько проводов соединяют периферийные устройства.
Соединительный провод – «мать-отец» Проводки также соединяют устройства периферии.
Комнатный цветок Система пригодна для разного типа комнатных растений.

Схема подключения и алгоритм работы в проекте «Автополив» на базе мк Arduino

Ниже представлен алгоритм и схема подключения проекта на платформе arduino. Автополив строится следующим образом:

  1. Помещаем плату для сенсора на микроконтроллер.
  2. Подключаем анализатор влажности с помощью платы, описанной выше, к аналогичному пину – А0.
  3. Присоединяем сенсор к микроконтроллеру:
    1. Контакт CS подключается к пину № 9 на плате.
    2. Дисплейные контакты SPI соединяются с соответствующим разъемом на той же плате.
  4. Силовой ключ вставляем в пин №4.
  5. Коммутатор подводим к силовому ключу в разъемы, обозначаются буквами p+, p-.
  6. Теперь подключаем водяную помпу с трубкой с помощью клеммника в контакты с буквами l+ и l-. Постепенно перед конструирующим человеком построится схема.
  7. Втыкаем сенсорную панель, анализирующую влажность, в горшок с цветком.
  8. Конец трубки вставляем с водой в почву. В случае, если растение вместе с горшком по весу не превышает 2 кг, закрепляем шланг отдельно. Иначе водяная капель может опрокинуть цветок.
  9. Опускаем водяную помпу в бутылку, наполненную водой.
  10. Подключаем конструкцию к электрическому питанию.

Ниже предлагаем вам две альтернативные схемы для нашего устройства:

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

  1. Записываем сведения, выведенные на дисплей. При этом сенсор воткнут в сухой горшок. Это обозначается, как min влажности.
  2. Поливаем землю с растением. Ждем, когда вода до конца пропитает почву. Тогда показания на сенсорном экране покажут один уровень. Необходимо записать полученные сведения. Это значит max влажности.
  3. В записном блокноте фиксируем константы HUM_MIN и HUM_MAX тем значением, которое было получено в результате калибровки. Прописываем значения в программе, которую переносим затем на микроконтроллер.

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

В шланге от помпы проделываются 25 сантиметровые отверстия с помощью шила. В полученные дырочки втыкаются кусочки стержней ручек шарикового формата. В итоге получается:

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

Пользователь самостоятельно выбирает время для полива, но только для одного цветка. Нередко цветки по массе и размерам одинаковы. Следовательно, почва в горшках сохнет за одинаковое время. Для этого придуман метод комбинации: количество горшков делится по группам равного веса и размера.

Пример кода для Arduino для проекта «Автополив»

Переходим к программированию кода:

//Скачиваем библиотеку для работы дисплея и подключаем к программе #include "QuadDisplay2.h"; //Создаем константу, обозначающую контакт, к которому подключена водяная //помпа #define VODPOMPA_PIN 4; // Создаем константу, обозначающую контакт, к которому подключили //анализатор влаги земли #define HUM_PIN A0; //Min по влажности #define HUM_MIN 200; // Max по влажности #define HUM_MAX 700; //Время между проверками полива #define INTER 60000 * 3; //Объявляем переменную, в которой будет храниться значение влажности unsigned int hum = 0; //В этой переменной будем хранить временной промежуток unsigned long Time = 0; // Объявляем объект из класса QuadDisplay, затем передаем номерной знак //контакта CS QuadDisplay dis(9); //Создаем метод, отвечающий за работу дисплея void setup(void) { //Запуск метода begin(); // Объявляем функцию, которая будет отвечать за выход водяной помпы из //контакта pinMode(VODPOMPA_PIN, OUTPUT); //На дисплее загорается число - 0 dis.displayInt(0); } //Создаем метод, отвечающий за показатель влажности на данный момент void loop(void) { //Рассчитываем показатель увлажнения на данный момент int humNow = analogRead(HUM_PIN); // Если значение показателя не равно предыдущему, то... if(humNow != hum) { //Сохраняем полученные сейчас значение hum= humNow; //Вывод значения на экран displayInt(humNow); } //Задаем условия: если прошел заданный пользователь промежуток времени и //статус влаги в почве меньше необходимого, то... if ((Time == 0 || millis() - Time > INTER) && hum < HUM_MIN) { // Даем сигнал о начале работы водяной помпы digitalWrite(VODPOMPA_PIN, HIGH); //Объявляем потом, длящийся 2 секунды delay(2000); // Завершаем работу помпы digitalWrite(POMP_PIN, LOW); // Ставим в значение переменной Time текущее время и добавляем 3 минуты Time = millis(); } }

Дополнительно вы можете посмотреть пару интересных видео от наших коллег.

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

1. Об устройстве

Для создания системы полива нам понадобиться:

  • Обрабатывающее устройство - по старой традиции у нас за него будет arduino uno
  • Датчик влажности почвы - модуль arduino
  • Помпа(Водяной насос) - водяной насос так же можно купить в Китае или сделать самому. По скольку напряжение помпы у меня 12 вольт включать буду с помощью реле.
  • Другие важные мелочи - шланг меленького диаметра, емкость для воды, провода, источник питания.

Сразу что бы не питать иллюзий скажу, подключать к водопроводу все это дело мы не будем. Что бы избежать нештатных ситуаций, для простоты и удобства будем использовать резервуар(емкость с водой). Из резервуара воду будет качать насос(помпа), небольшой мощности будет достаточно, я буду использовать самодельную помпу с питанием 12 вольт. Хотя при подборе помпы стоит учесть: изгибы шланга, расстояние от насоса до поливаемого растения, тип насоса. В подборе шланга сложного ничего нет, выбираем по диаметру выходного отверстия помпы, но он должен быть не сильно широкий на выходе к растению. При построении системы нужно учесть тип полива, считается оптимальным капельный полив. Исходя из этого приспосабливают свободный конец шланга от помпы.

2. Датчик влажности почвы

Датчик влажности почвы измеряет влажность и выводит аналоговым сигналом от 0 до 1023 либо цифровым(0 или 1). Мы будем использовать аналоговый сигнал для большего контроля меняющейся влажности. Значение 0 это максимум влажности, 1023 максимум сухой. Мы будем использовать значение 200 - достаточная влажность, значение 600 - критическая сухость. Пороги влажности и сухости при необходимости можно изменить в скетче arduino. Сам датчик состоит из двух частей: щуп(опускается в землю) и компаратор. Записывается датчик от 3.3 до 5 вольт, можно использовать встроенный разъем arduino.

Схема компаратора на LM393:

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

3. Практическая реализация

Логика работы: раз в секунду(можно сделать более долгие промежутки) arduino получает значение влажности с датчика. При получении значения больше 550 и если помпа не работала ближайшие 15 минут arduino включает реле(к которому подключен насос) на время time_work. Задержка 15 минут между поливами сделана для того что бы влага успела впитаться в почву и помпа перекачала больше воды чем надо. Переменная time_work устанавливает время работы помпы, это время за которое ваш насос успеет выкачать нужное количество воды вашему растению.
После полива устанавливается задержка 15 минут для работы помпы, при этом arduino продолжает следить за влажностью. А дальше все циклично. Со временем сделаю датчик уровня воды, что бы помпа не включалась если в резервуаре мало воды и выдавалась индикация.

Схема подключения:

Собственно сам код:

Int minv = 600;//малая влажность int maxv = 220;//полный полив int normv = 500;//чуть влажная int value = 0;//полученное значение int last_value = 0;//последнее значимое изменение int value_sdvig =50;//значимое изменение int ralay = 6; //пин реле int time_work = 10;//время работы помпы в сек int analogPin = A0;//пин датчика

//Переменные таймаута
int second = 0; // секунды
int time_off = 0; // счетчик оставшегося времени
int pause_time = 15; // время отдыха после полива в минутах

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(ralay,HIGH);//настройка реле
digitalWrite(ralay, HIGH);
}

void poliv()
{
int time_tmp;
time_tmp=time_work;
digitalWrite(ralay, LOW);
while(time_tmp>0 && value>normv){// ждем истечения времени time_work или нормальной влажности почвы
delay(1000);
value=analogRead(analogPin);//обновляем значение влажности
time_tmp--;
}
digitalWrite(ralay, HIGH);
second=0; // сбрасываем секунды на ноль
time_off=pause_time;// устанавливаем задержку между поливами
}

void loop() {
// put your main code here, to run repeatedly:
value=analogRead(analogPin);
if (value>(last_value+value_sdvig)||value<(last_value-value_sdvig)){// если last_value отклонился на value_sdvig выводим value в uart
Serial.println(value);
last_value=value;
}
if ((value>(minv-value_sdvig)) && time_off<1) poliv();//если значение влажности > критическая влажность - 50 и не было недавних поливов
// временные функции что бы не играться с таймерами
if (second>59)
{
second=0;
if (time_off>0) time_off--;
}
delay(1000);//пауза 1 сек
second++;
}

На сегодня всё, спасибо всем за внимание! Ждем ваших комментариев.

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

UPD: добавлен скетч для Ардуино.

1. Осмысление хотелок и упорядочивание мыслей проекта
Проект изначально задумывался примерно в таком виде: 4 мощных разбрызгивателя (в перспективе 8), столько же электромагнитных клапанов, релейный модуль для них, экран 16x2 символов, часы реального времени и Arduino в качестве мозгов.
Я рассчитывал, что для управления клапанами будет достаточно какого-нибудь простого меню, через которое можно задавать текущее время, время начала полива и длительность работы.
Потом прикинул, что 8 входов ардуины отдавать на клавиатуру - это чересчур. И вообще, не все клавиатуры одинаково полезны везде оправдано использование только цифрового блока; нужно ведь не только вводить циферки, но и реализовать навигацию по меню.
А если так, то лучше использовать джойстик - это более универсальное решение чем цифровая клавиатура, да и управление становится «интуитивным»… разумеется, если его удастся таким сделать… Зимой были куплены релюшки, один 12-вольтовый клапан, один разбрызгиватель, джойстик, ардуина и экран, и в феврале-марте я начал отлаживать скетч для поливалки.
В процессе разработки программной части было внесено еще несколько изменений в первоначальный проект. В частности, я добавил несколько датчиков температуры-влажности и блок ручного управления клапанами. Кроме того, для защиты от работы мотора вхолостую я решил поставить на вход датчик расхода воды, чтобы аварийно отключать мотор в случае длительного отсутствия потока.
Зачем столько датчиков? Да просто стоят они не очень дорого, пустые входы на плате оставались, а знать температуру и влажность на разных частях участка - полезно. Датчики я планировал поставить в теплице, на улице и в приямке для насосной станции, а также где-то в огороде разместить датчик влажности почвы и датчик температуры почвы.
А вообще - покажу я лучше таблицу датчиков и пинов ардуины

2. Закупка необходимых компонентов
Привожу список компонентов системы, купленных в Китае (большинство приобрел на aliexpress, но пару лотов взял на Ebay - там было дешевле). Два лота уже сняты с продаж, поэтому вместо ссылок на них будут снапшоты - чтобы заинтересованные люди знали что искать.
1 , цена 6,36$ (лот у другого продавца, т.к. мой продавец снял этот датчик с продаж)
1 , цена 0,74$
1 , цена 0,63$
1 , цена 1,16$
1 , цена 0,56$
1 , цена 1,79$
1 , цена 1,1$
1 , цена 0,66$
1 , цена 0,5$
1 , цена 1,35$
1 , цена 3,56$
1 , цена 0,84$
3 , цена 0,99$ за штуку, всего 2,97$
4 , цена 5,59$ за штуку, всего 22,36$
4 , цена 3,62$ за штуку, всего 14,48$. Аналоги легко ищутся
4 , цена 0,95$ за пару, всего 1,9$
Итоговые затраты в интернетах - 60,96$

В местном строительном магазине были куплены следующие вещи:
2 бухты поливочного шланга 5/8 (по 30м) - 540000 бел.рублей, или примерно 28$
8 муфт 1/2 - 112000 бел.рублей, или примерно 5,8$
3 тройника 1/2 - 60000 бел.рублей, или примерно 3$
8 штуцеров 15*16 - 92000 бел.рублей, или примерно 4,8$
Итоговые затраты в оффлайне - 804000 бел.рублей, или 41,2$

Также стоит упомянуть то, что не вошло в этот список - некоторые вещи из этого списка достались мне условно-бесплатно (старая рухлядь), на какие-то вещи я просто запамятовал цены. Это:
40 метров 4-жильного сигнального кабеля для подключения температурных датчиков;
40 метров самого дешевого 2-жильного медного кабеля для передачи 12 вольт на электромагнитные клапаны;
2 разветвителя RJ-11, которые были использованы в качестве выходов для подключения датчиков температуры и влажности, и 4 коннектора для кабелей с датчиками;
2 разветвителя RJ-45, для связи блока управления, находящегося в доме, с блоком реле и датчиков почвы, находящимся на улице рядом с насосом, и 4 коннектора для кабелей;
старый кабель (витая пара) - метров 30-40, для соединения ардуины с релюшками;
коннектор для подключения дисковода, выпаянный со старой материнской платы, и шлейф от дисковода;
старый блок питания на 24 вольта;
обрезки мебельного щита толщиной 12-16 мм для изготовления коробок для системы.

Фотки разветвителей до применения не сделал, выглядят примерно так:

3. Изготовление того, что не было куплено
Некоторые вещи по тем или иным причинам пришлось делать самостоятельно из подручных материалов. Постараюсь здесь описать, что и как было сделано, и почему именно так а не иначе.

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


Паяем провода, резисторы и куски спицы - в общем, делаем все так, как написано на форуме


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


Далее в качестве формочки был взят маленький стаканчик от детского йогурта, в нем я сделал отверстие для провода, аккуратно установил конструкцию внутрь и залил анкерным составом Ceresit СХ-5






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






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

Для использования этого мегадевайса требуется предварительная калибровка. Делается это элементарно: берем сухую почву, в нее тыкаем самодельный датчик, проверяем и записываем полученное значение влажности. Затем льем туда столько воды, чтобы получилось небольшое болотце, и снова снимаем значение с датчика.
По-быстрому откалибровался вот этим скетчем с форума:
#define PIN_SOIL_LEFT 6 #define PIN_SOIL_RIGHT 7 #define PIN_SOIL_HUMIDITY 0 void setup(){ Serial.begin(9600); pinMode(PIN_SOIL_LEFT, OUTPUT); pinMode(PIN_SOIL_RIGHT, OUTPUT); pinMode(PIN_SOIL_HUMIDITY, INPUT); } void setSensorPolarity(boolean flip){ if(flip){ digitalWrite(PIN_SOIL_LEFT, HIGH); digitalWrite(PIN_SOIL_RIGHT, LOW); }else{ digitalWrite(PIN_SOIL_LEFT, LOW); digitalWrite(PIN_SOIL_RIGHT, HIGH); } } void loop(){ setSensorPolarity(true); delay(1000); int val1 = analogRead(PIN_SOIL_HUMIDITY); delay(1000); setSensorPolarity(false); delay(1000); // invert the reading int val2 = 1023 - analogRead(PIN_SOIL_HUMIDITY); reportLevels(val1,val2); } void reportLevels(int val1,int val2){ int avg = (val1 + val2) / 2; String msg = "avg: "; msg += avg; Serial.println(msg); }
В моем случае, значение на датчике было чуть больше 200 в сухой почве, и чуть меньше 840 во влажной.
Теперь у нас есть минимальный и максимальный уровни влажности конкретно взятой почвы, их нужно будет внести в соответствующие константы в основном скетче. Вот и все!

3.2 Блок питания для клапанов
Можно было, конечно, купить в Китае обычный блок питания на 12 вольт, выдающий хотя бы 1 ампер, но в закромах Родины куче старого барахла нашелся зарядник от дохлого шуруповерта, выдающий полампера при напряжении 24 вольта. Поэтому был куплен понижающий преобразователь на LM2596, и затем успешно встроен в старый блок. Отдельных фоток процесса я не делал, бо не об этом обзор… Вот модифицированный блок вместе с клапаном, сойдет за пример


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

3.3 Держатели для разбрызгивателей
Вот эту штуку в магазине купить точно не получится! Потому что сделана она в количестве 4 единиц по спецзаказу:) Хотя здесь все просто: полудюймовая труба высотой один метр, снизу сделан изгиб под 90 градусов и приварен уголок длиной 30-40 см, чтобы держатель можно было воткнуть в землю в нужной части участка. Вверху резьба должна быть внутренняя на полдюйма (в моем случае там просто наварена муфта), внизу - кому как удобнее. В моем случае там наружная полдюймовая резьба, но как показала практика - лучше бы была внутренняя, тогда не пришлось бы навинчивать сначала муфту, потом в нее штуцер или клапан… В общем, не продумал заранее, поэтому получил дополнительные расходы на муфты:(
Наглядные фото держателя - вот:




И еще чуть дальше будет фотка держателя в процессе эксплуатации.

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

Под спойлером сверлим, пилим и собираем коробочку













Далее разветвители (телефонные и под витую пару) вскрываем, паяем к ним провода и садим на термоклей. Здесь видно более подробно






Экранчик и часы реального времени были объединены в одно целое вот таким способом


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


Осталось закинуть в коробку мозги - и блок управления готов.
Теперь внимание. Эстетам, детям и беременным женщинам настоятельно не рекомендуется открывать следующий спойлер… Потому что красивых плат, которые умеют делать Yurok, ksiman и прочие известные здесь личности, вы не увидите. Зато вы увидите монтаж платы в лучших традициях КитайПодвалПрома: проводки вместо дорожек, и термоклей, чтобы это все не развалилось. Поэтому еще раз предупреждаю: не надо открывать спойлер! Поверьте на слово, эта плата работает, но лучше ее не видеть:)

Спойлер, не открывайте его, там ужос и кышмарь!

Вот зачем вы открыли, а? Ну и ладно, любуйтесь… Помидорами не кидать!









Блок управления соединен с блоком реле двумя витыми парами. Для взаимодействия «мозгов» с клапанами и мотором достаточно 5 управляющих линий и еще 2 линии для питания реле (5 вольт и земля), но ведь есть еще расходомер (питание уже есть, значит нужна всего 1 линия), датчик влажности почвы (3 линии) и 4 светодиода, отображающие текущее состояние клапанов. Итого - используется 15 линий из 16 доступных.
В блоке реле помимо самих релюшек встроены розетки для мотора и для блока питания клапанов, а также обычный выключатель для принудительного запуска мотора. Сам блок сделан из тех же обрезков мебельного щита, что и блок управления, а выглядит как обычная деревянная коробочка. На входе две витые пары разведены на плате по коннекторам на реле мотора, реле клапанов, светодиоды, датчик влажности и датчик расхода воды. В стенке предусмотрительно сделаны отверстия под провода на клапаны, на выключатель и на розетку, управляемую через реле мотора.


На клеммнике выведены провода к электромагнитным клапанам


Снаружи я прикрутил розетку для мотора, управляемую ардуиной, и выключатель для ручного включения мотора


Все провода разведены и выведены куда нужно… вроде бы


На внутренней стенке появилась розетка для 12-вольтового блока питания, он тоже здесь виден


В готовом виде все это смотрится примерно так:


Немного объясню что и как. В коробку заведено питание, внутри спрятан блок для 12-вольтовых клапанов, реле мотора и реле клапанов. Наружу выходит питание на мотор (розетка), а также выведен выключатель для ручного управления мотором (он запараллелен с релюшкой). Кроме того, есть возможность подключения датчиков влажности почвы и расхода воды, но они пустуют. Почему - расскажу немного дальше.
4. Описание функционала
Собственно, вот неполный набор электронных компонентов для сборки


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


Минимальный как я уже говорил, было решено сделать управление джойстиком, и вырисовывался следующий минимально необходимый набор пунктов меню:
1. Настройки даты и времени
2. Настройки расписания полива
3. Информация с датчиков
4. Возможность принудительной перезагрузки

Реализовать его мне удалось, причем получилось даже обойтись англоязычным дисплеем 1602 - помогла библиотека LCD_1602_RUS, которая позволила «сделать» 8 кириллических символов. После этого вперемешку с английскими буквами можно было составить вполне понятные для пожилых людей (моих родителей) русские названия пунктов меню. Конечный размер скетча - чуть меньше 1400 строк, втиснутых в 45 килобайт.
Результат компиляции:
Скетч использует 19 626 байт (63%) памяти устройства. Всего доступно 30 720 байт.
Глобальные переменные используют 1 316 байт (64%) динамической памяти, оставляя 732 байт для локальных переменных. Максимум: 2 048 байт.

Никаких предупреждений о нехватке памяти, к счастью, уже нет.
Самого скетча пока здесь нет, со временем выложу. Хочу немного «причесать» код:)
Что получилось и что не получилось? Ну, на осьминоге получилось все:) К сожалению, жизнь вносит свои коррективы, и после разнесения мозгов, релюшек и сенсоров кое-что работать перестало… Во-первых, аналоговые датчики. Увы, но сейчас из-за длины кабелей они у меня не работают - соответственно, пункт меню «ПОЧВА» показывает нулевую температуру и влажность. Есть определенные мысли, как это исправить, но пока - некогда. У родителей на даче бываю не слишком часто и занимаюсь не только поливатором, а тут еще очередная командировка… В любом случае - я буду рад дельным советам от читателей.
Во-вторых, сходу не удалось подключить расходомер - на этот раз вовсе не из-за длины кабелей. Я сгоряча поставил его на вход в мотор, сразу после обратного клапана, как оказалось - ему там не место. Датчик, видимо, не совсем герметичен, и при подъеме воды идет подсос воздуха через микрощели в корпусе, как результат - насос не тянет воду. Пока снял его, потом попробую поставить на выход насоса - должно работать, но возможно - будет немного подтекать.
Теперь по работающему функционалу. Ну, с расписанием понятно - это именно то, ради чего затевался проект. Но иногда нужно просто включить ненадолго поливалку, и для этого я сделал два режима принудительного полива: ограниченный и бесконечный. Ограниченный режим включается коротким нажатием на кнопку, длительность такого полива можно указать в настройках. Если нажать на кнопку еще раз - полив будет прекращен досрочно. По длинному нажатию включается бесконечный полив - выключить его можно опять таки нажатием на кнопку.
Ну и приятное дополнение - просмотр температуры в приямке с насосной станцией, в теплице и на улице.
Раз в сутки запланирована принудительная перезагрузка ардуины.

5. Собираем поливатор
Здесь я сделаю небольшое отступление и приведу технические характеристики водонапорных компонентов.
Насос JY1000 польской фирмы Omnigena, согласно утверждениям производителя, имеет такие характеристики:
Производительность: 60 л/мин;
Максимальная высота подъема: 50 м;
Потребляемая мощность: 1100 Вт;
Максимальная глубина самовсасывания: 8 м.

Кроме того, обнаружился вот такой полезный график

вот


Ну и конечно, не стоит забывать, что производительность очень сильно зависит от глубины скважины и забитости фильтров.

Электромагнитный клапан безымянный, но я находил на множестве страниц (например ) примерно такие характеристики:
Напряжение: DC 12 В;
Ток: 0.5A;
Давление: 0.02-0.8 МПа;
Производительность 3-25 л/мин.
Кроме того, встречается оптимистичное утверждение: Water pressure: hydrostatic pressure of 1.2 MPa, which lasted 5min, no rupture, deformation, leakage. . Т.е. в течение 5 минут клапан выдерживает даже существенно более высокое давление, чем стандартное «не более 0.8 МПа».
Вот здесь можно рассмотреть клапан в разных ракурсах


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


Вот - один клапан в такой одежке, может здесь видно получше

Производительность разбрызгивателя , согласно данным , составляет 700 - 1140 л/ч, или примерно 11.7-19 л/мин при давлении жидкости 0,21-0,35 МПа соответственно.
Как видно, в идеальных условиях насос выдает слишком большой поток, который просто физически не «осилит» ни клапан, ни тем более разбрызгиватель. Забегая вперед, скажу, что скважина в моем случае далеко не идеальная и до 60 л/мин она не дотягивала. Потом я прикинул, что напор упадет также и из-за длины шланга от мотора до самого дальнего разбрызгивателя (почти 30 метров), решил сильно не заморачиваться по этому поводу. Потом, в ходе «производственных испытаний», подключил к мотору одновременно три разбрызгивателя. Оказалось, что они льют очень слабо, да еще и давления не хватает на то, чтобы изменилось направление вращения. Выглядело так: разбрызгиватель крутится до тех пор, пока не упрется в ограничитель сектора, и вращение прекращается. Если убрать ограничитель сектора, то по кругу вращение более-менее без проблем, но радиус полива - метра 2-3. Отбросил один разбрызгиватель - стало немного лучше и они даже пытались вертеться, но радиус все равно был максимум метра 4. А вот один разбрызгиватель работает замечательно - бьет очень далеко (замерял рулеткой, на 9 метров брызгает только в путь), и никаких проблем с вращением.
Сами разбрызгиватели можно регулировать под свои нужды:
- разбить струю, выкрутив винт напротив сопла;
- изменить угол и соответственно дальность струи, поднимая или опуская пластину напротив сопла;
- изменить сектор полива с помощью ограничителей, или вообще убрать фиксатор ограничителя.
Вот фотографии «элементов управления» с близкого расстояния








Брызгалка на держателе и с подведенным шлангом/проводом выглядит вот так:

6. Работа
Блок управления, кроме текущего времени, умеет показывать всякую полезную информацию вроде температуры и влажности. Там же задается начало и длительность полива по расписанию, и длительность полива при активации кнопкой.
Коротким нажатием одной из 4 кнопок можно включить полив на определенное время (задается в настройках), длинное нажатие включает «бесконечный» режим, т.е. отключить полив на заданной линии можно будет только этой же кнопкой, или он отключится, если по расписанию линию необходимо отключить. Хотя зачем я повторяюсь? Даешь слайды!
Вот здесь видны настройки:











Вот здесь - смотрим температуру и влажность






Информацию получаем отсюда

Вот так собственно выглядит колхозинг датчиков в дачных условиях. Крыльцо


Приямок


Теплица


Эти датчики пока ничего не говорят, почему - объяснял выше



И, наконец… Семь бед - один ресет:

А теперь - видео, куда ж без него.
1. Мини-экскурсия - что есть в меню поливатора. Датчики были не подключены, поэтому все показывают по нулям.


2. Настройка поливатора на включение 2 и 3 линии длительностью по одной минуте


3. Как выглядит полив по расписанию, которое было задано для теста


4. Как выглядит полив по расписанию на экране поливатора


5. Тестовый полив с кнопки - включение и выключение. Работу разбрызгивателя не показываю, но чесслово - все работает


6. Разбрызгиватель и его настройка: что где крутится, поворачивается и фиксируется


7. Работа разбрызгивателя на небольшом секторе с близкого расстояния

7. Сравнение с рыночными предложениями
Доступный вариант на российском рынке - системы Gardena, продается в OBI. Можно взять блок управления за 13590 рублей и еще по 3990 рублей, итоговая цена будет всего-то 29550. Здорово, конечно, и выглядит красиво. Но отдавать почти 500 американских денег… И насколько я понимаю - здесь в комплекте нет разбрызгивателей, соединителей и шлангов! Ладно, смотрим дальше.
Опять Gardena в том же магазине, но здесь уже система на 6 линий. Состоит из таймера подачи воды за 11190 рублей и за 6990 рублей - итого 18180, или почти 300 бакинских… Шланги и разбрызгиватели, как и в предыдущем случае, нужно покупать отдельно.
Ebay сходу предложил блок управления вместе с клапанами примерно за 60 долларов, плюс ~35$ стоит доставка - в итоге почти сотня. Как вариант, доступны контроллеры (без клапанов) Rain Bird ESP-RZX Series 4 и Hunter XC 400i по ценам не ниже 75 баксов, не считая доставки. Клапаны отдельно; для хантера, например, они идут от 22 баксов за штуку, оптом дешевле.

И вместо послесловия. Имело ли смысл мне заморачиваться изобретением велосипеда, если он уже есть на рынке? Думаю, что да. Что лично я от этого получил? Во-первых, существенную экономию, во-вторых, возможность реализовать систему так, как это нужно именно мне, в-третьих - мне это просто было интересно. Реализуйте свои проекты и не бойтесь делать ошибки. Не ошибается только тот, кто ничего не делает!

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

Планирую купить +101 Добавить в избранное Обзор понравился +128 +247

Для реализации проекта нам необходимо установить библиотеку:

  • Библиотека iarduino_4LED (для работы с четырёхразрядным LED индикатором).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE .

Видео:

Схема подключения:

В данном уроке, LED индикатор подключён к цифровым выводам 2 и 3, кнопки подключены к цифровым выводам 11 и 12, силовой ключ к цифровому выводу 10 (с ШИМ), датчик влажности почвы к аналоговому входу A0.

Алгоритм работы:

  • При подаче питания , устройство не активно (на индикаторе мигает текущее значение влажности почвы).
    • Если однократно нажать на обе кнопки «A» и «B», то текущее состояние влажности почвы будет сохранено как пороговое (то при котором требуется начать полив) и устройство перейдёт в рабочий режим. Пороговое значение влажности почвы можно изменить в режиме ввода значений.
    • Если нажать и удерживать обе кнопки «A» и «B» дольше 2 секунд, то устройство перейдёт в режим ввода значений.
  • В рабочем режиме устройство выводит на индикатор показания: текущей влажности почвы, пороговой влажности почвы и времени прошедшего с момента последнего полива. (Пороговая влажность почвы отображается тусклее чем остальные показания). Если устройство находится в рабочем режиме и значение текущей влажности почвы упадёт ниже значения пороговой влажности почвы, то устройство перейдёт в режим полива.
  • В режиме полива устройство выводит на индикатор количество секунд до окончания полива и мигает точками, а также подаёт сигнал ШИМ на силовой ключ , который включает насос . Значение ШИМ (скорость мотора насоса) указывается в скетче . Длительность полива устанавливается в режиме ввода значений. По окончании полива, устройство переходит в режим ожидания.
  • В режиме ожидания устройство выводит на индикатор надпись STOP и мигает точками. Данный режим предусмотрен для того, что бы влага равномерно распределилась по грунту до перехода устройства в рабочий режим. Время нахождения в режиме ожидания указывается в скетче . По истечении времени режима ожидания, устройство перейдёт в рабочий режим.
  • В режим ввода значений можно перейти из любого режима, удерживая обе кнопки «A» и «B» дольше 2 секунд. Данный режим состоит из двух пунктов: установка пороговой влажности почвы (при котором требуется начать полив) и установка длительности самого полива. Вначале отобразится значение пороговой влажности, которое можно изменить нажатием или удержанием кнопки «A» (уменьшение), или кнопки «B» (увеличение). Если однократно нажать на обе кнопки «A» и «B», то значение изменится на текущую влажность почвы. После того как пороговая влажность задана, нужно нажать и удерживать дольше 2 секунд обе кнопки «A» и «B», на экране отобразится длительность полива, которую можно изменить нажатием или удержанием кнопки «A» (уменьшение), или кнопки «B» (увеличение). После того как длительность полива задана, нужно нажать и удерживать дольше 2 секунд обе кнопки «A» и «B», устройство перейдёт в рабочий режим.
  • Если в режиме полива нажать любую кнопку , устройство прекратит полив и перейдёт в режим ожидания.
  • Если в режиме ожидания нажать любую кнопку , устройство перейдёт в рабочий режим.

Код программы:

#include // подключаем библиотеку для работы с четырёхразрядным LED индикатором iarduino_4LED dispLED(2,3); // объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов индикатора (CLK , DIO) const uint8_t pinSensor = A0; // объявляем константу с указанием номера аналогового входа, к которому подключен датчик влажности почвы const uint8_t pinButtonA = 12; // объявляем константу с указанием номера вывода, к которому подключена кнопка A const uint8_t pinButtonB = 11; // объявляем константу с указанием номера вывода, к которому подключена кнопка B const uint8_t pinPump = 10; /* вывод с ШИМ */ // объявляем константу с указанием номера вывода, к которому подключен силовой ключ uint8_t btnState; // объявляем переменную для хранения состояний кнопок: 0-не нажаты, 1-нажата A, 2-нажата B, 3-нажата A и B, 4-удерживается A, 5-удерживается B, 6-удерживались A и B uint16_t arrMoisture; // объявляем массив для хранения 10 последних значений влажности почвы uint32_t valMoisture; // объявляем переменную для расчёта среднего значения влажности почвы uint32_t timWatering; // объявляем переменную для хранения времени начала последнего полива (в миллисекундах) uint32_t timSketch; // объявляем переменную для хранения времени прошедшего с момента старта скетча (в миллисекундах) const uint8_t timWaiting = 60; // объявляем константу для хранения времени ожидания после полива (в секундах) от 0 до 99 const uint8_t pwmPump = 100; // объявляем константу для хранения скорости вращения мотора насоса (коэффициент) от 0 до 255 uint16_t timDuration = 5; /* по умолчанию */ // объявляем переменную для хранения длительности полива (в секундах) от 0 до 99 uint16_t limMoisture = 0; /* по умолчанию */ // объявляем переменную для хранения пороговой влажности почвы (для вкл насоса) от 0 до 999 uint8_t modState = 0; /* при старте */ // объявляем переменную для хранения состояния устройства: 0-не активно, 1-ожидание, 2-активно, 3-полив, 4-установка пороговой влажности, 5-установка времени полива void setup(){ dispLED.begin(); // инициируем LED индикатор pinMode(pinButtonA, INPUT); // переводим вывод pinButtonA в режим входа pinMode(pinButtonB, INPUT); // переводим вывод pinButtonB в режим входа pinMode(pinPump, OUTPUT); // переводим вывод pinPump в режим выхода digitalWrite(pinPump, LOW); // выключаем насос timWatering = 0; // сбрасываем время начала последнего полива } void loop(){ //*******Чтение данных:******* btnState = Func_buttons_control(); // читаем состояние кнопок, но не дольше 2 секунд timSketch = millis(); // читаем текущее время с момента старта скетча if(timWatering>timSketch){timWatering=0;} // обнуляем время начала последнего полива, если произошло переполнение millis() valMoisture = 0; for(int i=0; i<9; i++){arrMoisture[i]=arrMoisture;} arrMoisture=analogRead(pinSensor); for(int i=0; i<10; i++){valMoisture+=arrMoisture[i];} valMoisture/=10; // вычисляем среднее значение влажности почвы //*******Управление устройством:******* switch(modState){ // Устройство не активно case 0: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4;} if(btnState==3){modState=2; limMoisture=valMoisture;} } if(timSketch%100==0){ // если начинается десятая доля секунды if(timSketch/1000%2){dispLED.print(valMoisture);}else{dispLED.print(" ");} } break; // Устройство в режиме ожидания (после полива) case 1: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4;} if(btnState==1){modState=2;} if(btnState==2){modState=2;} if(btnState==3){modState=2;} } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print("stop"); dispLED.point((timSketch/100%4)+1,true); } if(timDuration+timWaiting-((timSketch-timWatering)/1000)<=0){// если закончилось время ожидания modState=2; } break; // Устройство активно case 2: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4; dispLED.light(7);} } if(timSketch%100==0){ // если начинается десятая доля секунды if(timSketch/1000%15<5){dispLED.light(7); dispLED.print(valMoisture);}else if(timSketch/1000%15<10){dispLED.light(1); dispLED.print(limMoisture,LEN4);}else {dispLED.light(7); if(timWatering){dispLED.print(int((timSketch-timWatering)/1000%3600/60),int((timSketch-timWatering)/1000%3600%60),TIME);}else{dispLED.print("----");}} } if(valMoisture<=limMoisture){ // если текущая влажность почвы меньше пороговой timWatering=timSketch; modState=3; dispLED.light(7); analogWrite(pinPump,pwmPump); } break; // Устройство в режиме полива case 3: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=4;}else{modState=1;} analogWrite(pinPump,0); } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print(timDuration-((timSketch-timWatering)/1000)); dispLED.point(0,true); dispLED.point((timSketch/100%4)+1,true); } if(timDuration-((timSketch-timWatering)/1000)<=0){// если закончилось время полива modState=1; analogWrite(pinPump,0); } break; // Устройство в режиме установки пороговой влажности почвы case 4: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=5;} if(btnState==1){if(limMoisture>0){limMoisture--;}} if(btnState==2){if(limMoisture<999){limMoisture++;}} if(btnState==3){limMoisture=valMoisture;} if(btnState==4){while(digitalRead(pinButtonA)){if(limMoisture>0){limMoisture--;} delay(100); dispLED.print(limMoisture);}} if(btnState==5){while(digitalRead(pinButtonB)){if(limMoisture<999){limMoisture++;} delay(100); dispLED.print(limMoisture);}} } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print(limMoisture); } break; // Устройство в режиме установки длительность полива case 5: if(btnState){ // если зафиксировано нажатие или удержание кнопок if(btnState==6){modState=2;} if(btnState==1){if(timDuration>0){timDuration--;}} if(btnState==2){if(timDuration<99){timDuration++;}} if(btnState==4){while(digitalRead(pinButtonA)){if(timDuration>0){timDuration--;} delay(100); dispLED.print(timDuration);}} if(btnState==5){while(digitalRead(pinButtonB)){if(timDuration<99){timDuration++;} delay(100); dispLED.print(timDuration);}} } if(timSketch%100==0){ // если начинается десятая доля секунды dispLED.print(timDuration); dispLED.point(0,true); } break; } } // Функция определения состояния кнопок uint8_t Func_buttons_control(){ uint8_t a=0, b=0; // время удержания кнопок A и B (в десятых долях секунды) while(digitalRead(pinButtonA)||digitalRead(pinButtonB)){ // если нажата кнопка A и/или кнопка B, то создаём цикл, пока они нажаты if(digitalRead(pinButtonA)){if(a<200){a++;}} // если удерживается кнопка A, то увеличиваем время её удержания if(digitalRead(pinButtonB)){if(b<200){b++;}} // если удерживается кнопка B, то увеличиваем время её удержания if(a>20 && b>20){dispLED.print("----");} // если обе кнопки удерживаются дольше 2 секунд, выводим на экран прочерки, указывая что их пора отпустить if(a>20 && b==0){return 4;} // если кнопка A удерживается дольше 2 секунд, возвращаем 4 if(a==0 && b>20){return 5;} // если кнопка B удерживается дольше 2 секунд, возвращаем 3 delay(100); // задержка на 0,1 секунды, для подавления дребезга } if(a>20 && b>20){return 6;} // если обе кнопки удерживались дольше 2 секунд, возвращаем 6 if(a> 0 && b> 0){return 3;}else // если обе кнопки удерживалась меньше 2 секунд, возвращаем 5 if(a> 0 && b==0){return 1;}else // если кнопка A удерживалась меньше 2 секунд, возвращаем 2 if(a==0 && b> 0){return 2;}else // если кнопка B удерживалась меньше 2 секунд, возвращаем 1 {return 0;} // если ни одна из кнопок не была нажата, возвращаем 0 }

Close