Проходные выключатели через слаботочку.
- Войдите на сайт для отправки комментариев
Сб, 01/07/2017 - 21:07
Код для организации проходных выключателей.
Может кому пригодится.
Скетч использует 1042 байт.
Глобальные переменные используют 9 байт.
А можно както еще проще?
void setup() {
pinMode(4, INPUT); // сюда подключаем переключатель №1
pinMode(5, INPUT); // сюда подключаем переключатель №2
pinMode(6, INPUT); // сюда подключаем переключатель №3
pinMode(7, OUTPUT); // сюда я подключил реле размыкающее цепь освещения
}
void loop() {
boolean lamp1;
//для преключателя №1
boolean key1 = digitalRead(4);
boolean key1prew;
if (key1 != key1prew) { // здесь определяем, произошло ли переключение
if (lamp1 == 0) {lamp1 = 1;}
else {lamp1 = 0;}
}
key1prew = digitalRead(4); //считываем состояние пина для отслеживания в следующем цикле
//для преключателя №2
boolean key2 = digitalRead(5);
boolean key2prew;
if (key2 != key2prew)
{
if (lamp1 == 0) {lamp1 = 1;}
else {lamp1 = 0;}
}
key2prew = digitalRead(5);
//для преключателя №3
boolean key3 = digitalRead(6);
boolean key3prew;
if (key3 != key3prew) {
if (lamp1 == 0) {lamp1 = 1;}
else {lamp1 = 0;}
}
key3prew = digitalRead(6);
// и можно еще добавить переключатели
//переключаем реле
if (lamp1 == 0) {digitalWrite(7, HIGH);}
if (lamp1 == 1) {digitalWrite(7, LOW);}
}
Сергей, а зачем эмулиировать проходные выключатели на микроконтроллере, чем плох натюр-продукт сам по себе?
Цена вопроса?
Моя получается такой:
ардуино нано 130р
блок притания к ардуино 130р
реле 35р
Экономия на проводах 20р.\метр
+ получение данных в сисиему умного дома.
Не, ну провода-то всё равно нужны - к Вашему девайсу тянуть же надо. Сами выключатели, не знаю, у того же Legrand цена не сильно отличается проходного от непроходного. А умный дом, это да - о нём я не подумал, т.к. у меня нету такой штуки. Не люблю когда техника умнее меня :)
void setup() {pinMode(7, OUTPUT); } void loop() { digitalWrite(7, (digitalRead(4) + digitalRead(5) + digitalRead(6)) & 1); }Для уменьшения откомпилированного варианта, если известен конкретный контроллер, можно наменить работу с пинами на работу с портами.
Перекиньте тему в "Проекты"
Процетирую вторую строчку:
"Может кому пригодится."
Процетирую вторую строчку:
"Может кому пригодится."
А не проще две строчки написать самому, чем разыскивать по форуму?
Цена вопроса?
Моя получается такой:
ардуино нано 130р
блок притания к ардуино 130р
реле 35р
Экономия на проводах 20р.\метр
+ получение данных в сисиему умного дома.
Честно говоря, проект мне кажется "некрасивым". Приделывать Нану с БП к выключателю - это все равно как приматывать изолентой второй АКБ к телефону :) Это называется "колхоз" и так можно делать только что-то временное и ерундовое.
Если вопрос "проще" - то готовые проходные выключатели вне конкуренции, есть в любом крупном строймаге. И стоят, в общем-то, недорого... особенно если посчитать еще цену времени на монтаж "умных схем".
Если вопрос "дешевле" и с меньшими ресурсами - совершенно неясно, к чему для такого "сложного" кода брать Нану. Есть более дешевые варианты - Про мини за 95 рублей, Дигиспарк за 80 рублей. Но вообще правильнее взять голый контроллер - Атмегу8 или Атини2313 по 50р. А самый оптимальный, имхо, вариант - Атини13 - 20р на Али.
Кроме цены, на голых МК размеры схем будут мизерными и легко поместятся внутри стандартного выключателя. Нану с БП вы туда не запихнете. Не вполне понимаю, какое у вас реле, но вот всю микропроцессорную часть легко можно питать по той же слаботочке, поставив 1 БП на этаж или даже на целый дом. Вам же все равно придется вести общую землю от датчика к датчику - так положите один лишний провод для VCC
Нет, ну с "Проектами" - это ТС погорячился. Думаю, вопрос стоял, как реализовать алгоритм, названный ТС "проходной выключатель" возможно короче и проще. Не как самостоятельный проект, а как часть какого-либо другого проекта.
В некоторых случайх проще и дешевле прикрутить котролер чем проходные выключатели. Для каждого проходного необходимо тянуть 2 жилы. Если их три как в описанном проеткте это надо завязывать все выключатели тремя двухжильными проводами и это все надо делать на этапе строительства, пока проложены штробы и не заштукатурено все. А если выключатели уже стоят, то штробить все и делат ремонт заново не вариант.
Например в моем случае, проект этот то, что нужно, ибо к проходникам у меня завязываются электромагнитные замки к которым в свою очередь подвязано освещение с задержкой по времени. Это обычными электротехническими способами не сделаешь.
Так что автору спасибо за скетч:)
Может кому пригодится.
А можно както еще проще?
Если нужно попроще и это комуто пригодилось, тогда можно так
bool lamp1; uint8_t pin456; uint8_t temp_pin; void setup() { pinMode(4, INPUT); // сюда подключаем переключатель №1 pinMode(5, INPUT); // сюда подключаем переключатель №2 pinMode(6, INPUT); // сюда подключаем переключатель №3 pinMode(7, OUTPUT); // сюда я подключил реле размыкающее цепь освещения } void loop() { pin456 = PIND & 0x70; if (pin456 != temp_pin) { lamp1 = !lamp1; temp_pin = pin456; } //переключаем реле if (lamp1 == 0) {digitalWrite(7, HIGH);} if (lamp1 == 1) {digitalWrite(7, LOW);} }А что делает PIND & 0x70; ?
Вот вариант попроще. Не так конечно как у vosara но зато не использовал PIND ( в котором я не особо шарю :) )
bool lamp1=0; //при включении питания все освещение выключается (малоли что : ) int all=0; // обнуляемся старте int alltemp=0; void setup() { pinMode(4, INPUT_PULLUP); // сюда подключаем переключатель №1 pinMode(5, INPUT_PULLUP); // сюда подключаем переключатель №2 pinMode(6, INPUT_PULLUP); // сюда подключаем переключатель №3 pinMode(7, OUTPUT);} // сюда подключаем реле цепи освещения void loop() { bool swich1 = digitalRead(4); bool swich2 = digitalRead(5); bool swich3 = digitalRead(6); all= swich1 + swich2 + swich3; // собираем все значиния на трех портах if (all != alltemp) //ищем изменение в сумме всех портов с предыдущим состоянием {digitalWrite(7, lamp1); lamp1= !lamp1; //переключаем реле освещения alltemp=all;} // запоминаем текущее значение выключателей }0x70 - это маска в двоичном формате 01110000, единички указывают на пины 4, 5, 6.
pin456 = PIND & 0x70; // поразрядное логическое И - в pin456 заносим только состояние пинов 4, 5, 6, а все остальные биты будут всегда 0