Контроллер освещения на Arduino

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Контроллер освещения на Arduino

Сообщение sergejey » Пт окт 03, 2014 2:36 pm

Для управления освещением на этаже я использую следующие компоненты:

* WiFi-роутер DLink DIR320 с настройками узла автоматики
* Arduino Mega
* Блок реле (16 шт)
* Обычные выключатели

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

Изображение

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

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

Код прошивки контроллера достаточно простой.
Скетч контроллераПоказать
#include <EEPROM.h> //Needed to access the eeprom read write functions

#define PIN_LED (13) // INDICATOR

unsigned int unique_device_id = 0;
unsigned int packet_received_id = 0;

long int uptime = 0;
long int old_uptime = 0;

String inData;

#define TOTAL_OUTPUTS (16)
#define TOTAL_INPUTS (10)
int outputPins[TOTAL_OUTPUTS] = {22, 24 , 26, 28, 30, 32, 34 ,36 , 23, 25, 27, 29, 31, 33, 35, 37};
int inputPins[TOTAL_INPUTS] = {38, 39, 40, 41, 43, 45, 47, 49, 51, 53};
int directLinkedPins[TOTAL_INPUTS] = {22,24,26,28,30,32,34,36,23,25};

int inputPinsStatus[TOTAL_OUTPUTS];

struct SEND_DATA_STRUCTURE {
//put your variable definitions here for the data you want to send
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
//Struct can'e be bigger then 26 bytes for VirtualWire version
unsigned int device_id;
unsigned int destination_id;
unsigned int packet_id;
byte command;
int data;
};

SEND_DATA_STRUCTURE mydata;
//EasyTransferVirtualWire ET;

//This function will write a 2 byte integer to the eeprom at the specified address and address + 1
void EEPROMWriteInt(int p_address, unsigned int p_value)
{
byte lowByte = ((p_value >> 0) & 0xFF);
byte highByte = ((p_value >> 8) & 0xFF);

EEPROM.write(p_address, lowByte);
EEPROM.write(p_address + 1, highByte);
}

//This function will read a 2 byte integer from the eeprom at the specified address and address + 1
unsigned int EEPROMReadInt(int p_address)
{
byte lowByte = EEPROM.read(p_address);
byte highByte = EEPROM.read(p_address + 1);

return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}


void setup()
{
randomSeed(analogRead(0));
pinMode(PIN_LED,OUTPUT);
Serial.begin(9600);


Serial.print("Initializing inputs ... ");
int i;
for (i = 0; i < TOTAL_INPUTS; i = i + 1) {
pinMode(inputPins,INPUT);
inputPinsStatus=digitalRead(inputPins);
}
Serial.println("DONE");

Serial.print("Initializing outputs ... ");
for (i = 0; i < TOTAL_OUTPUTS; i = i + 1) {
turnOffPin(outputPins);
pinMode(outputPins,OUTPUT);
turnOffPin(outputPins);
}
Serial.println("DONE");

// Device ID
Serial.print("Getting Device ID... ");
unique_device_id=EEPROMReadInt(0);
if (unique_device_id<10000 || unique_device_id>60000 || unique_device_id==26807) {
Serial.print("N/A, updating... ");
unique_device_id=random(10000, 60000);
EEPROMWriteInt(0, unique_device_id);
}
Serial.println(unique_device_id);

}


void blinking(int count) {
for(int i=0;i<count;i++) {
digitalWrite(PIN_LED, HIGH);
delay(1000);
digitalWrite(PIN_LED, LOW);
delay(1000);
}
}

void turnOnPin(int number) {
Serial.print("OUT");
Serial.print(number);
Serial.println(" set to 1");
digitalWrite(number, LOW);
}

void turnOffPin(int number) {
Serial.print("OUT");
Serial.print(number);
Serial.println(" set to 0");
digitalWrite(number, HIGH);
}

void loop() {



int i;
for (i = 0; i < TOTAL_INPUTS; i = i + 1) {
int currentStatus=digitalRead(inputPins);
if (currentStatus!=inputPinsStatus) {
delay(100); // de-bounce delay
int currentStatusUpdated=digitalRead(inputPins);
if (currentStatusUpdated==currentStatus) {
inputPinsStatus=currentStatus;
Serial.print("IN");
Serial.print(i);
Serial.print(" set to ");
Serial.println(currentStatus);
if (directLinkedPins[i]!=0 && currentStatus==HIGH) {
turnOnPin(directLinkedPins[i]);
}
if (directLinkedPins[i]!=0 && currentStatus==LOW) {
turnOffPin(directLinkedPins[i]);
}
}
}
}

uptime=round(millis()/1000);
if (uptime!=old_uptime) {
Serial.print("Uptime: ");
Serial.println(uptime);
old_uptime=uptime;
}


if (Serial.available()) {
char c=Serial.read();
if (c == '\n' || c == ';')
{
Serial.println(inData);
int commandProcessed=0;

if (inData.equals("blink")) {
commandProcessed=1;
Serial.println("BLINKING!");
blinking(3);
}

if (inData.startsWith("turnon")) {
commandProcessed=1;
inData.replace("turnon","");
turnOnPin(outputPins[inData.toInt()]);
}

if (inData.startsWith("turnoff")) {
commandProcessed=1;
inData.replace("turnoff","");
turnOffPin(outputPins[inData.toInt()]);
}

if (inData.startsWith("status")) {
commandProcessed=1;
inData.replace("status","");
int currentStatus=digitalRead(inData.toInt());
Serial.println(currentStatus);
}

if (commandProcessed==0) {
Serial.print("Unknown command: ");
Serial.println(inData);
}

inData="";
Serial.flush();
} else {
inData += (c);
}
}

}


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

