Проходные выключатели через слаботочку.

Sergey.Akinshin
Offline
Зарегистрирован: 29.01.2017

Код для организации проходных выключателей.

Может кому пригодится.

Скетч использует 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);}
}

 

Monday
Offline
Зарегистрирован: 01.07.2017

Sergey.Akinshin пишет:
А можно както еще проще?
Можно выкинуть контроллер и сделать аппаратно на электромагнитном реле.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сергей, а зачем эмулиировать проходные выключатели на микроконтроллере, чем плох натюр-продукт сам по себе?

Sergey.Akinshin
Offline
Зарегистрирован: 29.01.2017

Цена вопроса?

Моя получается такой:

ардуино нано 130р

блок притания к ардуино 130р

реле 35р

Экономия на проводах 20р.\метр

+ получение данных в сисиему умного дома.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не, ну провода-то всё равно нужны - к Вашему девайсу тянуть же надо. Сами выключатели, не знаю, у того же Legrand цена не сильно отличается проходного от непроходного. А умный дом, это да - о нём я не подумал, т.к. у меня нету такой штуки. Не люблю когда техника умнее меня :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
void setup() {pinMode(7, OUTPUT); }
void loop() { digitalWrite(7, (digitalRead(4) + digitalRead(5) + digitalRead(6)) & 1); }

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

Sergey.Akinshin
Offline
Зарегистрирован: 29.01.2017

Перекиньте тему в "Проекты"

Sergey.Akinshin
Offline
Зарегистрирован: 29.01.2017

Процетирую вторую строчку:

"Может кому пригодится."

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Sergey.Akinshin пишет:

Процетирую вторую строчку:

"Может кому пригодится."

А не проще две строчки написать самому, чем разыскивать по форуму?

b707
Offline
Зарегистрирован: 26.05.2017

Sergey.Akinshin пишет:

Цена вопроса?

Моя получается такой:

ардуино нано 130р

блок притания к ардуино 130р

реле 35р

Экономия на проводах 20р.\метр

+ получение данных в сисиему умного дома.

 

Честно говоря, проект мне кажется "некрасивым". Приделывать Нану с БП к выключателю - это все равно как  приматывать изолентой второй АКБ к телефону :) Это называется "колхоз" и так можно делать только что-то временное и ерундовое.

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

Если вопрос "дешевле" и с меньшими ресурсами - совершенно неясно, к чему для такого "сложного" кода брать Нану. Есть более дешевые варианты -  Про мини за 95 рублей, Дигиспарк за 80 рублей.  Но вообще правильнее  взять голый контроллер - Атмегу8 или Атини2313 по 50р. А самый оптимальный, имхо, вариант - Атини13 -  20р на Али.

Кроме цены, на голых МК размеры схем будут мизерными и легко поместятся внутри стандартного выключателя. Нану с БП вы туда не запихнете. Не вполне понимаю, какое у вас реле, но вот всю микропроцессорную часть легко можно питать по той же слаботочке, поставив 1 БП на этаж или даже на целый дом. Вам же все равно придется вести общую землю от датчика к датчику - так положите один лишний провод для VCC

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Нет, ну с "Проектами" - это ТС погорячился. Думаю, вопрос стоял, как реализовать алгоритм, названный ТС "проходной выключатель" возможно короче и проще. Не как самостоятельный проект, а как часть какого-либо другого проекта.

notfop
Offline
Зарегистрирован: 10.02.2018

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

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

Так что автору спасибо за скетч:)

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Sergey.Akinshin пишет:

Может кому пригодится.

А можно както еще проще?

Если нужно попроще и это комуто пригодилось, тогда можно так

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);}
}

 

notfop
Offline
Зарегистрирован: 10.02.2018

А что делает PIND & 0x70;  ?

notfop
Offline
Зарегистрирован: 10.02.2018

Вот вариант попроще. Не так конечно как у 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;} // запоминаем текущее значение выключателей
  }

 

ven-til
Offline
Зарегистрирован: 13.02.2018

notfop пишет:
  А что делает PIND & 0x70;  ?

0x70 - это маска в двоичном формате 01110000, единички указывают на пины 4, 5, 6.
pin456 = PIND & 0x70; // поразрядное логическое И - в pin456 заносим только состояние пинов 4, 5, 6, а все остальные биты будут всегда 0