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

в 9:55, , рубрики: attiny13, attiny13a, автополив

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

Начнем с технического задания:

  • Сделаем устройство, которое сможет поливать комнатные растения без участия человека в течении минимум 5 дней.
  • Устройство должно учитывать влажность грунта.
  • Стоимость устройства не должна превышать 1000р.

Подбор элементной базы:

я его слепила из того, что было

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

Attiny13А даташит

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

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

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

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

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


ULN2003А

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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


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

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

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


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

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

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

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

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


Порядок работ:

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

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

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

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

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

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

Рисунок 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

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

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

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

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

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

Автор: leonid_niko

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js