Изображение

В систему заведены объекты lcw0-lcw10 (пока не все реле подключены) класса Relays подкласса LightController1:
Изображение

Свойства класса (дополнительно к родительскому классу добавлено свойство Pin):
Изображение

Методы класса:
Изображение
(метод changed как раз используется в сработке условия wifi-узла)

Код метода changed:

Код: Выделить всё

$this->setProperty('status',$params['status']);
$this->callMethod('onChange'); 
Код метода turnOff:

Код: Выделить всё

getURL("http://192.168.0.67/cgi-bin/master?op=send&line=turnoff".$this->getProperty('Pin').";",0);
$this->setProperty("status",0); 
Код метода turnOn:

Код: Выделить всё

getURL("http://192.168.0.67/cgi-bin/master?op=send&line=turnon".$this->getProperty('Pin').";",0);
$this->setProperty("status",1); 
Методы turnOff/turnOff отправляют запрос в wifi-узел, а тот передаёт команду контроллеру (стандартный функционал), а контроллер команду обрабатывает и переключает соответствующее реле.

В интерфейсе системы оно представлено в меню:
Изображение

Пример настройки одного выключателя в меню:
Изображение

В сценариях, соответственно, можно использовать callMethod('lcw1.turnOff'); или callMethod('lcw1.turnOn'); для выключения/включения отдельного элемента освещения.

P.S. Контроллер можно было и по-меньше, но я туда ещё планирую поставить каких датчиков (температуры, CO2 и т.п.), раз уж всё равно подключен и в гараже находится.
За это сообщение автора sergejey поблагодарили (всего 5):
ErmolenkoM (Ср окт 08, 2014 5:38 pm) • shemnik69 (Вс окт 26, 2014 10:25 am) • sashmen (Сб дек 27, 2014 5:24 pm) • mirsum (Ср дек 31, 2014 9:41 am) • Frid (Вт июн 05, 2018 12:49 am)
Рейтинг: 5.81%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Контроллер освещения на Arduino

Сообщение shemnik69 » Сб окт 25, 2014 11:58 pm

