Автополив кімнатних рослин на Arduino. Робимо автополив рослин за допомогою Arduino Електронні таймери з програмним керуванням

Автополив кімнатних рослин на Arduino. Робимо автополив рослин за допомогою Arduino Електронні таймери з програмним керуванням


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(); } }

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


У даній статті буде описано, як збирається невеличкий агрегат для автоматичного поливурослин на базі Arduino з контролем вологості. Необхідність самого поливу буде визначатися по датчику вологості грунту. При бажанні можна буде поливати відразу кілька рослин.

Матеріали і інструменти:
- Arduino Uno
- Рослина в горщику з сухою землею
- Водяний насос
- Датчик вологості грунту зі шлейфом
- Силовий ключ (трійка) зі шлейфом
- Клеммник нажімной
- Провід «тато-тато» × 1 шт
- Провід «мама-тато» × 1 шт
- Блок живлення з роз'ємом USB
- USB кабель

збірка:
Дисплей підключається до контакту 3 трійка-Шілд. При з'єднанні всіх проводів даного типу важливо упевнитися, що з контактом GND з'єднувався чорний дріт.

У помпи на кінцях проводів відсутні контакти, тому використовується клеммник. Якщо є навик в пайку контактів, тоді правильніше припаювати до проводів «штирьковим з'єднувачі».

Ось так виглядає підключений харчування:

За допомогою Arduino IDE програмується Arduino Uno прикріпленим нижче файлом. Сам сенсор вологості, звичайно ж, встромляється в грунт. Під'єднується кінець трубки з водою в землю. Якщо горщик важить трохи, тоді автор рекомендує закріпити окремо трубку так, щоб рослина не було перевернуто. Далі, помпа опускається в зручну ємність з водою, і підключається харчування.

калібрування:
Щоб показання датчика були вірними потрібно провести нескладну процедуру його калібрування. Тому що точність показань безпосередньо залежить від кислотності грунту.

1. При увіткнути в сухий горщик датчику записуються показання з дисплея. Це значення ніщо інше як мінімум вологості.

2. Квітка поливають водою і чекають поки вода не вбереться повністю в землю, і показання сенсора зупиняться на одному значенні. Дані записуються і позначаються як максимальна вологість.

3. У файлі прошивки змінюються значення констант HUMIDY_MIN встановлюється мінімальна вологість, і HUMIDY_MAX відповідно максимальна вологість. Arduino Uno прошивається заново.

масштабування проекту
У даній статті описаний спосіб поливу всього для однієї квітки. Але часто потрібні поливати відразу кілька рослин. Звичайно, можна підключити до Arduino більшу кількість помп і датчиків вологості, але наскільки це буде затратно. Автор в цьому випадку пропонує рішення дешеве і просте. У трубці, яка приєднана до помпи проробляються дірочки шилом, відстань між ними близько 30 сантиметрів, в ці отвори встромляються стрижні з використаної кулькової ручки.

Горщики в будинку, як правило, стоять в ряд, наприклад, на підвіконні. Трубка лягає на горщики так щоб кожен отвір відповідало горщика. Тільки ось рішення про полив буде прийматися пристроєм лише по одному горщику. Найкраще це буде працювати якщо горщики однакового розміру часто на підвіконнях так і трапляється. Сохнути грунт в них буде приблизно однаково. При бажанні і великій кількостірослин у вас вдома, можна підключати додаткові помпи, і розділяти всі горщики по групах рівним за розмірами.

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

  • Бібліотека 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)

Всім доброго дня! Ось і настало літо, всі їдуть з міста, деякі з країни, а вдома є якісь рослини які потрібно поливати. На додаток до всього тепла погода сприяє збільшенню кількості поливу рослин. І для того що б не брати свій улюблений фікус на відпочинок, ми пропонуємо зібрати для нього систему автоматичного поливу, про це і буде наша сьогоднішня стаття.

1. Інформація про пристрій

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

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

Відразу що б не плекати ілюзій скажу, підключати до водопроводу все це справа ми не будемо. Що б уникнути позаштатних ситуацій, для простоти і зручності будемо використовувати резервуар (ємність з водою). З резервуара воду буде качати насос (помпа), невеликої потужності буде достатньо, я буду використовувати саморобну помпу з харчуванням 12 вольт. Хоча при підборі помпи варто врахувати: вигини шланга, відстань від насоса до поливати рослини, тип насоса. У підборі шланга складного нічого немає, вибираємо по діаметру вихідного отвору помпи, але він повинен бути не сильно широкий на виході до рослини. При побудові системи потрібно врахувати тип поливу, вважається оптимальним крапельний полив. Виходячи з цього пристосовують вільний кінець шланга від помпи.

