Автомат включения освещения от радио датчиков и проводных датчиков

axill
Offline
Зарегистрирован: 05.09.2011

Есть такие недорогие радио датчики у китайских друзей для сигнализаций. PIR датчики и датчики дверные. Решил их же использовать для автоматизации освещения. Помимо этого есть возможность подключить PIR датчик типа HC-SR50 и внешний герконовый датчик или микропереключатель. Управление светильником двойное - по цепи 220В используя твердотельное реле и по цепи питания светодиодов используя ШИМ и мосфет. Подключать можно один из них либо оба. Для связи с радио датчиками применен вот такого типа приемник

Кроме того еще есть фоторезистор с подстроечником и подстроечник для настройки времени свечения

Получилась вот такая схема:

Для подключения радио датчика (не важно какого - PIR или дверного) используется кнопка. При первом нажатии входим в режим програмирования. светодиод начинает мигать. При получении первого радио сообщения провряется нет ли уже этого кода и если нет, то он запоминается и выходим из режима програмирования. Кол-во датчиков задано в программе сейчас как 6. Все они сохраняются в EEPROM. Из режима програмирования еще одним нажатием можно войти в режим сброса, светодиод начинает быстро моргать, если еще раз нажать кнопку то все устройства забываются

Еще не реализовал подстройку освещенности и времени, применение проводных датчиков. Но там все просто. Было важно отладить радио. Для радио применил RCSwitch библиотеку которая декодирует сообщения от примененных в датчиках микросхем.

#define LIGHT_HALF_OFF_PWM			40		// % частичная яркость
#define LIGHT_TIMEOUT_ON_MIN		10		// время в минутах скоько будет полная яркость после последнего радио сообщения
#define LIGHT_TIMEOUT_HALF_OFF_MIN	2		// время ожидания без событий в частичной яркости

#define LEDPIN		13
#define LIGHTPWM	10
#define LIGHTRELAY	9
#define BUTTONPIN	3
#define NUM_DEVICES	6

#include <avr/eeprom.h>
#include <avr/wdt.h>
#include <RCSwitch.h>

typedef enum {
	status_off=0,		// все выключено
	status_half_off=1,	// яркость в половину
	status_on=2			// полная яркость
} status_enum;

typedef struct {
	uint32_t	id[NUM_DEVICES];
	uint8_t		num;
} radio_devices_struct;

radio_devices_struct radio_devices;
radio_devices_struct eemem_radio_devices EEMEM;

struct {
	status_enum		status;
	uint8_t			light_pwm;
	unsigned long	timer;
} var;

RCSwitch mySwitch = RCSwitch();

void setStatus(int status) {
	switch(var.status) {
		case status_off:
			switch(status) {
				case status_on:
					lightUp();
					break;
				case status_half_off:
				case status_off:
					break;
			}
			break;
		case status_half_off:
			switch(status) {
				case status_off:
					lightDown(0);
					break;
				case status_half_off:
					break;
				case status_on:
					lightUp();
					break;
			}
			break;
		case status_on:
			switch(status) {
				case status_off:
					lightUp();
					break;
				case status_half_off:
					lightDown(LIGHT_HALF_OFF_PWM * 256 / 100);
					break;
				case status_on:
					break;
			}
			break;
	}
	switch(status) {
		case status_off:
			var.timer = 0;
			var.status = status_off;
			break;
		case status_half_off:
			var.timer = millis() + (LIGHT_TIMEOUT_HALF_OFF_MIN * 60 * 1000LL);
			var.status = status_half_off;
			break;
		case status_on:
			var.timer = millis() + (LIGHT_TIMEOUT_ON_MIN * 60 * 1000LL);
			var.status = status_on;
			break;
	}
}

