Перейти к содержанию
    

Прошу знающих посоветовать с чего начать. Делать буду для себя.

Идеи такие:

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

- дисплей ЖК 16х2

- кнопки управления стрелка вверх, вниз, выбор и назад, т.е. всего 4 кнопки.

- датчик температуры для каждой панели

- управляющая микросхемка (атмега8 или 16 наверное)

- датчик ИК для приема комманд с пульта ДУ

А также есть исполнительные устройства, например в выключателе освещения, которые слушают, что им говорят панели и выполняют команды (например выключить свет).

 

Вопросы:

Какие мк использовать? (для панелей наверное что нибудь из серии мега а для исполнительных - тини)

Как организовать между мк одноранговую сеть? (желательно удобную для прокладки в стенах)

Как узнать какую систему комманд использует пульт? (от тв-тюнера маленький плоский, на одной таблетке-батарейке)

Изменено пользователем ps1x

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ATtiny25/45/85 есть встроенный датчик температуры. А вообще - любые чипы, у которых хватит ног и ресурсов под задачу.

Сеть - 2-проводная шина RS-485, аппаратный UART подключается через м/с-преобразователь (MAX487).

По ИК пультам море информации в интернете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ATtiny25/45/85 есть встроенный датчик температуры.

- за это спасибо

Сеть - 2-проводная шина RS-485, аппаратный UART подключается через м/с-преобразователь (MAX487).
- с ее помощью можно организовать такую связь: исполнительное устройство --- панель---- панель. Нажать кнопку на последне панели, получить результат в виде "выполнено" от исполнительного устройства? т.е. панели имеют одинаковый приоритет, исполнительные устройства подключаются к определенной панели и общаются только с ней. Или лучше совместить исполнительное устройство и панель - налицо экономия, но сразу теряется гибкость системы.

 

По поводу пульта - информации по этому экземплярчику, к сожалению, не обнаружил, может есть другой метод? Ведь есть же программы которые можно надрессировать на любые пульты... Только как это реализовать в Меге :blink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошее описание некоторых популярных ИК протоколов

http://www.xs4all.nl/~sbp/knowledge/ir/ir.htm

 

По поводу интерфейса все намного сложнее. Надо сначала определиться с логикой обмена:

 

1. Мастер-слэйв, логическая звезда.

 

В сети есть только один мастер, все остальные - слуги. Разговор всегда происходит между мастером и одним из млуг, слуги между собой сами разговаривать не могут. Мастер по очереди опрашивает всех слуг. Если у слуги есть новая информация (например, нажата кнопка), мастер получает ее, затем по своим таблицам смотрит кому она нужна, и рассылает исполнительным механизмам.

 

Достоинства: простая реализация; отсутствие столкновений, легкои надежно делается на RS485

 

Недостатки: для получения хорошего времени реакции скорости обмена должны быть довольно большими (порядка 100кбит/сек); центральный мастер является критическим звеном, если мастер помрет - ничего работать не будет.

 

2. Peer-to-peer

 

В каждый момент времени в сети есть один координатор. Координатор по очереди срашивает остальные узлы "тебе нужно управление?". Если да, то узел получает от координатора управление (токен) на какое-то время. После этого узел сам передает другим узлам информацию, по окончании обмена рапортует координатору.

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

 

Достоинства: отсутствие столкновений, легко и надежно делается на RS485; обмен может быть ускорен по сравнению с (1), особенно если надо обмениваться большими пакетами; надежность выше, т.к. обмен не зависит от работоспособности одного узла.

 

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

 

3. Анархия - мать порядка (CSMA)

 

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

 

Здесь напридумывано много вариантов, например

 

3.1. "По фигу, рано или поздно пробьемся"

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

 

3.2. Обнаружение столкновений (CSMA/CD)

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

 

3.3. Избегание столкновений (CSMA/CA)

Линия работает по принципу "монтажного ИЛИ", один уровень "сильнее" другого. Узлы "слушают" каждый бит во время передачи и обнаруживают, что кто-то передает "сильный" уровень, в то время как они сами транслируют "слабый" уровень. После этого они тихо отцепляются от линии и не мешают "более старшим ребятам" разговаривать (первые биты в пакете задают приоритет).

 

Последний вариант - самый интересный. Так (или примерно так) работают CAN, EIB, C-Bus. При этом физическая скорость обмена может быть очень низкой (в C-Bus, например, всего 5 кбит/сек), а реактивность получается очень высокой, особенно если информация передается не одному узлу (как в том же LON в обычном режиме), а сразу всем, широковещательно (как в EIB, C-Bus и в кривовато реализованном широковещательном режиме LON).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо за подробное разъяснение протоколов связи, думаю реализовать МАСТЕР - СЛЕЙВ, ибо опыта пока маловато, а поскольку делаю для себя, если что починить всегда можно ) а время реакции не важно.

 

