Умная поливалка цветка на микроконтроллере Attiny13A

imageДоброго времени суток хабралюди! Иногда в жизни есть моменты, когда хочется сделать, что-то своими руками. Программирование и электроника, это очень весёлый способ провести время, а система полива цветка, может быть даже принесет пользу. Я постарался сделать все просто, и детально объяснить каждый этап. Надеюсь это будет полезно, и увлекательно как для читателей, так и для тех, кто решит побаловать себя, и сделать что-то подобное.Предлагаю Вашему вниманию устройство для автоматического полива цветов на базе микроконтроллера Attiny13a, подробности под катом.Начнем с технического задания: Сделаем устройство, которое сможет поливать комнатные растения без участия человека в течении минимум 5 дней. Устройство должно учитывать влажность грунта. Стоимость устройства не должна превышать 1000р. Подбор элементной базы: я его слепила из того, что было

Выбор микроконтроллера был очевиден, у меня был Attiny13А, его и взял, у него 1Кб памяти под программу, ну да ладно, этого хватит. Достался мне он за 115р, в розничном магазине радиоэлектроники.

Attiny13А даташит

0d313018a04045b5a2aed1f75102b399.jpg

Рисунок 1 (микроконтроллер Attiny13А)

Микроконтроллер, содержит основную логику работы.

Для аналогового датчика: Пауза между поливами 3 часа, если сигнал с датчика влажности снижается (до 2В или даже 1 В), длительность перерыва уменьшается, минимальный перерыв 1час. Цикл полива 6–12 секунд, первые 6 сек полив будет в любом случае, далее при превышении сигнала с датчика влажности 3В полив прекращается, либо длиться 12 секунд, если влажность не достигнута. При нажатии на кнопку (reset), происходит полив прямо сейчас.

Для датчика с компаратором (высокого сигнала при низкой влажности): Пауза между поливами 3 часа, если сигнал с датчика влажности выше 3В, длительность перерыва уменьшается, минимальный перерыв 1час. Цикл полива 6–12 секунд, первые 6 сек полив будет в любом случае, далее при уменьшении сигнала с датчика влажности меньше 3В полив прекращается, либо длиться 12 секунд, если влажность не достигнута. При нажатии на кнопку (reset), происходит полив прямо сейчас.

ULN2003А1d9e49d986d44d7cb43372ba1ec019ad.jpg

Рисунок 2 (микросхема ULN2003А)Сборка транзисторов Дарлингтона, нужна для того, чтобы управлять реле и мигать светодиодом. На контроллере ток с ножек очень маленький, 20 мА может даже меньше, а реле нужно 100 мА, и защиту от индуктивной нагрузки диодом с этой схемкой делать ненужно, т.к. внутри уже всё предусмотрено. Купил за 20р

Датчик влажности почвы (питание 5В, выход пороговый), 150р

1364134dd2f54b259a48c179f3d95f66.jpg

Рисунок 3 (датчик влажности почвы с компаратором)

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

Датчик влажности почвы (питание 5В, выход аналоговый), 230р

811c08fd6cba4e319c72722056b3000f.jpg

Рисунок 3_1 (датчик влажности почвы аналоговый)

А этот работает так: выдаёт аналоговый сигнал от маленького при низкой влажности, до большого при высокой (максимум 4,2В при питании 5В, потребление тока 35 мА).

Есть еще и такие, у которых реле от компаратора срабатывает.

Реле с управляющим напряжением 5В 200 мВт, коммутируемый ток DC 5А 12В или больше я использовал вот такое TR99–5VDC-SB-CD. 90р.c48e7ccd43084d459410dd90a27fd333.jpg

Рисунок 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-е, ну и аккумулятор все равно понадобиться

d988361f4171499eb4e9bc085410b83e.jpg

Рисунок 5 (Зарядное устройство для литиевых аккумуляторных батареек 1A)

Кнопка, при нажатии будет происходить экстренный полив.b460a10614dc47bca5549f7c057e1b8c.jpg

Рисунок 6 (кнопка)

Диод для защиты от неправильного включения (необязательно)Конденсаторы по вкусу (3300 мкФ для работы от батарейки мобильника чтобы при включени моторчика просадка его не перезагружала, 0,1–200 мкФ параллельно с каждым потребителем для гашения помех)

Резисторы (10к для поддяжки к питанию Ресета, 0,2к-0,3к токоограничивабщий для светодиода)

Насос омывателя стекла для ВАЗ (самый дешёвый, вместе с трубочкой, палочка и хомутики для крепления трубочки, ёмкость для воды). Тут есть один важный момент, перед тем, как его бросать в воду, нужно все дырочки, через которые вода может добраться до мотрочика или контактов, замазать герметиком, а оставить только те, через которые вода входит и выходит. Можно и так бросить конечно, он даже будет работать, но он дольше прослужит, если загерметизировать.83b6a199ef2d4d30a338371d009df0e2.jpg

Рисунок 7 (насос омывателя ВАЗ в желтом ведёрке с водой)

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

3f7e8d4021b74a11a8fd6802ee5703bf.jpg

Рисунок 8 (макетка)

Для программирования контроллера понадобяться ПО: PonyProg2000, LPT программатор (или другой, какой есть), hex прошивка которая прилагаеться.

Если есть желание подкорректировать исходник, и скомпилировать свой hex, то понадобится ещё компилятор, например CV AVR.

Порядок работ: Для начала нужно подготовить контроллер к программированию, для этого нужно вывести ножки для программирования на программатор, согласно даташиту контроллера и lpt программатора.Вот так:

717ff2ff1d8443948f58c928a6ba1ae1.png

Рисунок 9 (контроллер ножки для программирования)

1da9d0694706425f8aa72d4f14f59ec0.jpg

Рисунок 9_1 (общий вид программатора)

9f1163a7c84b401ca2f683b60793d918.jpg

Рисунок 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; iMIN_WORKSEC) { humidity = read_adc (2)/204; if (humidity>3) { PUMP=0; } } } PUMP=0; flagreset=0; } led_delay = (DELAYSEC — 60)/12; for (i=0; i<(DELAYSEC/12); i++) { humidity = read_adc(2)/204; delay_ms(1000); LED=0; if(i>led_delay) { LED=1; } else { LED=0; } if (humidity<1) { delay_ms(3000); } else if(humidity<2) { delay_ms(5000); } else if(humidity<3) { delay_ms(8000); } else { delay_ms(10000); } delay_ms(150); LED=1; delay_ms(25); LED=0; delay_ms(150); LED=1; delay_ms(50); LED=0; delay_ms(100); if(humidity<2) { LED=1; delay_ms(150); LED=0; } else { delay_ms(550); } } LED=0; PUMP=1; for(i=0; iMIN_WORKSEC) { if (humidity>3) { PUMP=0; } } } PUMP=0; }; } hex для ponyprog2000 :0E00000009C0FECFFDCFFCCFFBCFFACFF9CF6A:10000E00F8CFF7CFF6CFF894EE27ECBBE5BFF8E1CB:10001E00A4B7A77FA4BFF1BDE1BD8DE0A2E0ED9333:10002E008A95E9F780E4A0E6ED938A95E9F7EFE982:10003E00EDBFC0E70DC0E881E7B984E08A95F1F71E:10004E00369A349BFECF349AE4B1F5B121960895D9:10005E002497E0E0E883E983EA83EB83AFD020E0E6:10006E0030E040E050E0E4B7E23011F441E050E01F:10007E00E0E0E4BFE0E8E6BDE3E0E6BDE0E0E8BBDB:10008E00E3E0E7BBE0E0EFBDE3BFE2BFE6BFE9BD03:10009E00EBBFE5BFE4E0E9BFE0E8E8B9E0E0E3B9D3:1000AE00E4B3E370E4BBE4B3E4BBE0E0E7B9E1EA58:1000BE00E6B9E3B1E87FE3B97894C098C19AE8E86D:1000CE00F3E17FD0C198E1E0F0E0E417F507C1F469:1000DE00C09A74D00C30E0E01E077CF475D0073067:1000EE00E0E01E073CF073D07FD080D009F008F41A:1000FE0001C0C0980F5F1F4FEDCFC09840E050E099:10010E002FE733E05BD00438E3E01E07F4F55FD051:10011E005BD0C1982017310714F4C19A01C0C19861:10012E0063D0E0E0F0E060E87FE3BED018F4E8EBE7:10013E00FBE00DC061D018F4E8E8F3E108C054D03C:10014E0055D018F4E0E4FFE102C0E0E1F7E2FA93E3:10015E00EA935CD058D0C19AE9E1F0E032D0C19870:10016E0052D0C19AE2E3F0E02CD0C198E4E6F0E080:10017E0028D042D020F4C19A46D0C19803C0E6E2FE:10018E00F2E01FD00F5F1F4FBECFC198C09A16D09E:10019E000C30E0E01E077CF41AD016D00730E0E0F9:1001AE001E0734F021D022D009F008F401C0C09807:1001BE000F5F1F4FEDCFC09880CFFFCF00E010E054:1001CE000895FA93EA9322C0E8EEF3E0FACFE2E064:1001DE00EA9331DFAE2FBF2FECECF0E092D0662722:1001EE00772734D0A8D00895A1D00895E0E0F0E0AC:1001FE0060E470E459D00895F7DFE0E0F0E060E0ED:10020E0070E452D00895E6E9F0E0DBCFE991F99180:10021E00309639F08CE291E00197F1F7A89531977D:10022E00C9F7089550E8572711F45F932BC05F3F2D:10023E0031F0660F000C57956795752F08955F93F3:10024E0000200AF02BC024C0689401C0E8943097B7:10025E0060407040B1F0002426F0772312F4009431:10026E0043D0172E7EE1112032F07A95EE0FFF1F4C:10027E00661F111CF9CFEF2FF62F612D5F93D2DF82:10028E005F910895EE27FF27662777275F910895E0:10029E00EFEFFFEF6FE77FEF5F910895EFEFFFEF67:1002AE006FE77FE75F91089599239AF0772342F0E5:1002BE00971748F029F4AE17BF07860720F031F0E4:1002CE00989488940895989408940895189488940E:1002DE0008957723C2F7971798F3A9F7EA17FB0744:1002EE00680788F399F3ECCFF09560957095E195DA:1002FE00FF4F6F4F7F4F08956F2F660F660B762F50:10030E0008950024112490E1AA0FBB1F001C111C9C:10031E000E1A1F0A18F40E0E1F1E01C0A1609A9528:10032E0099F7EA2FFB2FA02DB12D0895A881B98141:10033E008A819B810895E883F9836A837B8308957C:00000001FF

Затем можно собрать схему поливалки, конденсаторы на схеме не указаны, они ставяться рядом с потребителями между землей и питанием:

48b27b1de05b4c2fa3862445d0f9b003.jpg

Рисунок11 (схема в протеусе)

Ну вот как-то так:)

0b03b7643f934992bb8e9404159cef4c.jpg

© Habrahabr.ru