Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Проекты

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.02.2013, 11:07   #11
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Итак по пинам
2 цифровых входа с кнопок-D2 и D3
Датчик тока-D6
ИК датчик - D9
2 выхода для симмисторов D4 и В5
1 выход для сигнального диодика D13
IRQ RF-2400 D10
остальные пины RF согласно http://www.cyber-place.ru/showthread...hlight=rf-2400
Bulatovor вне форума   Ответить с цитированием
Старый 01.02.2013, 13:10   #12
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Посмотрел либу Mirf там пин IRQ RF модуля не используется
Если будет использоваться режим Sleep контроллера, то тогда эта библиотека не подойдет,
так как IRQ сигнал должен будет выводить контроллер из сна
Из даташита на модуль
Цитата:
При получении достоверных данных (совпадении адреса и контрольной суммы CRC), BK2421 сохранит данные в регистре RX FIFO, а регистр RX_DR выставит низкий логический уровень на пине IRQ.
В референсном коде INHAOS для AVR контроллеров
пины подключены следующим образом
CE--D9
CSN--D10
MOSI--D11
MISO--D12
SCK--D13
IRQ--D2

Если кнопки выключателя не будут использовать режим одновременного нажатия, то можно их подключить к входу D3 через диода и к любым двум цифровым пинам
Или попробовать использовать прерывания PCINT для этого нужно установить библиотеку PinChangeInt
Admin вне форума   Ответить с цитированием
Старый 01.02.2013, 21:20   #13
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Т.е. в принципе если опрашивать переодически RF-2400, то irq можно вообще не подключать, а что касается пинов, то лучше все же оставить D7 и D8? ну а если задумаю использовать референсные коды то в них можно будет исправить распиновку.
Т.е у меня остается 3 прерывания -Ик датчик и выключатели. Думается что выключатели оставить на внешних, а ИК датчик поставить прерывание по PCINT
Bulatovor вне форума   Ответить с цитированием
Старый 01.02.2013, 21:47   #14
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
Т.е. в принципе если опрашивать переодически RF-2400, то irq можно вообще не подключать
Да

Цитата:
а что касается пинов, то лучше все же оставить D7 и D8?
Да

Цитата:
ну а если задумаю использовать референсные коды то в них можно будет исправить распиновку.
В любом коде это можно подправить

Цитата:
Т.е у меня остается 3 прерывания -Ик датчик и выключатели. Думается что выключатели оставить на внешних, а ИК датчик поставить прерывание по PCINT
ИК датчик или ИК приемник?
Admin вне форума   Ответить с цитированием
Старый 01.02.2013, 22:05   #15
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Приемник, для управления с пультов
Bulatovor вне форума   Ответить с цитированием
Старый 09.02.2013, 18:34   #16
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Ну вот, 8 дней проект не двигался, потратил я их с пользой, начал изучение языка программирования Arduino ну заодно и С. Получилась первая программка которую я написал самостоятельно(бейси� � в школе ровно 20 лет назад не в счет хоть и похвальная грамота по этому поводу имеется), ногами не пинать, конструктивная критика приветствуется. О программе: программа управляет двумя силовыми реле( хотелось сразу диммером по схеме Admina, но Proteus смоделировать 40 мл сек прерывания не может -грит не хватает мощи, а железо все идет, так что тестировать не начем) при помощи двух кнопок - однократное нажатие кнопки включает\выключает реле, двукратное выключает оба реле через 20 секунд, реализовано еще фиксация длинного нажатия, но это на будущее для диммера, пока просто сообщение в терминал. Ну и 2 нажатия это для примера, количество прописываемых нажатий можно увеличивать ограничиваясь только объемом памяти -если конкретно, то при прикручивании кода от IR приемника планируется реализовать определения 5 нажатия для выхода в режим обучения пульту ДУ.
Первоначально программа была написана на языке Arduino, потом были поиски путей оптимизации -прикручена библиотека Nanopin(кстати выложенный в теме многоканальный диммер файлик имеет повреждение в предпоследней строке, так для порядку надо бы поправить - или может это так задумано?), следующим шагом стало прямое чтение с портов и прямая инверсия портов. Получилась полная каша, в связи с чем принято решение дополнить библиотеку Nanopin функциями Dx_Inv -инверсия состояния пина и функциями чтения состояния портов взамен digitalRead, назвал библиотечку Nanopin2. Освоено использование Таймера

Ну вот и программа на суд общественности - много комментов, для того что бы таким чайникам как я было понятно, что откуда берется и самому не забыть
PHP код:
// Управления кнопками при помощи прерываний PCINT

#include "nanopins2.h" //подключаем библиотеку быстрого управления пинами
#include <MsTimer2.h> // подключаем библиотеку прерывания по Timer2

int qbutton1 ;        //  начальное значение счетчика нажатий на кнопку 1
int qbutton2 ;       //  начальное значение счетчика нажатий на кнопку 2

int b1millis;           // время последнего пррывания по кнопке 1
int b2millis;          // время последнего пррывания по кнопке 2

int tcl 1000// время, после которого считается что серия нажатий на кнопки окончена -временно для отладки -потом можно заменить на твердую цифру
int tc0 2000// время, после которого считается что серия нажатий на кнопки окончена и никакими переменными счетчик кнопок не обнулен -временно для отладки -потом можно заменить на твердую цифру

void setup() {
  
D4_Out//Настраиваем порт на выход реле 1
  
D5_Out//Настраиваем порт на выход реле 2
  
D4_LowD5_Low;  //установить на выходах низкий уровень сигнала
  
D6_In//настраиваем порт на вход для кнопки 2
  
D9_In//настраиваем порт на вход для кнопки 1 
  
D6_HighD9_High;  //установить на входах высокий уровень и подключить резистор 
   
     
 
PCICR  |= (1<<PCIE2) | (0<<PCIE1) | (1<<PCIE0); // разрешение прерываний с портов B (PCINT[7:0]) и   D (PCINT[23:16]) и  запрет C (PCINT[14:8])
 
PCMSK0 |= (0<<PCINT7)  | (0<<PCINT6)  | (0<<PCINT5)  | (0<<PCINT4)  | (0<<PCINT3)  | (0<<PCINT2)  | (1<<PCINT1)  | (0<<PCINT0);
 
// маскирование ноги 9 на порту B -разрешение на прерывание, остальные запрет
 
PCMSK2 |= (0<<PCINT23) | (1<<PCINT22) | (0<<PCINT21) | (0<<PCINT20) | (0<<PCINT19) | (0<<PCINT18) | (0<<PCINT17) | (0<<PCINT16);
 
// маскирование ноги 6 на порту D -разрешение на прерывание, остальные запрет
 
 
MsTimer2::set(10000off_with_time_delay); // установка прерывания по таймеру 10000ms - 10 секунд, можно заменить время на переменную и программировать задержку кнопкой(я думаю реализовать это чуть позжея0 

 
 
Serial.begin(4800);          //поднимаем соединение для передачи на терминал

}
 
