Автоматическое включение света ИК датчиком приближения


Загорелся идеей создать устройство, которое бы управляло LED лентами при открытии дверцы шкафа. Причём нужно их в офис около 10 штук. Слышу, как кто-то уже советует не заниматься ерундой и поставить стандартный модуль ПИР датчика. Но проблема в том, что в комнате он работает отлично. А когда попробовал такой ПИР установить в шкафу — работа стала нестабильная.

Схема ИК датчика включения света на ATTINY

Схема принципиальная ИК датчика на 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. Контакты для программирования вывел на штырьки. Корпус маленький из пластика.

Полезное:  Схема для обнаружения нуля в сети 220В
Плата и детали ИК датчика включения света на МК

Есть возможность увеличения дальности за счет уменьшения сопротивления резистора R2. Таймер T0 выключен и не используется, его можно использовать для генерации ШИМ и постепенного повышения и уменьшения яркости освещения. Можно было бы применить МК ATTINY10 (6 ног), резисторы и конденсаторы тоже в небольших корпусах, что позволило бы снизить размер до совсем миниатюрного.



Оцените: (3 - 5,00 из 5)
Загрузка...

НАЖМИТЕ ТУТ И ОТКРОЙТЕ КОММЕНТАРИИ