Загорелся идеей создать устройство, которое бы управляло LED лентами при открытии дверцы шкафа. Причём нужно их в офис около 10 штук. Слышу, как кто-то уже советует не заниматься ерундой и поставить стандартный модуль ПИР датчика. Но проблема в том, что в комнате он работает отлично. А когда попробовал такой ПИР установить в шкафу , работа стала нестабильная.
Схема ИК датчика включения света на ATTINY
После недолгих размышлений над схемой и экспериментов , сделал работающее устройство, основанное на готовом приемнике инфракрасного сигнала TSOP4836. Но можно и фототранзистор LTR4206E поставить.
Аппаратная часть , стабилизатор LM78L05 с диодом 1N4148 (защита от неправильной полярности подключения), исполнительный элемент МОП-транзистор с N-каналом, управляемый уровнями TTL. ИК светодиод передатчика подключенный непосредственно к микроконтроллеру, резистор ограничивает ток до 20 мА. Микроконтроллер ATTINY13A (выбор диктуется ценой и доступностью).
Принцип действия устройства
МК сначала измеряет напряжение на фототранзисторе при выключенном ИК диоде, затем с включенным. Первое измерение является проверкой влияния фона, пока свет от ИК светодиодов не отразится от предмета, оба измерения буду идентичны, в противном случае второй замер будет меньше. Ещё применил что-то вроде гистерезиса, после включения выхода чувствительность измерения увеличивается (переменная „his”).
Прошивка микроконтроллера
#include <,avr\io.h>, #include <,inttypes.h>, #include <,avr/sleep.h>, #include <,avr/interrupt.h>, #include <,avr/power.h>,
//Definicje numerow portow #define LED 1 #define MOSFET 4 //ADC PB2 ADC1
//Deklaracja stalych #define HIS_ON 3, #define HIS_OFF 2,
int main(void) { uint8_t odczyt1, //Odczyt ADC bez wlaczonej LED_IR uint8_t odczyt2, //Odczyt ADC przy wlaczonej LED_IR uint8_t licz = 0, uint8_t his = HIS_OFF, //Zmienna histerezy
//Konfiguracja portow DDRB = 1<,<,LED | 1<,<,MOSFET | 1<,<,LED, //wyjscie LED IR, wyjscie MOSFET PORTB = 1<,<,3 | 1<,<,0 | 1<,<,LED, //PULL_UP PB3 i PB0 dla oczednosci energi
//Inicjacja ADC ADMUX = 1<,<,ADLAR | 1<,<,MUX0, //Napiecie referencyjne Vcc, PB2(ADC1) DIDR0 = ADC1D, //Wylaczenie bufora cyfrowego PB2(ADC1) power_timer0_disable(), //Calkowite wylaczenie TIMER0 sei(), //Globalne zalaczenie przerwan
for(,,) { ADCSRA = 1<,<,ADEN | 1<,<,ADSC, //Wlaczamy ADC i zaczynamy pomiar while(ADCSRA & (1<,<,ADSC)), //Czekamy na pomiar odczyt1 = ADCH, //Odczyt ppomiaru bez wlaczonej LED IR odczyt1 = odczyt1 , his, PORTB &= ~(1<,<,LED), //LED IR on ADCSRA |= 1<,<,ADSC, //ADC on while(ADCSRA & (1<,<,ADSC)), //Czekamy na pomiar odczyt2 = ADCH, //Odczyt pomiaru z wlaczon PORTB |= 1<,<,LED, //LED IR off ADCSRA &= ~((1<,<,ADEN) | (1<,<,ADSC)), //ADC off
if(odczyt2 <, odczyt1) { if(licz <, 10) { licz++, } else {
PORTB &= ~(1<,<,MOSFET), //MOSFET off his = HIS_OFF, } } else { if(licz>,0) { licz,, } else { PORTB |= 1<,<,MOSFET, //MOSFET on his = HIS_ON, } }
WDTCR = 1<,<,WDTIE, //Wlaczenie przerwania od WDT, czas 16ms sleep_enable(), //Przestawienie bitu SE sleep_cpu(), //Wprowadznie w stan snu
} return 0, }
ISR(WDT_vect) //Przerwanie od WDT { sleep_disable(), //Przestawienie bitu SE WDTCR = 0, //Wylaczenie przerwania od WDT }
Печатная плата спроектирована и изготовлена под монтаж SMD. Контакты для программирования вывел на штырьки. Корпус маленький из пластика.
Усилитель Холтон на MOSFET с индикатором уровня
Есть возможность увеличения дальности за счет уменьшения сопротивления резистора R2. Таймер T0 выключен и не используется, его можно использовать для генерации ШИМ и постепенного повышения и уменьшения яркости освещения. Можно было бы применить МК ATTINY10 (6 ног), резисторы и конденсаторы тоже в небольших корпусах, что позволило бы снизить размер до совсем миниатюрного.