void setup()
{
	// индикаторный светодиод
	pinMode(LEDPIN, OUTPUT);
	// управляющая кнопка
	digitalWrite(BUTTONPIN, HIGH);
	// выход управления яркостью лампы
	pinMode(LIGHTPWM, OUTPUT);
	analogWrite(LIGHTPWM, 0);
	// выход управления реле лампы
	pinMode(LIGHTRELAY, OUTPUT);

	mySwitch.enableReceive(0);

	eeprom_read_block(&radio_devices, &eemem_radio_devices,  sizeof(radio_devices_struct));
	if(radio_devices.num >= NUM_DEVICES) radio_devices.num = 0;
	blinkLED(radio_devices.num, 1000, 500);

	var.status = status_off;
}

void loop()
{
	if(mySwitch.available()) {
		// получено радио сообщение
		int value = mySwitch.getReceivedValue();
		mySwitch.resetAvailable();

		// реакция на событие
		if(searchDevice(value) >= 0) {
			blinkLED(1, 50, 0);
			setStatus(status_on);
		}
	}

	// проверяем не вышо ли время и не пора ли выключать полностью или частично
	if(var.timer && (millis() > var.timer)) {
		blinkLED(6, 50, 50);
		switch(var.status) {
			case status_on:
				setStatus(status_half_off);
				break;
			case status_half_off:
				setStatus(status_off);
				break;
			case status_off:
				break;
		}
	}

	if(digitalRead(BUTTONPIN) == 0) {
		delay(200);

		unsigned long time1 = millis();

		while(millis() - time1 < 30 * 1000) {
			// нажата кнопка

			if(radio_devices.num < NUM_DEVICES) {
				if(mySwitch.available()) {
					int value = mySwitch.getReceivedValue();

					if(searchDevice(value) < 0) {
						radio_devices.id[radio_devices.num] = value;
						eeprom_write_block(&radio_devices.id[radio_devices.num], &eemem_radio_devices.id[radio_devices.num], sizeof(uint32_t));
						radio_devices.num++;
						eeprom_write_byte(&eemem_radio_devices.num, radio_devices.num);
						break;
					}
					//while(mySwitch.available()) {
						mySwitch.resetAvailable();
					//	delay(100);
					//}
				}
				blinkLED(1, 200, 200);
			} else {
				// нет места для новых устройств
				blinkLED(1, 600, 100);
			}

			if(digitalRead(BUTTONPIN) == 0) {
				// кнопка нажата повторно
				delay(500);

				time1 = millis();
				while(millis() - time1 < 10 * 1000) {
					blinkLED(1, 50, 50);
					if(digitalRead(BUTTONPIN) == 0) {
						// очитска списка устройств
						radio_devices.num = 0;
						eeprom_write_byte(&eemem_radio_devices.num, radio_devices.num);
						blinkLED(5, 1000, 200);
						break;
					}
				}
			}
		}
	}

}

int searchDevice(int value) {
	// поиск ID
	for(uint8_t i=0; i<radio_devices.num; i++) {
		if(radio_devices.id[i] == value) return i;
	}
	return -1;
}

void ledCB(void) {
	digitalWrite(LEDPIN, (digitalRead(LEDPIN))?LOW:HIGH);
}

void setLightPWM(uint8_t pwm) {
	digitalWrite(LIGHTRELAY, (pwm)?HIGH:LOW);
	analogWrite(LIGHTPWM, pwm);
	var.light_pwm = pwm;
}

void lightUp() {
	for(uint16_t pwm=var.light_pwm; pwm < 256; pwm++) {
		setLightPWM(pwm);
		delay(10);
	}
}

void lightDown(uint8_t to_pwm) {
	for(uint8_t pwm=var.light_pwm; pwm > to_pwm;) {
		setLightPWM(--pwm);
		delay(50);
	}
}

void blinkLED(uint8_t cnt, uint16_t time_on, uint16_t time_off) {
	for(uint8_t i=0; i<cnt; i++) {
		digitalWrite(LEDPIN, HIGH);
		delay(time_on);
		digitalWrite(LEDPIN, LOW);
		delay(time_off);
	}
}