Спасибо!!! Сергей за подробный пример.
Взял второй роутер MR 3020 настроил как описано (с кофе и бубном) вроде реагирует на "конекте" теперь пробую вязать его с внешним модулем.
Только у меня он на Atmega32A (которая 40 ножек) так вот, данный контроллер гораздо интереснее "Ардуиновского" 328 (и дешевле тоже) и по количеству регистров более универсален.
Единственное нужно USB/USART но это решаемо например через USART /rs485 (MR3020) и тоже самый адаптер на самой атмеге. Что позволит ее удалить от роутера .
Со скетчем, вроде вопрос решил (через прошитый загрузчик Ардуино) а вот с настройками правил ....???
если будут вопросы прошу пояснить. Меня интересует сбор данных от датчиков температуры (на атмеге их 5 шт. и 6 контактных (датчики и ДД) а также планирую управляемые реле если разберусь в правилах. :D
Заранее спасибо.
С Уважением!
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Контроллер освещения на Arduino

Сообщение shemnik69 » Пт окт 31, 2014 3:00 pm

В продолжении темы.
Прилагаю печатную плату специализированного аналога контроллера который по своим функциям аналогичен предложенного Сергеем.
В основе Atmega 32A. Это 40 Pin микросхема с 32 Кб памяти и 32 портами вход выход. Т.е по сути то что нужно. Если рассматривать ее с позиции сравнения c Arduino MEGA то разница конечно в цене .. по количеству вводов примерно тоже самое.
В данном модуле, так-же как уже было описано в модуле который управляет воротами, присутствуют согласующие оптроны, и специализированные ключи ULN 2003A для управления внешними Реле.
Такая конструкция обоснована тем, что в главном блоке, где установлен сервер и данная плата, смонтированы 2 линейки реле на 24 в (по 11 шт) в каждой (с запасом).
Сами реле давно управляют разными устройствами (лампы. двигатели вентиляторов, ТЭН- ы бойлеров, прожектора и пр. ) а поскольку домашняя сеть разделенная. (уже об этом писал), т.е силовая и управляющая на 24 в. Именно в эту сеть данный модуль и будет встроен, поэтому у него установлены соответствующие контактные зажимы (так проще).
Питание, это либо отдельное только 12 в. либо и 5 и 12 (просто существующий в щите блок питания 380/24/12/5 в) но для повторения другими установлен стабилизатор 12/5 в.
На плате также есть контактные площадки, это для возможных дополнительных деталей которые могут быть смонтированы в дальнейшем.
Связь с сервером через USART/RS232, причем в схеме предусмотрена схема перезапуска в случае обращения средствами IDE Arduino к плате.
В самой МК прошивается начальный загрузчик (http://zelectro.cc/Bootloaders_Arduino) и далее с платой работаем как с обычной ардуино, только в программе выбрать соответствующий контроллер.
В остальном по свой функциональности данный контролер практически ни чем не отличается от прототипа.
И еще,,, ОГРОМНОЕ СПАСИБО ВАМ Сергей за идею! :D
Вложения
Atmega32a.zip
(88.28 КБ) 373 скачивания
За это сообщение автора shemnik69 поблагодарил:
sergejey (Пт окт 31, 2014 3:19 pm)
Рейтинг: 1.16%
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Контроллер освещения на Arduino

Сообщение shemnik69 » Пт окт 31, 2014 9:06 pm

Детали:
Размер 100*150 мм
МК Атмега 32А, как залить в нее программу можно подробно прочитать вот тут, описано подробно и очень хорошо. http://www.radiohlam.ru/forum/viewtopic.php?f=12&t=3355 И еще вот тут http://www.instructables.com/id/Using-A ... duino-IDE/
По большому счету ничего сложного если есть плата например UNO или Nano и макетная плата, если нет то можно воспользоваться программаторами или другими способом...
Разъемы можно применить любые в данном варианте применяются линейки по 13/9/6 плашек такие зажимы IBM (достались от старых плат контроллеров применяемых в энергетике. Но их расстояние стандартное поэтому подойдут любые с H-7.5 мм.
Оптроны TLP521-2 (очень хорошие) можно заменить на одиночные TLP-521
Резисторы обычные их номиналы "стандартные" и по сути взяты из рекомендаций https://dl.dropboxusercontent.com/u/322 ... ctions.pdf
Электронные ключи ULN2003A советую использовать только такие поскольку они оптимизированы под напряжение TTL 0-5 v,
Кварц на 16 Мгц в усеченном корпусе высотой 5 мм. Конвертер USART/RS232 это MAX232 N (CPE) см. спецификацию поскольку несколько различны конденсаторы. Но плата подходит под оба варианта. Резисторные сборки, 10*10К 2 шт. можно заменить просто резисторами на 10 кОм установив их и спаяв в линию вертикально.
Разъем COM выполнен стандартным для простоты. Разъем питания, для простоты взят с старого CD привода поскольку он не дефицитный и распространен, а к нему проводники и ответная часть от любого компьютерного блока питания.
Итак если все рекомендации выполнить то в руках у Вас будет отличный контроллер управления освещением и другими процессами собранный Вашими руками и который доставит Вам радость. Про скетч не пишу поскольку тут столько вариантов :D что страниц форума не хватит... :D
С Уважением!
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Контроллер освещения на Arduino

Сообщение shemnik69 » Ср ноя 19, 2014 11:25 pm

Доброе время суток!
Победил я Atmeg-y 32 :D
Учитывая что на форуме не все асы в программировании как и я то расскажу весь путь самурая...
Для начала посмотрим что такое Atmega 32 (или 64 (DIP 40) учитывая что данные МК просто лежат на витринах грех их не использовать. Во вложении есть фай лик соответствия цифровых выходов микросхемы с аналогами Arduino. Что это дает?
Просто это дает нам возможность используя стандартную IDE писать скетчи и также их прошивать. А поскольку данный МК "многоногий" и почти по своим контактам приближен к мега 256 (приближен но не совсем) то это дает очень большие возможности.
Итак. Берем любую плату Ардуино (я взял UNO)
Подключаем ардуину, устанавливаем дрова, в диспетчере устройств смотрим ком порт на который повисла ардуина, если далеко, то меняем на поближе. В Arduino IDE выбираем нужный порт и нужную плату. Заливам скетч(в архиве ArduinoISP.pde), прям в скетче написаны пины ардуины.
Отключаем питание и подключаем выводы UNO № 10-reset, 11-MOSI, 12-MISO, 13-SCK в этом соответствии подключаем например макетку с Atmega 32 и соединяем проводками т.е выводы 9-reset, 6-MOSI, 7-MISO, 8-SCK вывод 12 и 13 ставим кварц на 4-8 мГц (я ставил без конденсаторов). Подаем питание 5 в на 10 и 30 а также GND на 11 и 31 ножки. Все.
Включаем все это в компьютер и подключаем IDE. Теперь выбираем в IDE плату Atmega 32 b и прошиваем загрузчик.
Все теперь Атмега уже стала Ардуино по функциям можно писать скетч.
Обращаю Ваше внимание что данный контроллер хоть и многоногий но всего 32 кБ этого как правило достаточно для написания довольно значительного скетча. Если не хватит то можно поставить Atmegu 64 (DIP 40) .
Данный материал не панацея и не прямая замена скажем заводского контроллера на платах типа Ардуино. а ее ,ближайший функциональный аналог с учетом минимальной обвязки для выполнения функций опроса кнопок (выключателей) и прямым управлением реле (ток до 500 мА и напряжении 12-24 в) а учитывая что данный контроллер узко специальный и расчитан на скрытый монтаж в щит его красота дело второстепенное главное простотаи функциональность т.е он позиционирован как "солдат" то ставить на его место плату стоимостью ...00000 и более р. при себестоимости функционального аналога в 300 р. я считаю немного не обоснованно. Это мое мнение.

Мнение свое не навязываю, а показываю возможный вариант реализации аналога. а кто выберет или нет это его право. . :D
С Уважением. И еще раз спасибо Сергею за саму идею!... :D
Вложения
atmega644p.zip
(70.95 КБ) 338 скачиваний
Atmega 32.png
Atmega 32.png (10.96 КБ) 25446 просмотров
dredius
Сообщения: 39
Зарегистрирован: Сб ноя 22, 2014 10:25 pm
Откуда: Дмитров
Благодарил (а): 2 раза
Поблагодарили: 9 раз

Re: Контроллер освещения на Arduino

Сообщение dredius » Вт дек 30, 2014 10:33 pm

а как бы сюда еще бы прикрутить Ethernet shield? я просто не силен в этом деле ток учусь :)
Banana pi, Arduino mega 2560 + Ethernet shield, Arduino nano, Majordomo v.0.8.0.b

MajorDomo на Ubuntu Server 14.04 + Nettop Qoo intel Atom D510

Спасение утопающих - дело рук самих утопающих...
mirsum
Сообщения: 65
Зарегистрирован: Вс янв 12, 2014 12:54 pm
Откуда: Белгород
Благодарил (а): 110 раз
Поблагодарили: 1 раз

Re: Контроллер освещения на Arduino

Сообщение mirsum » Ср дек 31, 2014 9:50 am

Тут есть один минус, провода со всего дома надо заводить в один щиток.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Контроллер освещения на Arduino

Сообщение sergejey » Ср дек 31, 2014 10:52 am

mirsum писал(а):Тут есть один минус, провода со всего дома надо заводить в один щиток.
Да, именно так. Но мне было проще, т.к. когда дом только строил изначально так делал -- сначало скоммутировал всё в щитке по классической схеме, а потом уже переделал на описанный контроллер с реле.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Контроллер освещения на Arduino

Сообщение shemnik69 » Ср дек 31, 2014 12:51 pm

Почему? Минус?
Не обязательно со всего дома, используйте промежуточные и не такие мощные. Например Nano прекрасно работает. Как вариант см . http://cyber-place.ru/showthread.php?t=100
По сути тоже самое. там же есть пример скетча и описано взаимодействие с роутером.
Несколько таких контроллеров могут увязать любую задачу с любым количеством датчиков (выключателей).
Аватара пользователя
shemnik69
Сообщения: 590
Зарегистрирован: Пн дек 24, 2012 3:01 pm
Откуда: Саратов Saratov
Благодарил (а): 67 раз
Поблагодарили: 63 раза

Re: Контроллер освещения на Arduino

Сообщение shemnik69 » Пт янв 02, 2015 8:03 pm

Сергей!
Прошил свой самодельный контроллер. Скетч взят со страницы. Изменено только количество вход выход и изменены входные порты т.е под мк Atmega 32A.
Скетч с компилировался (IDE Arduino 1.5.2-r2 в которую добавлена МК Мега 32А) и прошился без проблем? Что меня поставило в тупик?
Скажу честно ..как?
Если есть возможность можно краткое описание его логики... для понимания.
Зачем вот это?
void setup()
{
randomSeed(analogRead(0));
pinMode(PIN_LED,OUTPUT);
Serial.begin(9600);

Т.е опрос аналогового порта? На моем контроллере, такие есть и они совмещены с выходом на реле. И я ничего не понимаю зачем это.
В тоже время сам скетч работает! Чудеса..может так надо Новый год!... :D
Вложения
sketch_janAtmega32a.zip
(1.63 КБ) 295 скачиваний
Ответить