RDC1-0000, Контролер поливу рослин

  1. Технічні характеристики
  2. Електрична схема
  3. Монтажна схема
  4. Друкована плата

Те, що у вас вже є, ви можете видалити в кошику.

Це конструкція ефективно, ефектно і дуже логічно показує вологість грунту в домашньому квітці або на грядці дачної ділянки.

можливості:

  • настройка нормального рівня вологості
  • настройка чутливості до денного світла
  • відключення пристрою вночі
  • індикація вологості виходячи із заданої норми, зони перераховуються автоматично
  • передбачено виведення МК і налаштування ПО для автоматичного поливу

настройка нормального рівня вологості   настройка чутливості до денного світла   відключення пристрою вночі   індикація вологості виходячи із заданої норми, зони перераховуються автоматично   передбачено виведення МК і налаштування ПО для автоматичного поливу

Уявіть собі світлофор. Горить зелене світло - вологість ґрунту достатня і поливати ще рано. Коли гасне зелений і спалахує жовтий - можна ще не поливати. Надмірний полив не завжди йде на користь. А ось коли жовтий змінюється на червоний, то все, шукайте лійку, відкривайте кран, піднімайте шлюзи ... Це про ефективно.

Тепер щодо ефектно. Уявіть. П'ять, шість або ще більше наших світлофорів розставлені по дачній ділянці. Сяючі світлодіоди спрямовані до ганку. Красиво? А ввечері? Гості щасливі.

Логічно. Ви самі налаштовуєте, як повинні працювати ваші агросветофори. На борту пристрою встановлено фототранзистор VT5 - він визначає світлий час доби. Саме днем ​​повинен працювати наш датчик поливу. Рівень освітленості (поріг світлового дня) встановлюється повзунковим резистором R11. А якщо подивитися скетч, то в рядку визначення
#define WORK_AFTER_DAYLIGHT ((long) 28125000)
можна виставити час роботи пристрою після заходу сонця і тоді на ділянці ввечері ще довго буде красиво. За умовчанням встановлено час 1 годину.

Рівень вологості грунту встановлюється повзунковим змінним резистором R10.

Установка режиму роботи пристрою проводиться таким чином:
1. Натискаємо кнопку SW1 і утримуємо поки усі світлодіоди почнуть моргати, показуючи, що пристрій перейшло в режим настройки.
2. Відпускаємо кнопку SW1 і виставляємо значення вологості і освітленості.
3. Коротко натискаємо SW1. Всі світлодіоди моргнули. Пристрій перейшло в штатний режим.

Автоматичний полив. Агросфетофор може виконувати роль контролера автоматичного поливу. Для цього перед прошивкою необхідно розкоментувати визначення
// # define AUTO_POLIV
Тоді в момент спрацьовування червоного світлодіода на виведення PB2 виставиться логічна одиниця. Цим сигналом можна буде включити помпу або кран. Одиниця зніметься на рівні між жовтим і червоним.

Нижче приведена електрична схема, монтажна схема, файли друкованої плати, яку можна виготовити за технологією ЛУТ або замовити на виробництві. Файли проекту, виконані в KiCAD, можна скачати в розділі документація.

У скетчі ви можете знайти всі коментарі і легко адаптувати пристрій для ваших потреб.

Технічні характеристики

Напруга живлення, В 3 ... 5 Струм, мА 30

Електрична схема

Електрична схема

Монтажна схема

Монтажна схема

Друкована плата

Плату ви можете купити окремо.