а это моя "ардуиа" сейчас )) делаю платку

axill
Offline
Зарегистрирован: 05.09.2011

так должно получиться

art100
Offline
Зарегистрирован: 09.03.2014

класно

я уже забыл такие атмеловские макетки

делись с шаблоном платки я буду ЛУТ-ом развлекатся :)

только я не понял цель

В сартир когда пришел светодиодная лампочка зажглась на 10 минут, а ты злодей в самый ответсвенный момент темную радейкой устраиваешь?

надо код посмотреть

может там спрятаны сакральнЫе знаниЯ целеуказаниЯ :-)

плин тебя что на с шарпе учить начинали

ну нет мне не по душе такой стиль

простые вещи структуировать

axill
Offline
Зарегистрирован: 05.09.2011

когда я учился програмировать не было ни сишарпа ни джавы, даже сипласплас был в зачатке)))

на вкус и цвет товарищей нет

насчет туалета пока не знаю. Если буду делать то там будет связка датчика движения с датчиком двери. Нормально можно сдделать, но там радио датчик особо не потребуется, достаточно проводного будет

в первую очередь эта штука пойдет в коридор

axill
Offline
Зарегистрирован: 05.09.2011

вот оно, сразу три штуки

в режиме покоя из сети потребляет 0.9Вт

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Приемник без антенны ?? Работает ? Просто у меня такие же "радиомосты" в пределах квартиры работают достаточно нестабильно, прохождение сигнала зачастую зависит от расположения звезд, направления ветра и цены за куб дров в Жмеринке )) Антенны пробовал разные.

axill
Offline
Зарегистрирован: 05.09.2011

Да, приемники без антенн. Практика покажет

в логике работы моего устройства мне нужна дальность в рамках одного помещения - включать свет там же где установлены сенсоры с передатчиками

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

axill пишет:

Да, приемники без антенн. Практика покажет

Удивлен. У меня без антенн "дальнобойность" была меньше метра.

axill
Offline
Зарегистрирован: 05.09.2011

еще не тестировал дальность, пока все лежало на одном столе, но в моем случае у передатчиков есть антенны

axill
Offline
Зарегистрирован: 05.09.2011

протестировал, все не так плохо

с брелка пробивает через две стены, а вот с датчика движения с выдвижной антенной из любого угла квартиры добивает

art100
Offline
Зарегистрирован: 09.03.2014

А все таки платочку можно? Могу  обещать все перелопатить но ссылаться буду. Что там у Вас sprint ? Вчера на день рождения сотруднику подарили arduino uno r3. Нас ардуинщиков оказалось 2-ое. Мы в двоем подсаживаем его 3-его на этот наркотик. :) За вчера мы ему выдрали из системника кнопки и светодиоды. Подопытным blink fade и button были пройдены, под наши пинки ногами. Восторженный взгляд в его глазах был замечен. Мы поняли наркотик подействовал. Начинает донимать вопросами не пролистав "примеры". Был послан на пердварительную оплату 100$ за разьяснение на С. Посмотрим, денежная стимуляция заставила его пролистать и прочитать примеры? Ваш покорный слуга превратился в arduino-наркодилера в составе организованной преступной группы.  Ардуино-ОПГ в действии. ;)

 

axill
Offline
Зарегистрирован: 05.09.2011

Да можно. Только она в альиум дизайнер

axill
Offline
Зарегистрирован: 05.09.2011

реализовал весь функционал

#define LIGHT_HALF_OFF_PWM				5				// % частичная яркость
#define LIGHT_TIMEOUT_ON_SEC(t)			(30 + t)		// формула в секундах полного включения без событий, t значение подстроечника 0-1023
#define LIGHT_TIMEOUT_HALF_OFF_MIN		1				// время ожидания без событий в частичной яркости

#define CONFIG_WAIT_NEWDEVICE	30		// время в секундах ожидания команды по радио от подключаемого сенсора
#define CONFIG_WAIT_CLEANING	10		// время в секундах ожидания нажатия для очистки память устройств

