Умная поливалка цветка на микроконтроллере Attiny13A
Доброго времени суток хабралюди! Иногда в жизни есть моменты, когда хочется сделать, что-то своими руками. Программирование и электроника, это очень весёлый способ провести время, а система полива цветка, может быть даже принесет пользу. Я постарался сделать все просто, и детально объяснить каждый этап. Надеюсь это будет полезно, и увлекательно как для читателей, так и для тех, кто решит побаловать себя, и сделать что-то подобное.Предлагаю Вашему вниманию устройство для автоматического полива цветов на базе микроконтроллера Attiny13a, подробности под катом.Начнем с технического задания: Сделаем устройство, которое сможет поливать комнатные растения без участия человека в течении минимум 5 дней. Устройство должно учитывать влажность грунта. Стоимость устройства не должна превышать 1000р. Подбор элементной базы: я его слепила из того, что было
Выбор микроконтроллера был очевиден, у меня был Attiny13А, его и взял, у него 1Кб памяти под программу, ну да ладно, этого хватит. Достался мне он за 115р, в розничном магазине радиоэлектроники.
Attiny13А даташит
Рисунок 1 (микроконтроллер Attiny13А)
Микроконтроллер, содержит основную логику работы.
Для аналогового датчика: Пауза между поливами 3 часа, если сигнал с датчика влажности снижается (до 2В или даже 1 В), длительность перерыва уменьшается, минимальный перерыв 1час. Цикл полива 6–12 секунд, первые 6 сек полив будет в любом случае, далее при превышении сигнала с датчика влажности 3В полив прекращается, либо длиться 12 секунд, если влажность не достигнута. При нажатии на кнопку (reset), происходит полив прямо сейчас.
Для датчика с компаратором (высокого сигнала при низкой влажности): Пауза между поливами 3 часа, если сигнал с датчика влажности выше 3В, длительность перерыва уменьшается, минимальный перерыв 1час. Цикл полива 6–12 секунд, первые 6 сек полив будет в любом случае, далее при уменьшении сигнала с датчика влажности меньше 3В полив прекращается, либо длиться 12 секунд, если влажность не достигнута. При нажатии на кнопку (reset), происходит полив прямо сейчас.
ULN2003А
Рисунок 2 (микросхема ULN2003А)Сборка транзисторов Дарлингтона, нужна для того, чтобы управлять реле и мигать светодиодом. На контроллере ток с ножек очень маленький, 20 мА может даже меньше, а реле нужно 100 мА, и защиту от индуктивной нагрузки диодом с этой схемкой делать ненужно, т.к. внутри уже всё предусмотрено. Купил за 20р
Датчик влажности почвы (питание 5В, выход пороговый), 150р
Рисунок 3 (датчик влажности почвы с компаратором)
Работает он так: подкручиваем резисор, настраеваем на нужную влажность.Если влажность выше порога, он выдает низкий уровень, если ниже, то высокий.
Датчик влажности почвы (питание 5В, выход аналоговый), 230р
Рисунок 3_1 (датчик влажности почвы аналоговый)
А этот работает так: выдаёт аналоговый сигнал от маленького при низкой влажности, до большого при высокой (максимум 4,2В при питании 5В, потребление тока 35 мА).
Есть еще и такие, у которых реле от компаратора срабатывает.
Реле с управляющим напряжением 5В 200 мВт, коммутируемый ток DC 5А 12В или больше я использовал вот такое TR99–5VDC-SB-CD. 90р.
Рисунок 4 (реле TR99–5VDC-SB-CD)
(DC-DC 6–36В/5В 2000 мА и блок питания на 12В 5А) или батарейка от телефона 4.2В с постоянно включенной зарядкой. Для питания я использовал телефон Филипс х100, у которого разбился экран, для его зарядки подходит провод usb — miniusb. это самый дорогой элемент телефон стоил 1200р новый, но т.к. из него нужно только функция зарядки, то можно купить на рынке сильно б/у за 300р
Будет осторожны, контроллер и насос могут разрядить батарейку до 3В, телефон при 3.2В и ниже будет думать, что батарейка мертва, и телефон перестанет её заряжать.Вместо телефона можно подключить контроллер зарядки, с ним разряд не страшен, он заряжает даже аккумулятор разряженный в 0. стоит такая штука 59р на dx-е, ну и аккумулятор все равно понадобиться
Рисунок 5 (Зарядное устройство для литиевых аккумуляторных батареек 1A)
Кнопка, при нажатии будет происходить экстренный полив.
Рисунок 6 (кнопка)
Диод для защиты от неправильного включения (необязательно)Конденсаторы по вкусу (3300 мкФ для работы от батарейки мобильника чтобы при включени моторчика просадка его не перезагружала, 0,1–200 мкФ параллельно с каждым потребителем для гашения помех)
Резисторы (10к для поддяжки к питанию Ресета, 0,2к-0,3к токоограничивабщий для светодиода)
Насос омывателя стекла для ВАЗ (самый дешёвый, вместе с трубочкой, палочка и хомутики для крепления трубочки, ёмкость для воды). Тут есть один важный момент, перед тем, как его бросать в воду, нужно все дырочки, через которые вода может добраться до мотрочика или контактов, замазать герметиком, а оставить только те, через которые вода входит и выходит. Можно и так бросить конечно, он даже будет работать, но он дольше прослужит, если загерметизировать.
Рисунок 7 (насос омывателя ВАЗ в желтом ведёрке с водой)
Плата макетная, или с готовыми дорожками и дырочками под детальки. Если кто-нибудь нарисует плату, и приложит в комментариях, это будет здорово, я использовал макетку.
Рисунок 8 (макетка)
Для программирования контроллера понадобяться ПО: PonyProg2000, LPT программатор (или другой, какой есть), hex прошивка которая прилагаеться.
Если есть желание подкорректировать исходник, и скомпилировать свой hex, то понадобится ещё компилятор, например CV AVR.
Порядок работ: Для начала нужно подготовить контроллер к программированию, для этого нужно вывести ножки для программирования на программатор, согласно даташиту контроллера и lpt программатора.Вот так:
Рисунок 9 (контроллер ножки для программирования)
Рисунок 9_1 (общий вид программатора)
Рисунок 10 (lpt программатор)
Программа для контроллера на С (вариант с аналоговым датчиком влажности 0–5В)
#define F_CPU 1200000UL
#include
#include
#define PUMP PORTB.0 //Выход на насос #define LED PORTB.1 //Выход на светодиод #define MIN_WORKSEC 6 //Минимальное время полива в секундах #define WORKSEC 12 //Максимальное время полива в секундах #define DELAYSEC 10800 //Максимальное время Паузы между поливами в секундах
#define ADC_VREF_TYPE 0×00
// Read the AD conversion result unsigned int read_adc (unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us (10); // Start the AD conversion ADCSRA|=0×40; // Wait for the AD conversion to complete while ((ADCSRA & 0×10)==0); ADCSRA|=0×10; return ADCW; }
// Declare your global variables here
void main (void) { // Declare your local variables here int i=0, led_delay=0; float humidity=0; unsigned int flagreset=0; if (MCUSR==0×02) { flagreset=1; } MCUSR = 0×00; // Crystal Oscillator division factor: 8 #pragma optsize- CLKPR=0×80; CLKPR=0×03; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif
// Input/Output Ports initialization // Port B initialization // Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out // State5=T State4=T State3=T State2=T State1=0 State0=0 PORTB=0×00; DDRB=0×03;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0×00; TCCR0B=0×00; TCNT0=0×00; OCR0A=0×00; OCR0B=0×00;
// External Interrupt (s) initialization // INT0: Off // Interrupt on any change on pins PCINT0–5: Off GIMSK=0×00; MCUCR=0×00;
// Timer/Counter 0 Interrupt (s) initialization TIMSK0=0×04;
// Analog Comparator initialization // Analog Comparator: Off ACSR=0×80; ADCSRB=0×00;
// ADC initialization // ADC Clock frequency: 75,000 kHz // ADC Bandgap Voltage Reference: Off // ADC Auto Trigger Source: Free Running // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On DIDR0&=0×03; DIDR0|=0×00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0xA1; ADCSRB&=0xF8;
// Global enable interrupts #asm («sei»)
while (1)
{
PUMP=0;
LED=1;
delay_ms (5000);
LED=0;
if (flagreset == 1)
{
PUMP=1;
for (i=0; i
Затем можно собрать схему поливалки, конденсаторы на схеме не указаны, они ставяться рядом с потребителями между землей и питанием:
Рисунок11 (схема в протеусе)
Ну вот как-то так:)