Давно читаю статьи на Хабре о системах домашней автоматизации, захотелось описать то, над чем я работаю уже более 2 лет. Для лучшего понимания моей ситуации необходимо сделать небольшое вступление.

Три года назад мы с семьей переехали в новую трехкомнатную квартиру (67.5 кв.м), хотя технически квартира конечно старая — сталинка, дом 1946 года постройки. Алюминиевая двухпроводная проводка с кусками медного многожильного кабеля 1 кв.мм в некоторых местах. Ремонт предстоял капитальный, делать решил все сам, и начал с полной замены проводки. Было куплено 700м силового кабеля на освещение и розетки 1.5 и 2.5 кв.мм, бухта витой пары, немного коаксиала для телевизионных антенн (на всякий случай). Зачем так много и что из из этого вышло — прошу под кат.

Проводку я решил делать сразу правильную, а именно: без распредкоробок, от каждой точки кабель идет в щиток (за исключение розеток, которые могут быть в группе по 2-3 точки, кабель идет в щиток от крайней, остальный соединены шлейфом) — т.е. от каждого выключателя свой кабель в щиток, от каждой точки освещения — свой кабель в щиток, около розеток по паре точек rj-45 на всякий случай. Кабелей, конечно, получается много. Где-то он проложен в полу с соблюдением всех норм ПУЭ, как, например, в детской:



Где-то — по потолку, например вид на дверь спальни:



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

Вот так выглядел временный «щиток» в процессе экспериментов:



Жуткое зрелище, однако все работало и в таком виде этот монстр жил несколько месяцев. В один прекрасный день звезды удачно сложились и волевым решением щиток был переделан. Заняло это 3 дня на шаткой лестнице под потолком (а потолки в сталинке 3м), но оно того стоило. Вот как стал выглядеть щиток после этого:



И общий вид:



Это далеко не конечный вид щитка, не хватает еще УЗО, автоматов в 3 раза меньше, чем нужно, нет импульсных реле — зато есть неотключаемые линии, все кабели заведены на клеммы, есть хоть какая-то селективность автоматов.

Теперь, когда у Вас появилось примерное представление о том, с чем именно мне предстояло работать, можно приступать к описанию «мозгов» системы. Не мудрствуя лукаво, за основу я взял arduino, тем более что у меня уже лежали купленные задолго до этого 2 платы freeduino, 2 ethernet-шилда и один motor-шилд. Также заказал у китайцев несколько модулей реле по 4шт на каждом. И еще нашел по совету в одной из статей на Хабре в Оби выключатели, в которые можно было вставить специальные пружинки и они превращались в выключатели без фиксации. Настал черед писать код.

Вообще я по жизни тесно связан с компами. Закончил мех-мат, на чем только не писал — pascal, c#, c++, 1с, php, javascript — можно еще многго перечислять. Последнее время работаю в сфере веб-разработки, также имею дело с ip-телефонией. Поэтому придумать алгоритм — просто, а вот с электроникой «на вы» — простые вещи знаю и умею, а когда дело касается чего-то более сложного — микроконтроллеры, фьюзы, дребезг контактов — с этим сложнее. Но не боги горшки обжигают, глаза боятся, а руки делают. Решил делать все просто. Подаю на вход выключателя землю с ардуины, выходы с выключателя подключаю к аналоговым пинам на ардуине (хотя можно и к цифровым, это не важно). Соединяю пины ардуино с пинами на модуле реле. Технически — все готово, при нажатии на выключатель ардуино видит значение LOW на нужном пине и выставляет LOW на пине, соединенном с модулем реле. С учетом того, что все кабели от точек в квартире приходят на клеммы — подключение не заняло много времени.
Для борьбы с дребезгом контактов, после изучения темы в интернете, была выбрана библиотека Bounce2. Вообще изначально хотелось написать универсальный код, чтобы его можно было использовать хоть на 2 выключателя, хоть на 22. Именно эта задача легла в основу всего алгоритма. Ну, теперь от слов — к коду. Я не буду полностью выкладывать весь код, ссылки на гитхаб будут в конце статьи. Покажу только важные, с моей точки зрения, моменты.