#define LEDPIN		13		// индикаторный светодиод
#define LIGHTPWM	10		// управление яркостью лампы
#define LIGHTRELAY	9		// управление переменным напряжением питания лампы
#define BUTTONPIN	3		// кнопка управления
#define REEDPIN		5		// вход контактного датчика
#define PIRPIN		4		// сигнал от установленного на плате датчика движения

#define TIMEPOT		A1		// крутилка времени задержки
#define LIGHTPOT	A0		// крутилка уровня срабатывания по освещенности
#define LIGHTSENS	A2		// датчтик освещенности
#define TIMEPOT_ADC		1
#define LIGHTPOT_ADC	0
#define LIGHTSENS_ADC	2

#define NUM_DEVICES	8

#include <avr/eeprom.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <RCSwitch.h>

typedef enum {
	status_off=0,		// все выключено
	status_half_off=1,	// яркость в половину
	status_on=2			// полная яркость
} status_enum;

typedef struct {
	uint32_t	id[NUM_DEVICES];
	uint8_t		num;
} radio_devices_struct;

radio_devices_struct radio_devices;
radio_devices_struct eemem_radio_devices EEMEM;

struct {
	status_enum		status;
	uint8_t			light_pwm;
	unsigned long	timer;
	uint8_t			pir_status;
	uint8_t			reed_status;
	volatile	uint16_t	timepot_sec;		// время ожидание в секундах определенное по настройке крутилки
	volatile	int16_t		lightpot;			// корректировка к текущей освещенности по настройке крутилки для определния момента срабатывания -512:512
	volatile	int16_t		lightlevel;			// текущее значение освещенности по датчику, чем больше значение тем ярче
	struct {
		volatile	uint16_t sum;
		volatile	uint8_t	count;
	} adc;
} var;

RCSwitch mySwitch = RCSwitch();

#define ADC_COUNT	64
void setADC(uint8_t channel) {
	ADMUX = (1 << REFS0) | channel;
}
ISR(ADC_vect) {
	var.adc.sum += ADCW;
	if(++var.adc.count == ADC_COUNT) {
		var.adc.sum /= ADC_COUNT;
		// усреднение завершилось
		switch(ADMUX & 0b1111) {
			case TIMEPOT_ADC:
				var.adc.sum = 1023 - var.adc.sum;
				var.timepot_sec = LIGHT_TIMEOUT_ON_SEC(var.adc.sum); // инверсия из за дизайна платы
				setADC(LIGHTPOT_ADC);
				break;
			case LIGHTPOT_ADC:
				var.lightpot = var.adc.sum - 512;
				setADC(LIGHTSENS_ADC);
				break;
			case LIGHTSENS_ADC:
				var.lightlevel = 1023 - var.adc.sum;
				setADC(TIMEPOT_ADC);
				break;
		}
		var.adc.sum = 0;
		var.adc.count = 0;
	}
	ADCSRA |= (1 << ADSC);
}

void setStatus(int status) {
	switch(var.status) {
		case status_off:
			switch(status) {
				case status_on:
					lightUp();
					break;
				case status_half_off:
				case status_off:
					break;
			}
			break;
		case status_half_off:
			switch(status) {
				case status_off:
					lightDown(0);
					break;
				case status_half_off:
					break;
				case status_on:
					lightUp();
					break;
			}
			break;
		case status_on:
			switch(status) {
				case status_off:
					lightDown(0);
					break;
				case status_half_off:
					lightDown(LIGHT_HALF_OFF_PWM * 256 / 100);
					break;
				case status_on:
					break;
			}
			break;
	}
	switch(status) {
		case status_off:
			var.timer = 0;
			var.status = status_off;
			break;
		case status_half_off:
			var.timer = millis() + (LIGHT_TIMEOUT_HALF_OFF_MIN * 60 * 1000LL);
			var.status = status_half_off;
			break;
		case status_on:
			var.timer = var.timepot_sec;
			var.timer *= 1000LL;
			var.timer += millis();
			var.status = status_on;
			break;
	}
}