// обработчик прерывания PCINT0
ISR(PCINT0_vect)
{ if(
D9_RL// условие для обработки прерывания только по нажатию кнопки, изменение фронта при отпускании отфильтровывается
   
{b1millis=millis(); // фиксация времени прерывания
    
qbutton1++; // счетчик нажатий на кнопку 1
    
Serial.println("PCINT0");} // ни и инфа о том, что прерывание состоялось
}

// обработчик прерывания PCINT2
ISR(PCINT2_vect)
{if(
D6_RL)// условие для обработки прерывания только по нажатию кнопки, изменение фронта при отпускании отфильтровывается
   
{b2millis=millis(); // фиксация времени прерывания
    
qbutton2++; // счетчик нажатий на кнопку 2
    
Serial.println("PCINT2");} // ни и инфа о том, что прерывание состоялось
}
 
// Обработчик прерываний Таймера2
void off_with_time_delay() {
  
D4_LowD5_Low// выключение реле 1 и 2 
  
MsTimer2::stop() ; // останавливаем прерывание
}
void loop() {
    
// Обработка количества нажатий кнопки 1
    // если переменная количества нажатий кнопки не равна 0 - можно и без этого, но это существенно ускорит программу, так как не будут обрабатываться последующие "если", если кнопка не нажималась
  
if(qbutton1!=0)
 { 
      
//если было одно нажатие и с момента последнего нажатия прошло время заданное переменной tc1, а так же кнопка все еще нажата
      
if(qbutton1==&& millis()-b1millis>tcl&& D9_RL)
      
// значит это длинное нажатие и принимаем соответствующие действия для него
      
{Serial.println("long press"); // например здесь печатаем в терминал "длинное нажатие", а в дальнейшем планируется увеличение значения переменной DIMMER после прикрутки кода димера
       
qbutton1=0; }// и обнуляем переменную количества нажатий
 
        
      //если было одно нажатие и с момента последнего нажатия прошло время заданное переменной tc1, а так же кнопка уже опущена( если кнопка нажата -переменную количества нажатий обнулена в предыдущем шаге)
      
if(qbutton1==&& millis()-b1millis>tcl)
      
// значит это кроткое нажатие и принимаем соответствующие действия для него
      
Serial.println("1 click"); // например здесь печатаем в терминал "1 клик"
      
qbutton1=0;                  // и обнуляем переменную количества нажатий
      
D4_Inv;// инвертируем  состояние выхода для реле 1
// соответственно переключаем реле                                             
    
       //если было два  нажатие и с момента последнего нажатия прошло время заданное переменной tc1, а так же кнопка все еще нажата
      
if(qbutton1==&& millis()-b1millis>tcl&& D9_RL)
      
// значит это одно короткое нажатие и два длинных длинное нажатие и принимаем соответствующие действия для него
      
{Serial.println("1 click + long press"); // например здесь печатаем в терминал "1 клик + длинное нажатие", а в дальнейшем планируется уменьшение значения переменной DIMMER после прикрутки кода димера
       
qbutton1=0;}// и обнуляем переменную количества нажатий
 
        
      //если было одно нажатие и с момента последнего нажатия прошло время заданное переменной tc1, а так же кнопка уже опущена( если кнопка нажата -переменную количества нажатий обнулена в предыдущем шаге)
      
if(qbutton1==&& millis()-b1millis>tcl)
      
// значит это кроткое нажатие и принимаем соответствующие действия для него
      
Serial.println("2 click"); // например здесь печатаем в терминал "1 клик"
      
qbutton1=0;                  // и обнуляем переменную количества нажатий
      
MsTimer2::start();} // запускаем таймер отсчёта перед выключением             
   
    // обнуление счетчика нажатий, если количество нажатий не указано в предыдущих выборках и прошло больше переменной tc0                                              
    
if(qbutton1!=&& millis()-b1millis>2000)
    {
Serial.println("counter clicks reset"); // в рабочей версии здесь наверное ничего не будет,
      
qbutton1=0;} // и обнуляем переменную количества нажатий
  
};

// Обработка количества нажатий кнопки 2
    // все тоже самое, что и в кнопке 1 только управление реле  2 соответственно
  
if(qbutton2!=0)
 { 
       if(
qbutton2==&& millis()-b2millis>tcl&& D6_RL)
       {
Serial.println("long press2"); 
       
qbutton2=0; }
      
      if(
qbutton2==&& millis()-b2millis>tcl)
      { 
Serial.println("1 click2"); 
      
qbutton2=0;                  
      
D5_Inv;// 

       if(
qbutton1==&& millis()-b1millis>tcl&& D6_RL)
      {
Serial.println("1 click + long press2"); 
       
qbutton2=0;}// 
      
      
if(qbutton2==&& millis()-b2millis>tcl)
      { 
Serial.println("2 click2"); 
      
qbutton2=0;                 
      
MsTimer2::start();}             
                                                   
    if(
qbutton2!=&& millis()-b2millis>2000)
    {
Serial.println("counter clicks reset"); 
      
qbutton2=0;} 
  };


Вложения
Тип файла: rar nanopins2.rar (956 байт, 636 просмотров)
Bulatovor вне форума   Ответить с цитированием
Старый 09.02.2013, 18:59   #17
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
Proteus смоделировать 40 мл сек прерывания не может
А какую длительность он переваривает? Попробуйте 80, 100, 120 и т.д.
Admin вне форума   Ответить с цитированием
Старый 09.02.2013, 19:46   #18
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Пробовал все вплоть до 2000, или где-то с настройками неверно
Bulatovor вне форума   Ответить с цитированием
Старый 10.02.2013, 01:19   #19
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Я смотрю Вы очень быстро освоили контроллер и программирование на нем, отличный результат для новичка!
Спасибо за nanopins2, Я немного изменил чтение пинов и подправил nanopins. Теперь можно прочитать состояние пинов например вот так uint8_t n=D4_Read; и в N получим значение 0 или 1
Если появится время допилю nanopins.h.
Чтобы можно было в цикле порты индексировать
Admin вне форума   Ответить с цитированием
Старый 09.03.2013, 22:20   #20
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Итак, полчено железо из Китая, собран небольшой стенд для железных испытаний
Нажмите на изображение для увеличения
Название: stend.jpg
Просмотров: 480
Размер:	63.4 Кб
ID:	874
_http://s001.radikal.ru/i195/1303/f2/82f3b2affdedt.jpg

начал с простого подклюение кнопки, набросан небольшой скетч
PHP код:
// тест дребезга кнопки

#include <nanopins.h> //подключаем библиотеку быстрого управления пинами

void setup() {
  
D9_In//настраиваем порт на вход для кнопки 1
  
D9_High;  //установить на входах высокий уровень и подключить резистор 
   
     
 
PCICR  |= (1<<PCIE2) | (0<<PCIE1) | (1<<PCIE0); // разрешение прерываний с портов B (PCINT[7:0])  и  запрет  D (PCINT[23:16]) и  запрет C (PCINT[14:8])
 
PCMSK0 |= (0<<PCINT7)  | (0<<PCINT6)  | (0<<PCINT5)  | (0<<PCINT4)  | (0<<PCINT3)  | (0<<PCINT2)  | (1<<PCINT1)  | (0<<PCINT0);
 
// маскирование ноги 9 на порту B -разрешение на прерывание, остальные запрет
 
  
 
Serial.begin(9600);          //поднимаем соединение для передачи на терминал

}
 
// обработчик прерывания PCINT0
ISR(PCINT0_vect)
delay_ms(40);
  
Serial.println(D9_Read); // вывод состояния кнопки

}

 
void loop() {
    } 
По наивности новичка думалось избегу проблем да и просто хотелось посмотреть как выглядит, потому первоначальная схема была без кондера и delay_ms() в обработчике прерываний, получил в терминале при нажатии и удержании кнопки
PHP код:
0
1
1
0
0
1
1
0
0
1
0
0
0

За счет передачи данных в порт часть дребезга при этом еще пропущена нули и единички должны быть друг за другом.

Добавил кондер параллельно на 0.1 mF и делай в 40 все стабилизировалось, одно нажатие -0, отпускание -1. Но вот как то мне кажется и кондер уж намного больше чем рекомендовалось ранее и задержка большая. Как бы это боком в будущем не вылезло
Bulatovor вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 16:12. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика