Как стать автором
Обновить

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

Время на прочтение7 мин
Количество просмотров88K
image

Доброго времени суток, хабрапользователи. Иногда в жизни есть моменты, когда хочется сделать что-то своими руками. Программирование и электроника — это очень весёлый способ провести время, а система полива цветка может быть даже принесет пользу. Я постарался сделать все просто и детально объяснить каждый этап. Надеюсь, это будет полезно и увлекательно как для читателей, так и для тех, кто решит побаловать себя, и сделать что-то подобное.

Предлагаю вашему вниманию устройство для автоматического полива цветов на базе микроконтроллера 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 <tiny13a.h>

#include <delay.h>

#define PUMP PORTB.0           //Выход на насос
#define LED PORTB.1              //Выход на светодиод 
#define MIN_WORKSEC 6       //Минимальное время полива в секундах 
#define WORKSEC 12              //Максимальное время полива в секундах
#define DELAYSEC 10800      //Максимальное время Паузы между поливами в секундах

#define ADC_VREF_TYPE 0x00

// 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|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
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==0x02)
{
    flagreset=1;
}
MCUSR = 0x00;
// Crystal Oscillator division factor: 8
#pragma optsize-
CLKPR=0x80;
CLKPR=0x03;
#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=0x00;
DDRB=0x03;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x04;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// 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&=0x03;
DIDR0|=0x00;
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<WORKSEC; i++)
            {
                delay_ms(1000); 
                if(i>MIN_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; i<WORKSEC; i++)
         {
            humidity = read_adc(2)/204;
            delay_ms(1000);                 
            if(i>MIN_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



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



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

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

Теги:
Хабы:
Всего голосов 50: ↑42 и ↓8+34
Комментарии52

Публикации

Истории

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань