Мой акустический отпугиватель воробьев на STM8

В один из дней начала июля мы заметили, что на нашу плантацию пшеницы покусились пернатые вредители - воробьи. Урожай нужно было срочно спасать! И я сделал простой акустический отпугиватель:
акустический отпугиватель птиц

Отпугиватель состоит из сирены, управляемой микроконтроллером STM8S103F3P6, причем питается устройство от солнечной батареи:
схема отпугивателя птиц

Высокий уровень на выходе С3 микроконтроллера открывает MOSFET T1, что обеспечивает подачу напряжения питания на сирену SP1.
Резистор R1 ограничивает ток выхода C3 микроконтроллера, резистор R2 обеспечивает стекание заряда с затвора транзистора T1 на "землю", резистор R3 ограничивает ток нагрузки транзистора T1.

Солнечная батарея SC1 имеет следующие номинальные параметры: 1 Вт/6 В/150 мА. Конденсатор C1 сглаживает изменения напряжения, вырабатываемого солнечной батареей.

Сирена включается на 5 секунд через каждые две минуты, причем работоспособность сохраняется и в облачную погоду (в июльский день интервал работы - примерно от 8 до 18 часов). При номинальном напряжении питания 12 В уровень звукового давления, создаваемый сиреной, составляет 120 dB (напряжение, вырабатываемое солнечной батареей, ниже, поэтому громкость звука сирены тоже заметно ниже и является вполне приемлемой для людей, находящихся на расстоянии нескольких метров).

Программный код для микроконтроллера:

#include <stm8s.h>

//beep delay
static void delay_1(void)
{
    uint32_t wait;
    wait = 10600UL;
    while(wait--) {
    }
}

//pause delay
static void delay_0(void)
{
    uint32_t wait;
    wait = 253200UL;
    while(wait--) {
    }
}

int main(void)
{
    //siren pin init
    GPIOC->DDR |= (1 << 3);
    GPIOC->CR1 |= (1 << 3);
    GPIOC->ODR &= ~(1 << 3);
    disableInterrupts();//disable interrupts
    //low power
    CLK->CKDIVR=7;//clock divider 128
    UART1->CR1 = UART1_CR1_UARTD;
    CLK->PCKENR1 &= ~(CLK_PCKENR1_SPI);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_I2C);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_UART1);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_UART2);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_UART3);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_TIM1);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_TIM2);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_TIM3);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_TIM4);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_TIM5);
    CLK->PCKENR1 &= ~(CLK_PCKENR1_TIM6);
    CLK->PCKENR2 &= ~(CLK_PCKENR2_ADC);
    CLK->PCKENR2 &= ~(CLK_PCKENR2_CAN);
    CLK->PCKENR2 &= ~(CLK_PCKENR2_AWU);
    //leb blinking
    GPIOB->DDR |= (1 << 5);
    GPIOB->ODR &= ~(1 << 5);
    delay_1();
    GPIOB->ODR |= (1 << 5);
    delay_1();
    GPIOB->ODR &= ~(1 << 5);
    delay_1();
    GPIOB->ODR |= (1 << 5);
    
    while(1)
    {
        //pause
        GPIOB->ODR |= (1 << 5);
        GPIOC->ODR &= ~(1 << 3);
        delay_0();
        //beep
        GPIOB->ODR &= ~(1 << 5);
        GPIOC->ODR |= (1 << 3);
        delay_1();
    }
}

Акустический отпугиватель в действии:

Яндекс.Метрика