Итак, объявление библиотек и переменных:

#include <Bounce2.h>
#include <EEPROM.h>

const byte cnt = 8;
const byte pin_cnt = 19;

int pins[] = {11,12,13,13,14,15,16,17};
int leds[] = {6, 3, 4, 5, 3, 4, 5, 3};

byte init_leds[cnt] ;
byte init_buttons[cnt];
int button_states[cnt];
Bounce debouncers[cnt];
unsigned long buttonPressTimeStamps[cnt];
boolean changed[cnt];

Смысл в чем: достаточно увеличить константу с количеством светильников/выключателей и прописать в массивы новые ассоциации — и все, новый светильник или выключатель будет добавлен. При этом, структура кода позволяет одним выключателем сразу управлять несколькими светильниками. Или несколькими выключателями сразу управлять одним светильником. Также для каждого выключателя создается свой собственный экземпляр объекта Bounce для антидребезга.

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

  for(byte i=0; i<cnt; i=i+1) {
    EEPROM.write(pins[i], 10);
  }

  for(byte i=0; i<cnt; i=i+1) {
    button_states[i] = 0;
    
    byte value = EEPROM.read(leds[i]);
    if(value==11) {
      init_leds[i] = LOW ;
    }else{
      init_leds[i] = HIGH ;
    }
    init_buttons[i] = HIGH;
    buttonPressTimeStamps[i] = 0;
    changed[i] = false;

    debouncers[i] = Bounce();

    pinMode(pins[i], INPUT);
    pinMode(leds[i], OUTPUT);
    
    digitalWrite(pins[i], init_buttons[i]);
    digitalWrite(leds[i], init_leds[i]);
    
    debouncers[i].attach( pins[i] );
    debouncers[i].interval(5);
  }

По поводу первого цикла пока промолчу, вернемся к нему чуть позже. А самое интересное начинается в теле основного цикла.

void loop(){
  for(byte i=0; i<cnt; i=i+1){
    byte dvalue = EEPROM.read(pins[i]);
    if(dvalue!=11) {
      changed[i] = debouncers[i].update();
      
      if ( changed[i] ) {
        int value = debouncers[i].read();
        if ( value == HIGH) {
         button_states[i] = 0;   
        } else {
           if (i > 0 and pins[i] == pins[i-1]) {
             byte prev_value = EEPROM.read(leds[i-1]);
                            
             if(prev_value == 11) {
               digitalWrite(leds[i], LOW );
               EEPROM.write(leds[i], 11);
             }else{
               digitalWrite(leds[i], HIGH);
               EEPROM.write(leds[i], 10);
             }
           } else {               
             byte value = EEPROM.read(leds[i]);
             if(value==11) {
               digitalWrite(leds[i], HIGH );
               EEPROM.write(leds[i], 10);
             }else{
               digitalWrite(leds[i], LOW);
               EEPROM.write(leds[i], 11);
             }
           }
                 
           button_states[i] = 1;
           buttonPressTimeStamps[i] = millis();     
        }
      }
   
      if ( button_states[i] == 1 ) {
        if ( millis() - buttonPressTimeStamps[i] >= 200 ) {
            button_states[i] = 2;
        }
      }
    }
  }

  delay( 10 );
} 

В ходе испытаний работы первых версий алгоритма было отмечено, что детям (а у меня их трое, пацаны) очень понравилось щелкать выключателями. Поэтому нужно было иметь возможность отключать некоторые выключатели, чтобы контроллер на них не реагировал. Самый напрашивающийся вариант — просто вынимать из платы нужные пины, но это неправильно и неинтересно. Поэтому в энергонезависимую память также пишутся флаги, указывающие отключен выключатель или нет. Инициализируется это вот этим циклом:

  for(byte i=0; i<cnt; i=i+1) {
    EEPROM.write(pins[i], 10);
  }

  ...