#include <avr / eeprom.h> // Attiny24a // позначення висновків // PORTA #define GREEN_LED 5 #define YELLOW_LED 6 #define RED_LED 4 #define SENSOR_EN 1 // PORTB #define KEY 0 #define WATER_CTRL 1 // канали АЦП #define HUM_SET (~ ((1 << MUX0) | (1 << MUX1) | (1 << MUX2) | (1 << MUX3) | (1 << MUX4) | (1 << MUX5))) # define LIGHT_SET ((1 << MUX0) | (1 << MUX1)) #define HUM_SENSOR (1 << MUX1) #define LIGHT_SENSOR ((1 << MUX0) | (1 << MUX1) | (1 << MUX2) ) #define NORM_LIGHT_DEFAULT 70 // нормальний рівень освітленості за замовчуванням #define NORM_HUM_DEFAULT 140 // нормальний рівень вологості за замовчуванням #define GREEN_NORMAL_MAX 220 // відмітка поливу за замовчуванням #define THRESHOLD 20 #define WORK_AFTER_DAYLIGHT ((long) 14400) // час роботи пристрою після зменшення // рівня освітленості нижче нормального // 1 з дорівнює 4 одиницям // для настройки поставте 4 #define LED_ON_TIME 1 // відповідає 250 мс #define LED_OFF_TIME 12 // відповідає 3 з #define LED_BLINK_PERIOD (LED_ON_TIME + LED_OFF_TIME) #define HUM_SET_ADR 64 // адреса в пам'яті для зберігання налаштувань нормального уровеня вологості #define LIGHT_SET_ADR (HUM_SET_ADR + 1) // адреса в пам'яті для зберігання налаштувань нормального уровеня освітленості // якщо використовується автополив, розкоментуйте наступний рядок // # define AUTO_POLIV volatile boolean KEY_PRESS_FLAG = false; static boolean DAY_LIGHT_FLAG = false; static byte DayLight; static byte NormalHumidity; static byte YELLOW_LINE; static long DayLightCnt = 0; static boolean DayLightCntStart = false; static byte LedOnCnt = 0; void setup () {// настройка ліній введення / виведення DDRA = (1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED) | (1 << SENSOR_EN); PORTA & = ~ ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED) | (1 << SENSOR_EN)); DDRB = 1 << WATER_CTRL; PORTB & = ~ (1 << WATER_CTRL); PORTB | = 1 << KEY; // настройка АЦП ADMUX = LIGHT_SENSOR; ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); ADCSRB = (1 << ADLAR); ACSR = (1 << ACD); DIDR0 | = (1 << ADC0D) | (1 << ADC2D) | (1 << ADC3D) | (1 << ADC7D); ADCSRA | = (1 << ADSC); while (ADCSRA & (1 << ADSC)); // читання налаштувань вологості NormalHumidity = eeprom_read_byte ((uint8_t *) HUM_SET_ADR); if (NormalHumidity == 0xFF) NormalHumidity = NORM_HUM_DEFAULT; // читання налаштувань освітленості DayLight = eeprom_read_byte ((uint8_t *) LIGHT_SET_ADR); if (DayLight == 0xFF) DayLight = NORM_LIGHT_DEFAULT; // обчислення нижньої межі жовтої зони YELLOW_LINE = (NormalHumidity / 3) * 2; // настройка переривань PCMSK1 | = 1 << PCINT8; GIMSK | = 0x20; SREG | = 0x80; } // ----------------------------------------------- ------- void loop () {// вимір освітленості ADMUX & = HUM_SET; ADMUX | = LIGHT_SENSOR; ADCSRA | = (1 << ADSC); while (ADCSRA & (1 << ADSC)); unsigned int LightLevel = ADCH * 7; if (LightLevel> = DayLight) // якщо освітленість більше або дорівнює заданої {DAY_LIGHT_FLAG = true; // "світле" час доби if (DayLightCntStart) // якщо виставлений прапор "темного" часу доби {DayLightCntStart = false; // скидання прапора} if (DayLightCnt> 0) DayLightCnt = 0; } Else if (! DayLightCntStart) // інакше, якщо прапор "темного" часу доби скинутий {DAY_LIGHT_FLAG = true; // "світле" час доби DayLightCnt ++; // збільшення значення відліку "темного" часу доби if (DayLightCnt> WORK_AFTER_DAYLIGHT) // якщо значення відліку "темного" часу доби більше заданого {PORTA & = ~ ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED)); DayLightCntStart = true; // виставлення прапора "темного" часу доби DAY_LIGHT_FLAG = false; // скидання прапора "світлого" часу доби DayLightCnt = 0; }} If ((LedOnCnt <LED_ON_TIME) && (DAY_LIGHT_FLAG)) // якщо "світле" час доби {PORTA | = 1 << SENSOR_EN; // включення датчика вологості // вимір вологості ADMUX & = HUM_SET; ADMUX | = HUM_SENSOR; ADCSRA | = (1 << ADSC); while (ADCSRA & (1 << ADSC)); if (ADCH> THRESHOLD) {#ifdef AUTO_POLIV // якщо обраний автополив if (ADCH <NormalHumidity) // якщо вологість менше нормальної {PORTB | = 1 << WATER_CTRL; // включення поливу // обчислення позначки, до якої поливаємо: нормальна вологість + нормальна вологість / 4 unsigned int GREEN_NORMAL = NormalHumidity + NormalHumidity / 4; if (GREEN_NORMAL> GREEN_NORMAL_MAX) GREEN_NORMAL = GREEN_NORMAL_MAX; // поки не включений зелений світлодіод, тобто поки вологість не досягнула значення GREEN_NORMAL while ((PINA & (1 << GREEN_LED)) == 0) {// вимір вологості ADCSRA | = (1 << ADSC); while (ADCSRA & (1 << ADSC)); if ((ADCH <YELLOW_LINE) && (((PINA & (1 << RED_LED)) == 0))) // якщо менше нижньої межі жовтої зони {PORTA & = ~ ((1 << GREEN_LED) | (1 < <YELLOW_LED) | (1 << RED_LED)); PORTA | = (1 << RED_LED); // включення червоного світлодіода} else if ((ADCH <GREEN_NORMAL) && (((PINA & (1 << YELLOW_LED)) == 0))) // якщо менше значення GREEN_NORMAL {PORTA & = ~ ((1 << GREEN_LED ) | (1 << YELLOW_LED) | (1 << RED_LED)); PORTA | = (1 << YELLOW_LED); // включення жовтого світлодіода} else // інакше {PORTA & = ~ ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED)); PORTA | = (1 << GREEN_LED); // включення зеленого світлодіода}}} #else // якщо без автополива if ((ADCH <YELLOW_LINE) && (((PINA & (1 << RED_LED)) == 0))) // якщо менше нижньої межі жовтої зони { PORTA & = ~ ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED)); PORTA | = (1 << RED_LED); // включення червоного світлодіода delay (250); PORTA & = ~ (1 << RED_LED); delay (250); PORTA | = (1 << RED_LED); } Else if ((ADCH <NormalHumidity) && (((PINA & (1 << YELLOW_LED)) == 0))) // якщо менше значення нормальної вологості NormalHumidity {PORTA & = ~ ((1 << GREEN_LED) | ( 1 << YELLOW_LED) | (1 << RED_LED)); PORTA | = (1 << YELLOW_LED); // включення жовтого світлодіода} #endif else if ((PINA & (1 << GREEN_LED)) == 0) // інакше {PORTA & = ~ ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED)); PORTA | = (1 << GREEN_LED); // включення зеленого світлодіода}} else if ((ADCH <= THRESHOLD) && (((PINA & (1 << RED_LED)) == 0))) {PORTA & = ~ ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED)); PORTA | = (1 << RED_LED); delay (250); PORTA & = ~ (1 << RED_LED); delay (250); PORTA | = (1 << RED_LED); } PORTA & = ~ (1 << SENSOR_EN); // вимикання датчика вологості DAY_LIGHT_FLAG = false; LedOnCnt ++; } Else if (LedOnCnt> = LED_ON_TIME) {if ((PINA & ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED)))! = 0) {PORTA & = ~ ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED)); } LedOnCnt ++; if (LedOnCnt == LED_BLINK_PERIOD) LedOnCnt = 0; } If (KEY_PRESS_FLAG) // якщо натиснута кнопка {PCMSK1 & = ~ (1 << PCINT8); // деактивация переривання після натискання кнопки delay (70); // затримка if (((PINB >> KEY) & 1) == 0) // якщо кнопка натиснута {while (((PINB >> KEY) & 1) == 0) // поки кнопка натиснута {PORTA | = (1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED); // включення всіх світлодіодів delay (300); // затримка PORTA & = ~ ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED)); // вимикання всіх світлодіодів delay (300); // затримка} while (((PINB >> KEY) & 1) == 1); // поки кнопка не було натиснуто // вимір налаштувань вологості ADMUX & = HUM_SET; ADCSRA | = (1 << ADSC); while (ADCSRA & (1 << ADSC)); NormalHumidity = ADCH; if (NormalHumidity> = GREEN_NORMAL_MAX) NormalHumidity - = 40; eeprom_write_byte ((uint8_t *) HUM_SET_ADR, NormalHumidity); // збереження нормальної вологості в пам'яті YELLOW_LINE = (NormalHumidity / 3) * 2; // обчислення нижньої межі жовтої зони // вимір налаштувань освітленості ADMUX & = HUM_SET; ADMUX | = LIGHT_SET; ADCSRA | = (1 << ADSC); while (ADCSRA & (1 << ADSC)); unsigned int DayLightVal = ADCH * 7; if (DayLightVal> = 0xFF) DayLightVal = 0xFE; DayLight = DayLightVal; eeprom_write_byte ((uint8_t *) LIGHT_SET_ADR, DayLight); // збереження освітленості в пам'яті} // включення всіх світлодіодів PORTA | = (1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED); delay (1000); // затримка PORTA & = ~ ((1 << GREEN_LED) | (1 << YELLOW_LED) | (1 << RED_LED)); // вимикання всіх світлодіодів PCMSK1 | = 1 << PCINT8; // активація переривання після натискання кнопки KEY_PRESS_FLAG = false; } Delay (250); } // ----------------------------------------------- ----------- // обробник переривання після натискання на кнопку ISR (PCINT1_vect) {if (((PINB >> KEY) & 1) == 0) KEY_PRESS_FLAG = true; } // ----------------------------------------------- -----------

Красиво?
А ввечері?
© 2008 — 2012 offroad.net.ua . All rights reserved. by nucleart.net 2008