void setup()
{
	// индикаторный светодиод
	pinMode(LEDPIN, OUTPUT);
	// управляющая кнопка
	digitalWrite(BUTTONPIN, HIGH);
	// выход управления яркостью лампы
	pinMode(LIGHTPWM, OUTPUT);
	analogWrite(LIGHTPWM, 0);
	// выход управления реле лампы
	pinMode(LIGHTRELAY, OUTPUT);
	// вход от локального PIR
	digitalWrite(PIRPIN, HIGH);
	// внешний контактный датчик
	digitalWrite(REEDPIN, HIGH);

	// настройка ADC с предделителем 64 и прерываниями
	setADC(TIMEPOT_ADC);
	ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0);

	mySwitch.enableReceive(0);

	// сохраненные датчики в EEPROM
	eeprom_read_block(&radio_devices, &eemem_radio_devices,  sizeof(radio_devices_struct));
	if(radio_devices.num >= NUM_DEVICES) radio_devices.num = 0;
	blinkLED(radio_devices.num, 1000, 500);

	// начальные значения переменных
	var.pir_status = digitalRead(PIRPIN);
	var.reed_status = digitalRead(REEDPIN);
	var.status = status_off;
}

void loop()
{
	//-----------------------------------------------------------------------------------------------------------------------
	// проверка событий включения лампы
	//
	boolean event = false;

	// проверка наличия радио событий
	if(mySwitch.available()) {
		// получено радио сообщение
		int value = mySwitch.getReceivedValue();
		mySwitch.resetAvailable();

		// реакция на событие
		if(searchDevice(value) >= 0) {
			blinkLED(1, 40, 0);
			event = true;
		}
	}
	// проверка локального PIR - по событию срабатывания когда LOW переходит в HIGH
	uint8_t pin_status = digitalRead(PIRPIN);
	if(var.pir_status != pin_status) {
		var.pir_status = pin_status;
		if(pin_status) {
			blinkLED(2, 50, 50);
			event = true;
		}
	}
	// проверка проводного контактного датчика (геркона) - по событию открытия двери когда LOW переходит в HIGH
	pin_status = digitalRead(REEDPIN);
	if(var.reed_status != pin_status) {
		var.reed_status = pin_status;
		if(pin_status) {
			blinkLED(3, 50, 50);
			event = true;
		}
	}

	// смена статуса на включение при наличии событий
	if(event && (var.lightlevel + var.lightpot < 512)) setStatus(status_on);

	//-----------------------------------------------------------------------------------------------------------------------
	// проверяем не вышо ли время и не пора ли выключать полностью или частично
	//
	if(var.timer && (millis() > var.timer)) {
		blinkLED(6, 50, 50);
		switch(var.status) {
			case status_on:
				setStatus(status_half_off);
				break;
			case status_half_off:
				setStatus(status_off);
				break;
			case status_off:
				break;
		}
	}

	//-----------------------------------------------------------------------------------------------------------------------
	// если нажата кнопка конфигурирования то отработать меню конфигурирования
	//
	if(digitalRead(BUTTONPIN) == 0) {
		setStatus(status_off);
		delay(200);

		unsigned long time1 = millis();

		while(millis() - time1 < CONFIG_WAIT_NEWDEVICE * 1000) {
			// нажата кнопка

			if(radio_devices.num < NUM_DEVICES) {
				if(mySwitch.available()) {
					int value = mySwitch.getReceivedValue();

					if(searchDevice(value) < 0) {
						radio_devices.id[radio_devices.num] = value;
						eeprom_write_block(&radio_devices.id[radio_devices.num], &eemem_radio_devices.id[radio_devices.num], sizeof(uint32_t));
						radio_devices.num++;
						eeprom_write_byte(&eemem_radio_devices.num, radio_devices.num);
						break;
					}
					//while(mySwitch.available()) {
						mySwitch.resetAvailable();
					//	delay(100);
					//}
				}
				blinkLED(1, 200, 200);
			} else {
				// нет места для новых устройств
				blinkLED(1, 600, 100);
			}

			if(digitalRead(BUTTONPIN) == 0) {
				// кнопка нажата повторно
				delay(500);

				time1 = millis();
				while(millis() - time1 < CONFIG_WAIT_CLEANING * 1000) {
					blinkLED(1, 50, 50);
					if(digitalRead(BUTTONPIN) == 0) {
						// очитска списка устройств
						radio_devices.num = 0;
						eeprom_write_byte(&eemem_radio_devices.num, radio_devices.num);
						blinkLED(5, 1000, 200);
						break;
					}
				}
			}
		}
	}

}