А проверяется вот тут:

  for(byte i=0; i<cnt; i=i+1){
    byte dvalue = EEPROM.read(pins[i]);
    if(dvalue!=11) {
    ...

Уже на этом этапе стали работать локальные выключтели на стенах. Но умный дом не был бы умным без интерфейса. Так как я имею дело с веб-разработкой, то и решено было делать веб-интерфейс. Тут-то и пригодились ethernet-шилды. К сожалению, я так и не смог найти исходники первых версий программ, использующих ethernet-шилды для удаленного управления. Попробую поискать в бекапах, возможно там они есть. Но смысл был примитивен до безобразия. Каждому контроллеру назначался свой IP-адрес. Поднимался веб-сервер на ардуине, который анализировал GET-запросы и в зависимости от номера порта включал-выключал соответствующий светильник. Примеров такого рода в интернете очень много. Для веб-интерфейса был собран сервер на материнской плате с встроенным Intel Atom, был установлен Ubuntu Server 14.02, уствновлен стандартный набор LAMP, там же написан простенький интерфейс. Все исходники также будут в конце статьи. На данный момент он выглядит вот так:



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

И все было бы отлично, если бы не одно «но». Ethernet-шилды постоянно зависали. Нет, локальное управление с выключателей работало всегда как часы. Но удаленное управление с веб-интерфейса постоянно отваливалось. Если управление работало сутки — это было отлично. Но чаще шилд подвисал уже через несколько часов после перезагрузки. Что я только не делал — пробовал разобраться с watch-dog, но мои платы не поддерживали его. Я заказал в Китае и заменил шилды на другие — на en28j60 — стало лучше, но все равно они периодически зависали. Я добавил в контроллер модуль реле, завел питание плат ардуино через нормально-замкнутые контакты на нем и одна из плат ардуино с определнной периодичностью дергало реле и питание обрывалось, а потом само восстанавливалось — однако это тоже не всегда работало, да и в момент перезагрузки мигал весль включенный свет, пусть на пару секунд, но тем не менее. Вот как выглядел контроллер к этому моменту:



И тогда было принято решение совсем отказаться от ethernet-шилдов. Я начал искать другие возможности удаленного управления. Пробовал подключать ардуины непосредственно к серверу и слать команды через Serial.read()/Serial.print() — работало через раз, стабильности так и не удалось добиться из-за того, что плата перезагружалась каждый раз, когда к ней шло обращение из скрипта на сервере. Я много читал о таких ошибках, понял только что это связано с DTR, где-то писали что можно инициализировать порт с дургими флагами, приводили примеры, которые у меня так и не заработали. Через некоторое время мне попалась статья о том, что из программатора USBAsp можно сделать переходник USB-I2C. Я решил — а почему бы и нет? Заказал у китайцев пару таких программаторов — и стал ждать.

И вот неделю назад приехала моя посылка. Один программатор был перепрошит прошивкой i2c tiny usb и я снова сел переписывать код. Тут начали проявляться особенности протокола. Мастером был конечно же сервер, а все платы ардуино — слейвами.

Код должен был решать следующие задачи:

— сообщить состояние запрошенного порта;
— переключить состояние запрошенного порта;
— выключить или включить все светильники.

И я столкнулся с проблемой. Я могу использовать стандартные команды из набор i2c-tools для общения с платами ардуино. Это команда

i2cget -y <номер шины> <адрес>

и

i2cset -y <номер шины> <адрес> 0x00 <byte значение>

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

Проблема в том, что, во-первых, если мне нужно переключить состояние некоторого порта, то я должен передать сначала номер команды, отвечающей за эту операцию, а потом номер порта. Я даже пробовал это сделать, отправлять 2 команды, а в коде собирать их по-очереди — но это было некрасиво и нерационально.

Проблема номер два — ардуино не может что-то ответить в момент, когда сама получает данные. Есть два метода библиотеки Wire — onReceive(), когда данные получены от мастера и onRequest(), когда данные запрошены мастером.

Поэтому я сделал так: веб-сервер имеет 6 команд:

  • команда «1» — получить состояние всех светильников
  • команда «2» — получить состояние блокировки всех выключателей
  • команда «5» — включить весь свет
  • команда «6» — выключить весь свет

команда, формирующаяся следующим образом: десятичное число следующего вида <сотни (1 или 2) — переключить светильник или блокировку выключателя><номер порта (от 0 до 99)>; например, 105 — переключить 5 порт, 213 — переключить блокировку 13 порта. Эта команда переводится в hex и передается на ардуину, которая производит обратные преобразования и понимает, что нужно делать.

Вот как это выглядит со стороны сервера:

  ...
  if ($action == 3)
     $val_hex = dechex(intval($port) + 100);
  else
     $val_hex = dechex(intval($port) + 200);
  
  exec("sudo i2cset -y 7 $addr 0x00 0x$val_hex", $output);
  ...

И со стороны ардуино:

void receiveEvent(int howMany) {
  byte bytes = Wire.available();
  int x = 0;
  for (byte i=1; i <= bytes; i=i+1) {
    x = Wire.read();
  }
  
  if (x == 1 or x == 2 or x == 5 or x == 6) {
    do_action(x, 0);
  } else {
    if ( x > 200) {
      do_action (4, x - 200);
    } else {
      do_action (3, x - 100);
    }
  }  
}

Выглядит достаточно примитивно, но работает. Вторая проблема решается следующим образом. Вот функция do_action:

void do_action(byte command, byte port) {
  byte value = 0;
  byte dvalue = 0;
  switch (command) {
    case 1:
      start_request = true;
      request_type = 1;
      current_port = 0;
      
      break;
    case 2:
      start_request = true;
      request_type = 2;
      current_port = 0;
      
      break;
    case 3:
      value = EEPROM.read(port);
      if(value==11) {
        digitalWrite(port, HIGH);
        EEPROM.write(port, 10);
      } else {
        digitalWrite(port, LOW);
        EEPROM.write(port, 11);
      }
      
      break;
    case 4:
      dvalue = EEPROM.read(port);
      if(dvalue==11) {
        EEPROM.write(port, 10);
      } else {
        EEPROM.write(port, 11);
      }
      
      break;
    case 5:
      for (byte i=0; i<cnt; i = i + 1) {
        digitalWrite(leds[i], LOW);
        EEPROM.write(leds[i], 11);
      }
      
      break;
    case 6:
      for (byte i=0; i<cnt; i = i + 1) {
        digitalWrite(leds[i], HIGH);
        EEPROM.write(leds[i], 10);
      }
      
      break;
    default:
      
    break;
  }
}

С командами 3-6 все понятно, а вот команды 1 или 2 можно описать более подробно. Сервер сначала отправляет нужную команду, и когда ардуино получает команду 1 или 2, происходит инициализация флагов:

  start_request = true;
  request_type = 1;
  current_port = 0;

И потом сервер начинает посылать запросы к ардуино столько раз, сколько портов хочет опросить. На стороне сервера:

function get_data($address, $action, $cnt) {
	exec("sudo i2cset -y 7 $address 0x00 0x0$action", $output);
	$tmp = @$output[0];
	while (strpos($tmp,"rror")!==false) {
		exec("sudo i2cset -y 7 $address 0x00 0x0$action", $output);
		$tmp = @$output[0];
	}
	$str = "";
	for ($i = 1; $i <= $cnt; $i++) {
		exec("sudo i2cget -y 7 $address", $output);
		$tmp = @$output[0];
		while (strpos($tmp,"rror")!==false) {
			exec("sudo i2cget -y 7 $address", $output);
			$tmp = @$output[0];
		}
		if ($tmp) {
			if (strpos($tmp,"1")!==false)
				$str .= "1";
			else
				$str .= "0";
		}
		unset($output);
		unset($tmp);
	}
			
	return $str;
}

$str = array();
$c = 1;
while ($c <= $tryes) {
	$tmp = get_data($addr, $action, $cnt);
	
	if (strlen($tmp) == $cnt)
		$str[] = $tmp;
	
	$c++;
}

$new_array = array_count_values($str);

asort($new_array);

$res = "";
$max = 0;
foreach ($new_array AS $key=>$val) {
	if ($val >= $max) {
		$res = $key;
		$max = $val;
	}
}

return preg_split('//', $res, -1, PREG_SPLIT_NO_EMPTY);

В двух словах — мы делаем несколько ($tryes > 3) попыток опросить ардуино, получаем строку, состоящую из 0 или 1. Везде при любой команде мы смотрим на ответ, если там есть слово Error — значит при передаче были ошибки и нужно повторить передачу. Несколько попыток сделано для гарантии правильности переданной строки, массив сворачивается по строкам методом array_count_values($str); и в итоге мы получаем массив с количеством вхождений одинаковых строк, выдаем ту строку, которую мы больше всего раз получили от ардуино.

Со стороны ардуино все проще:

void requestEvent() {
  if (request_type == 1) {
    byte value = EEPROM.read(leds[current_port]);
    if(value==11) {
      Wire.write(1);
    } else {
      Wire.write(0);
    }
    
    current_port = current_port + 1;
  } else if (request_type == 2) {
    byte dvalue = EEPROM.read(pins[current_port]);
    if(dvalue==11) {
      Wire.write(1);
    } else {
      Wire.write(0);
    }

    current_port = current_port + 1;
  }
}

В коде веб-странички прописаны элементы управления:

<a class="lamp living_room" id="lamp0x4d3" rel='0x4d' onclick="lamp_click('0x4d',this.id, 3);" ></a>
<a class="lamp kitchen" id="lamp0x4d4" rel='0x4d' onclick="lamp_click('0x4d',this.id, 4);" ></a>
<a class="lamp children_main" id="lamp0x4d5" rel='0x4d' onclick="lamp_click('0x4d',this.id, 5);" ></a>
<a class="lamp children_second" id="lamp0x4d6" rel='0x4d' onclick="lamp_click('0x4d',this.id, 6);" ></a>
<a class="lamp sleeproom_main" id="lamp0x423" rel='0x42' onclick="lamp_click('0x42',this.id, 3);" ></a>
<a class="lamp sleeproom_lyuda" id="lamp0x424" rel='0x42' onclick="lamp_click('0x42',this.id, 4);" ></a>
<a class="lamp sleeproom_anton" id="lamp0x425" rel='0x42' onclick="lamp_click('0x42',this.id, 5);" ></a>

<a class="button button_living_room" id="button0x4d15" onclick="button_click('0x4d',this.id, 15);" ></a>
<a class="button button_kitchen" id="button0x4d14" onclick="button_click('0x4d',this.id, 14);" ></a>
<a class="button button_children_main" id="button0x4d16" onclick="button_click('0x4d',this.id, 16);" ></a>
<a class="button button_children_second" id="button0x4d17" onclick="button_click('0x4d',this.id, 17);" ></a>
<a class="button button_sleeproom_door1" id="button0x4212" onclick="button_click('0x42',this.id, 12);" ></a>
<a class="button button_sleeproom_door2" id="button0x4213" onclick="button_click('0x42',this.id, 13);" ></a>
<a class="button button_sleeproom_lyuda1" id="button0x4214" onclick="button_click('0x42',this.id, 14);" ></a>
<a class="button button_sleeproom_lyuda2" id="button0x4215" onclick="button_click('0x42',this.id, 15);" ></a>
<a class="button button_sleeproom_anton1" id="button0x4216" onclick="button_click('0x42',this.id, 16);" ></a>
<a class="button button_sleeproom_anton2" id="button0x4217" onclick="button_click('0x42',this.id, 17);" ></a>

Собственно я явно указываю адрес платы, к которой нужно обращаться и номер порта.

Ах да, вот так сейчас выглядит контроллер:



После того, как все было установлено на место, все завелось с первого раза. А на следующий день возник непонятный эффект — если включить все светильники в спальне, начинает моргать весь свет в спальне с периодичностью раз в 2-3 секунды. Я просидел всю ночь, ковыряя код, на тестовом стенде такого косяка не было, значит проблема не в коде. Перерыл кучу форумов, в тоге на одном из них нашел описание похожего симптома, проверил догадку — и проблема исчезла. А все дело было в том, что я питал все три ардуины от компьютерного блока питания, 12В, и старенькие freeduino спокойно кушали и не жужжали, а arduino uno v3 — не могла, и при включении всех релешек у нее стабилизатор питания нагревался так, что прикоснуться нельзя было. Уменьшил напряжение питания до 5В 2А — и все заработало как надо.

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

Как и обещал, ссылки на гитхаб:

Веб-интерфейс
Скетчи для ардуино

Комментарии (49)


  1. ange007
    12.11.2015 11:39

    Ух ты ж ё…
    (перевод: Ого сколько проводов!)

    И как Вам жилось с таким «временным монстром» над головой?
    А так конечно работы у Вас уйма проделано, хорошо когда могёшь.


    1. kanakhin
      12.11.2015 12:02

      ну жилось как-то) все лучше, чем с алюминевой 50-летней…


  1. Mirn
    12.11.2015 11:51
    +1

    в ПУЭ скрытую проводку в деревянных конструкциях следует делать только в железной гофре или трубе


    1. citius
      12.11.2015 11:57

      Во-во, мне тоже глаз резануло. Не страшно в дереве силовые кабеля без защиты класть?


      1. kanakhin
        12.11.2015 12:02
        +2

        нет, в дереве еще разрешается класть проводку, если вокруг нее слой негорючего материала не тоньше 1см. а у меня под проводкой листы стекло-магнезитового листа толщиной 1см + все сверху залито гипсом
        ну и плюс еще кабель ГОСТ ВВГ-нг-LS, так что нет, не страшно…


        1. Urvin
          12.11.2015 12:11

          Витая пара — тоже нг?


          1. kanakhin
            12.11.2015 12:13

            нет конечно. но надеюсь, что вероятность какой-то проблемы в качественном цельном кабеле без соединений и с нагрузкой в 1-3 розетки стремится к нулю…


            1. Urvin
              12.11.2015 12:19

              Самовозгорание, понятно, в новой проводке маловероятно. Существуют еще внешние воздействия.
              Фиганул случайно перфоратором — ВВГ затух, а по рядом проложенной витухе — поползло.


              1. kanakhin
                12.11.2015 12:20

                ну для этого все размеры трасс в полу записаны отдельно на плане…


              1. 0serg
                12.11.2015 21:33

                Для этого случая УЗО и существуют


                1. Urvin
                  13.11.2015 07:56
                  +1

                  Для отключения УЗО/АВ нужно время, за это время искра уже начинает пожирать вкусный полиэтилен витой пары.
                  Свое дело УЗО сделало — спасло 220в проводку.


    1. kanakhin
      12.11.2015 12:04
      +2

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


    1. hostadmin
      12.11.2015 13:43

      Вообще не в метал.гофре, а ТОЛЬКО в трубе.


  1. hostadmin
    12.11.2015 13:44

    А что за выключатель, в который можно пружинку вставить?


    1. Urvin
      12.11.2015 13:49

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


      1. hostadmin
        12.11.2015 14:33

        Ну хочется-то конкретики по этой фразе:

        И еще нашел по совету в одной из статей на Хабре в Оби выключатели, в которые можно было вставить специальные пружинки и они превращались в выключатели без фиксации.


        1. Urvin
          12.11.2015 14:38

          Schneider Unica, Sedna, Legrand Valena, LK Vintage в качестве конкретики подойдут?


        1. uscr
          12.11.2015 14:56

          1. kanakhin
            13.11.2015 09:24

            Да, именно такие, LK60, и по цене очень гуманно. И я потом еще отдельно заказал 100 пружинок по 3.5 рубля за штуку, вот тут: www.220.ru/product/pruzhina-dlya-vyklyuchatelya-knopka-zvonka (правда цена поднялась до 3.87р)


        1. Nizametdinov
          12.11.2015 15:31

          Использовал готовые — ABB N2104.7 BL
          К ним надо рамку N2271.1 BL и суппорт N2271.9
          можете еще каталог abb zenith посмотреть.
          Прошлый раз задавал такой же вопрос — типа помогите куда копать с нормальной «кнопкой» на форуме электриков, ответ был — «да у всех в серии такие есть». Хрен там, у той же Unica нифига нету что бы две кнопки в один подрозетник. Есть управление жалюзи — но это не то, кнопки в разные стороны и по контактам не то.


  1. Neuronix
    12.11.2015 13:48
    -3

    Как-то всё кондово…


  1. Nizametdinov
    12.11.2015 15:20
    +1

    Люблю такие статьи «про велосипеды».
    Они очень ценны не самим решением, а описанием пути — как к нему пришел, какие грабли собрал.
    По реле — все правильно мыслишь. то что у тебя на фото скоро залипнет на коммутации всяких галогенных ламп, там стартовые токи огого.
    По импульсным реле — если решишь копать сюда, то бери с двойными контактами и с упр. напряжением 220в.
    Можно будет развязать управление светом от контроллера вообще. То есть кнопки будут коммутировать реле напрямую подавая 220 в на управляющую катушку импульсную — коммутируя обе контактных группы. Со второй контактной группы будешь «снимать» текущее состояние реле. Импульс кстати не требует у них большого тока — ими можно управлять через moc3063.


    1. kanakhin
      13.11.2015 09:25

      именно так и хочу сделать, но пока цена кусается — за каждое реле отдавать почти по 1тр… а если все делать «по-умному», то надо не только освещение через реле делать, но и розетки, чтобы ими тоже можно было управлять…


      1. Urvin
        13.11.2015 09:38

        Стационарно на розетках у Вас будут в основном стиральная машина, холодильник, телевизор и подобные устройства, которыми управлять по сценарию «включен-выключен» смысла никакого нет.


  1. meps
    12.11.2015 15:48
    +1

    А что будет, если управляющая система зависнет или обесточится? Прекратится любое управление светом или все погрузится во мрак?
    Кмк раз все равно от выключателей идут провода на общий щиток, можно было сделать их переключателями, а освещение коммутировать встречным переключателем на реле, как в стандартной схеме управления одной лампочкой с двух постов. Тогда если что — все выключатели просто «сбросятся» в свое обычное функциональное состояния, вкл-выкл с фиксацией.


    1. kanakhin
      13.11.2015 09:27

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


  1. olekl
    12.11.2015 16:32

    Что-то мне кажется, что ардуино и китайские шилды — самое слабое место… Тут бы посерьезнее контроллер использовать, нет? А интерфейс на скриншоте прикольно выглядит!


    1. kanakhin
      13.11.2015 09:28

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


  1. Winnie_The_Pooh
    12.11.2015 16:53
    +1

    Сброс Ардуины при посылке данных из компа связан с тем, что драйвер в компе открывает порт и посылает команду смены сигнала DTR. Это приводит к дрыганию ноги DTR конвертора FTDI FT232, что и приводит к сбросу. Чтобы этого избежать — можно снять джампер на плате Ардуино, если он есть или разрезать проводник и запаять джампер.
    Джампер надо будет ставить обратно при заливке прошивки.
    Без управления сбросом Ардуину не запрограммировать — процесс начинается как раз со сброса, чтобы передать управление загрузчику, который слушает сериал порт.


    1. Mirn
      12.11.2015 18:57
      +1

      Чтоб ФТДИ не дёргал DTR — надо отключить поиск Plug and Pray через его ком порт. Это делается в настройках компорта либо через реестр, раньше даже апликейшн нот был для этого, но сейчас либо выпилили либо я найти не могу.

      Но есть отладки в которых этот недостаток устранён, АРМка например раньше была — там стояла на сброс Аттини9 и она сбрасывала только получая особый код по DTR (что то типа манчестерского кодирования).

      Есть чипы типа CP2103 с специальным GPIO не зависящим от P&P процедур винды. Для прошивки шлюзов (см мои статьи) и прочих наших штук мы его используем, цена примерно как у фтди.


    1. kanakhin
      13.11.2015 09:31

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


  1. Winnie_The_Pooh
    12.11.2015 17:00

    Правильно ли я понял, что провода от выключателей напрямую идут ко входам ардуино? Т.е. никакой развязки от импульсных перенапряжений не предусмотрено?


    1. dimao79
      13.11.2015 09:07
      +1

      По ходу дела да. Очередной умный дом на ардуине от программиста.

      Автору — читать это Защита входов цифровой электроники
      еще это Помехоустойчивые устройства
      и вот это Защита входов ИС

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


      1. kanakhin
        13.11.2015 09:41

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


    1. kanakhin
      13.11.2015 09:40

      нет, не предусмотрено.


      1. Winnie_The_Pooh
        13.11.2015 09:54

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

        Из практики — у меня в туалете живет система предотвращения заливов, в ней имеется батарейное питание, резервные ионисторы и внешний источник питания. Когда система переходит с внешнего на батарейное питание и обратно — она пищит. За несколько лет эксплуатации я замечал такие писки, и наконец отследил источник помехи — выключение холодильника. Т.е. в момент выключения холодильника он давал в сеть такую помеху, что срывалась работа штатного источника питания. По уму надо бы поменять источник, но он глубоко зарыт, защищен от брызг и лезть туда не хотелось. Решил проблему одеванием на шнур питания холодильника ферритового кольца, купленного в Буром Медведе. Это такие же фильтры, как стоят на кабелях от мониторов, усб устройств и т.п.

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


        1. kanakhin
          13.11.2015 09:59

          признаться честно, я в этом не очень силен, но несмотря на то, что все кабели по сути приходят к щитку в одном пучке, а дома есть и кондиционеры, и холодильник, и пылесос мощный, и мясорубка, и хлебопечка, и стиралка-посудомойка — ни разу за год глюков не замечено было…


          1. Winnie_The_Pooh
            13.11.2015 10:16

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

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

            ПОка Вам везет, но так бывает не всегда. Бывает и сварка в соседней квартире и странные соседи, заземляющие стиралки на батареи.

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

            Меня, как практикующего радиоинженера, с одной стороны пугает ваша смелость в управлении всем и вся, а с другой — смелость города берет :)))

            Думаю, в вашем случае неплохо бы продумать план на случай отказа — типа какие разъемы отсоединить и скажем заглушки на них иметь, чтобы получить упрощенную систему без МК.


            1. kanakhin
              13.11.2015 10:18

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


        1. dimao79
          13.11.2015 11:45

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

          Причем, что самое паршивое — лезть вся эта гадость будет не только, и не столько через питание.


  1. msfs11
    12.11.2015 18:13

    Вы очень старались, чтобы предсказания от Рэя Курцвейла на 2019 год не сбылись.


    1. kanakhin
      13.11.2015 09:35

      а я считаю, что надежнее кабеля пока ничего не придумано…


  1. ShtAnigga
    12.11.2015 21:31

    Немножко проводов или киберпанковское МЯСО!
    Автор, доводи до логического завершения. Очень интересно глянуть на итог сего творческого рукоделия.


  1. kanakhin
    13.11.2015 09:48

    Да, меня тут спрашивали про схему проводки, вот могу выложить примерное расположение точек. Все уже немного поменялось, но общий смысл остался прежним. Там, где написано около точки Группа такая-то — это значит, что все точки из этой группы соединены шлейфом и кабель от ближайшей к щитку точки уходит в щиток. В остальных случаях от каждой точки идет свой кабель в щиток. Распечатанная схема размером А0 висит на стене, на ней делаются пометки, такие как расстояния до штраб, номера кабелей и т.п., потом все перенесу на схему и распечатаю еще раз.
    image


  1. ay8910
    13.11.2015 14:58

    Для чего при такой схеме (фактически силовой ключ в щитке) прокладывать силовые же провода к выключателям? Ведь выключатели у Вас только управляют контроллерами… На случай возврата к традиционной схеме?

    По поводу «Умного дома» вообще и освещения в частности посмотрите вот этот сайт, если не видели ещё.


    1. kanakhin
      17.11.2015 13:06

      да, именно на этот случай.
      а сайт видел конечно, хороший сайт.


  1. Bluefox
    14.11.2015 01:22

    У меня ушло 2 минуты, что бы создать такой интерфейс.

    Большой GIF
    image


    1. kanakhin
      17.11.2015 13:08

      спасибо, посмотрю, весьма интересно.


    1. kanakhin
      17.11.2015 13:10

      спасибо, посмотрю, весьма интересно.