2. Датчик вологості грунту

Датчик вологості грунту вимірює вологість і виводить аналоговим сигналом від 0 до 1023 або цифровим (0 або 1). Ми будемо використовувати аналоговий сигнал для більшого контролю мінливої ​​вологості. Значення 0 це максимум вологості, 1 023 максимум сухою. Ми будемо використовувати значення 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 ++;
}

На сьогодні все, спасибі всім за увагу! Чекаємо ваших коментарів.

Після того як у мене висох черговий квітка, я зрозумів, що непогано було б якось автоматизувати процес поливу. Тому що я впевнений, що вона здохла через брак води.
Я вирішив зібрати конструкцію, яка б поливала квітка замість мене. В результаті у мене вийшов ось такий апарат, який цілком справляється зі своїми обов'язками:

За допомогою двох регуляторів можна налаштувати обсяг поливається за раз води, а також період між поливами. Кому цікаво - далі докладна інструкція, Як зробити такий пристрій. В основу мозку я застосував Ардуіно (Arduino Mega).
Для складання поливалки вам знадобиться кілька компонентів і не більше ніж 30 хвилин вільного часу.

Використовувані компоненти:

  • Arduino Mega (вона просто була під рукою, але будь-яка інша підійде)
  • Насос і силіконова трубка (підійде насос омивача автомобільних стекол - можна купити в будь-яких автозапчастини або можна купити маленький погружной насос на ebay)
  • Блок живлення
  • Два змінних резистора для регулювання (будь-які)
  • транзистор IRL3705N
  • Два резистора (100 Ом і 100 кОм)
  • Діод (будь-який)
  • Резервуар для води (в моєму випадку пластикова коробочка з Ikea)
  • макетке

Збираємо все за такою схемою:

Або наочніше:

Ось що вийшло у мене:

Спочатку протест насос. Подамо на нього 5В. Якщо він задзижчав, все в порядку, рухаємося далі.

Тепер підключимо насос до Arduino. Зробимо для управління насоса з Ардуіно невелику обв'язку на макетке.

Спробуємо покерувати насосом з Ардуіно. Заллємо такий код

int pumpPin = 5; void setup () (pinMode (pumpPin, OUTPUT); digitalWrite (pumpPin, LOW);) void loop () (digitalWrite (pumpPin, HIGH); delay (1000); digitalWrite (pumpPin, LOW); delay (1000);)

Якщо він періодично дзижчить, значить, знову все в порядку.

Тепер нам залишилося додати два регулятора. Підчепити до нашого пристрою змінні резистори, і перевіримо їх працездатність.

Заллємо такий код на Ардуіно

int volumePin = A0; void setup () (pinMode (volumePin, INPUT); Serial.begin (9600);) void loop () (Serial.println (analogRead (volumePin)); delay (100);)

Зайдемо в Serial Monitor і переконаємося, що є реакція на поворот регулятора. Він повинен змінюватися приблизно від 0 до 1024

Тепер залишилося змусити заробити все це разом.

Ось безпосередньо код поливалки:

// Перший регулятор управляє часом, яке буде литися вода (від 4 до 15 секунд) #define MAX_FLOWTIME 15 // seconds #define MIN_FLOWTIME 4 // seconds // Другий регулятор управляє частотою поливу від рази в день до рази на тиждень#define MAX_PERIOD 7 // days #define MIN_PERIOD 1 // days #define MAX 1015 #define MIN 0 int volumePin = A0; // Пін, до якого підчеплений регулятор, який відповідає за обсяг поливається води int periodPin = A1; // Пін, до якого подцепелн регулятор, відповідальний за період між поливами int pumpPin = 5; // Пін, до якого приєднано управління насосом int volume; int period; // Процедура, що включає насос на час, заданий в volume void water () (digitalWrite (pumpPin, HIGH); // включаємо насос delay (volume); digitalWrite (pumpPin, LOW); // вимикаємо насос delay (period); ) Void setup () (pinMode (pumpPin, OUTPUT); digitalWrite (pumpPin, LOW);) void loop () ( // Прочитуємо значення регуляторів (змінних резисторів) і приводимо їх до заданих меж volume = map (analogRead (volumePin), MIN, MAX, MIN_FLOWTIME, MAX_FLOWTIME) * 1000; period = map (analogRead (periodPin), MIN, MAX, MIN_PERIOD, MAX_PERIOD) * 1000 * 60 * 60 * 24; water (); )

Ось все готово. Насолоджуємося відпочинком. і ви завжди будете знати що ваші рослини отримують воду.

переглядів

Зберегти в Однокласники зберегти ВКонтакте