int searchDevice(int value) {
	// поиск ID
	for(uint8_t i=0; i<radio_devices.num; i++) {
		if(radio_devices.id[i] == value) return i;
	}
	return -1;
}

void ledCB(void) {
	digitalWrite(LEDPIN, (digitalRead(LEDPIN))?LOW:HIGH);
}

void setLightPWM(uint8_t pwm) {
	digitalWrite(LIGHTRELAY, (pwm)?HIGH:LOW);
	analogWrite(LIGHTPWM, pwm);
	var.light_pwm = pwm;
}

void lightUp() {
	for(uint16_t pwm=var.light_pwm; pwm < 256; pwm++) {
		setLightPWM(pwm);
		delay(10);
	}
}

void lightDown(uint8_t to_pwm) {
	for(uint8_t pwm=var.light_pwm; pwm > to_pwm;) {
		setLightPWM(--pwm);
		delay(50);
	}
}

void blinkLED(uint8_t cnt, uint16_t time_on, uint16_t time_off) {
	for(uint8_t i=0; i<cnt; i++) {
		digitalWrite(LEDPIN, HIGH);
		delay(time_on);
		digitalWrite(LEDPIN, LOW);
		delay(time_off);
	}
}

есть еще желание избавиться оот delay() вынеся все в обработчик прерывания от таймера, но функции и без этого работают

Так оно выглядит в натуре:

axill
Offline
Зарегистрирован: 05.09.2011

заработало! установил вот в этот светильник

в него незаметно встроена коробочка

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

Респект! Датчик движения прямо в люстре за стеклом? Стекло не мешает,ном работает?

axill
Offline
Зарегистрирован: 05.09.2011

спасибо! если посмотрите на пост #12 там на фото два варианта моего устройства - с установленным датчиком движения и без него

фото с люстрой там вариант без датчика движения. Эта люстра работает исключительно с радио датчиками, к ней запрограмрованы два дверных датчика и один датчик движения, поэтому установка здесь полностью скрытая

Чуть позже в этот светильник встрою вместо лампочек свои светодиоды и тогда мое устройство будет не просто включать и выключать, а делать плавное включение и двух этапное выключение. Для этого в устройстве уже все есть.

в другом месте в примерно такую же люстру поставил модуль с встроенным датчиком движения, только фото не сделал. Там мое устройство стоит на потолке в 20 сантиметрах от подвеса светильника. Там тоже есть радио датчик движения и получается что идет дублирование встроенным датчиков и радио датчиком. Специально делал такую универсальную вещь.

Третье устройство будет тоже скрытой установки внутри люстры.

Если все правильно заработает буду делать еще штук пять. У них так же предусмотрено подключение проводного дверного датчика (геркон). Это удобно для установки в таких помещениях как гардеробная, кладовая, туалет.

Есть идея сделать еще вариант который будет ставится вместо настенного выключателя. Он тоже будет двух вариантов - с установленным датчиком движения и без него (наверно с сенсорным управлением). Есть как минимум два места где удобна такая установка. Нужно будет только сделать другой формат платы и другой корпус. Схема не изменится и скетч будет тот же

 

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

Если я правильно понял ,то датчики работают через стекло люстры без проблем ? 

Я во все свои поделки вроде радиовыключателей стал использывать блоки питания такого типа http://www.ebay.com/itm/AC-DC-Power-Supply-Step-Down-Module-Buck-Converter-5V-700mA-85-265V-for-Arduino-/351202429651?&_trksid=p2056016.m2518.l4276

получается что то типа этого 

axill
Offline
Зарегистрирован: 05.09.2011

Врядли датчик движения будет работать через стекло. На моих фото светильника нет датчика движения

классный у вас модуль. Для управления нагрузкой симистор? Что то не вижу оптопары, есть гальваническая развязка от сети?

такие блоки питания у меня тоже есть. В выключатели я буду ставить схему на LNK306, как самую компактную. Разбирал несколько фирменных диммеров и радиовыключателей - там именно схема на lnk306

Но еще нужно решение для двухпроводного включения. Тогда можно будет легко заменять обычные выключатели там где нет нулевого провода. Уже есть понимание как это делать, нужно реализовать

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Считается, что обычное стекло непрозрачно для ИК излучения. На экранах тепловизоров оно выглядит как зеркало.

Поскольку ИК датчики движения по сути своей тепловые, через обычное стекло движение они не "видят".

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

axill пишет:

 Что то не вижу оптопары, есть гальваническая развязка от сети?

он притаился под семистором )

для двухпроводной схемы у меня другое решение,правда пришлось поменять распаячные коробки в стене ) Но зато модули докучи собирают данные о влажности ,температуре , давление, освешенности и движение .

axill
Offline
Зарегистрирован: 05.09.2011

Araris пишет:

Считается, что обычное стекло непрозрачно для ИК излучения. На экранах тепловизоров оно выглядит как зеркало.

Поскольку ИК датчики движения по сути своей тепловые, через обычное стекло движение они не "видят".

уверен, что все именно так)) просто не стал умничать)

axill
Offline
Зарегистрирован: 05.09.2011

avton пишет:

он притаился под семистором )

ясно)) подключение по трем проводам? L + N + нагрузка?

если сделаю на LNK306 - это БП без трансформатора, то можно будет в принципе сэкономить и на оптопаре, она уже как таковая не нужна, но буду делать сэндвич - отдельно силовая плата, отдельно плата с МК, при отладке плату с МК подключать к лабораторному БП и безопасно отлаживать, а потом втыкаешь в силовую плату и ставишь на место

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

Araris пишет:

Считается, что обычное стекло непрозрачно для ИК излучения. На экранах тепловизоров оно выглядит как зеркало.

Поскольку ИК датчики движения по сути своей тепловые, через обычное стекло движение они не "видят".

Только что проверил эксперементально,Вы оказались правы )

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

не поделитесь своей схемкой на LNK306 ?

L + N + нагрузка?  - именно так

axill
Offline
Зарегистрирован: 05.09.2011

avton пишет:

Только что проверил эксперементально,Вы оказались правы )

даже если применить специальное стекло через которое инфракрассный свет проходит, оно изменить оптическую геометрию и все равно бы нормально датчик не смог бы работать

 

axill
Offline
Зарегистрирован: 05.09.2011

avton пишет:

не поделитесь своей схемкой на LNK306 ?

схема стандартная из даташита, только я подобрал SMD компоненты, выглядит на отдельной плате так:

avton пишет:
L + N + нагрузка?  - именно так

хорошо когда так можно подключить. Но бывает без капремонта или порчи внешнего вида нулевой провод не провести. Вот и нужен вариант с двумя проводами

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

у меня обошлось относительно малой кровью плюс удачное расположение распаячной коробки,прямо над выключателем на стене 

axill
Offline
Зарегистрирован: 05.09.2011

ну так да, есть такие удачные места)) но их количество ограничено