По поводу электропроводки - есть специальные микросхемки которые этим занимаются? Если прийдется городить - паять то я пас. К томуже зачастую бывает что разные розетки в одной квартире идут от разных фаз - чтобы распределять нагрузку. Думаю, этот вариант окажется дорогим, сложным и малопригодным в моем случае (ИМХО).

 

По поводу ИК - еслиб я знал какой протокол в нем используется, я и не спрашивал бы ))

Есть программа для кпк которая с помошью встроенного в кпк ИРДА может натренироваться пулять в любой телевизор. Там это работает так - нажимаем вирт. кнопку на кпк, которую нужно запрограммировать, затем жмем соответствующую кнопку на пульте д.у. она запоминает последовательность импульсов, думаю, прийдется делать что-либо подобное, но как это запихнуть в мегу? ресурсов то мало.... :glare:

 

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

Вот так?::

слейв...... _______ ...........слейв

=======|.мега...|=========

................|мастер|....................

................|..........|....................

=======|..........|....................

слейв........---------.....................

Изменено пользователем ps1x

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и еще как будет физически реализована панель управления (как я предполагаю):

PORTD - дисплей

PORTB - cвязь и кнопки

PORTC- датчики и устройства

 

Хватит ли ножек у Меги8 для всего этого хозяйства?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вот так?::

Например, вот так

RS485
|
|--master
|
|--slave
|
|--slave
|
...
|
|--slave

Изменено пользователем =AK=

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Т.е. Мастер циклически опрашивает слейвы, если есть флаг наличия данных, то он общается с этим слейвом более детально?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ли у кого нибудь ссылка на понятный для неокрепшего разума алгритм меню?

Тоесть меню вида:

Главное меню

--Время

... --Уст. Дата

... --Уст. Время

--Устройства

... --Чайник

...... --Включить

...... --Выключить

...... --Таймер

... --Обогрев

...... --Включить

...... --Выключить

...... --Таймер

... --Кондер

...... --Включить

...... --Выключить

...... --Таймер

--Будильник

... --Время

--Температура

--Свет

... --Включить

... --Выключить

... --Таймер

 

Если используются кнопки вниз-вверх, выбор, отмена.

Изменено пользователем ps1x

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему код:

unsigned char kod;

char disp1[16],disp2[16];

unsigned int cur;

struct menu // Declare PERSON struct type

{

char menu1[16];

char menu2[16];

char menu3[16];

char menu4[16];

char menu5[16];

} family_member; // Define object of type PERSON

 

 

// Timer 0 overflow interrupt service routine

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

switch (kod) {

case 'u':

if (cur==0){cur=4;}

cur--;

switch (cur) {

case 0:

disp1="d";

disp2='Preferences';

break;

};

 

break;

case 'd':

 

break;

case 's':

 

break;

case 'c':

 

break;

 

};

 

}

выдает ошибку в строчках:

disp1="d";

disp2='Preferences

 

--- must be lvalue

????

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

выдает ошибку в строчках:

disp1="d";

disp2='Preferences

 

--- must be lvalue

????

 

вы перепутали понятие строки и понятие одного символа.

в ДВОЙНЫХ ковычках пишутся СТРОКИ

в ОДИНАРНЫХ ковычках пишется ОДИН символ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

unsigned char kod;

char disp1[16];

unsigned int cur;

struct menu // Declare PERSON struct type

{

char menu1[16];

char menu2[16];

char menu3[16];

char menu4[16];

char menu5[16];

} family_member; // Define object of type PERSON

 

 

// Timer 0 overflow interrupt service routine

interrupt [TIM0_OVF] void timer0_ovf_isr(void)

{

switch (kod) {

case 'u':

if (cur==0){cur=4;}

cur--;

switch (cur) {

case 0:

disp1="Dsad";

 

break;

};

 

При двойных кавычках тоже ругается... (

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При двойных кавычках тоже ругается... (

Либо:

char *disp1;

 

либо, если нужен именно буфер для других целей:

 

strcpy( &disp1[0], "abracadabra" );

 

либо, дабы избежать потенциальных ошибок:

strncpy( &disp1[0], "abracadabra", sizeof(disp1)-1 );

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 
char *disp1;
disp1="Не работает";

- такой код выдает ошибку "pointers are to different memory classes"

 

ДОБАВЛЕННО:

а такой вроде как работает

char *disp1;
*disp1="Не работает";

Изменено пользователем ps1x

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...