Помогите с кодом ик диммера !

kalbas0000
Offline
Зарегистрирован: 02.09.2016

Собственно есть такой код управление ик диммера только с одной кнопкой. как переделать на две ума не приложу ! суть алгоритма от двух кнопок. короткое нажатие 1 вой кнопки вкл. короткое 2ой вык. длительное удерживание кнопки 1 яркость + 2ой яркость - . 

скетч.

#include <RC5.h>
int IR_PIN = 11;
RC5 rc5(IR_PIN);

int ledPin = 9;    // Выход ШИМ на диммер // Управление драйвером через симистор  
uint8_t pwmLevel = 255; 
boolean pwmStat  = false;
boolean pwmInc   = true; 
uint32_t ms, ms1 = 0; 
boolean press_flag = false; 
uint16_t press_cnt = 0;
  
void setup()
{     
pinMode(ledPin, OUTPUT);         
}
  
void loop()
{ 
unsigned char toggle;
unsigned char address;
unsigned char command;  
rc5.read(&toggle, &address, &command);
  
ms = millis();
// Принимаем коды с пульта        
if( command == 7 ){ кнопка 1 . а как две ?
press_flag = true;
}     
// Задержка 250мс для устранения дребезга
if( ( ms - ms1 ) >200 || ms < ms1 ){  
// Если нажата клавиша      
if( press_flag ){
press_cnt++;
// Если лампа включена 
if( pwmStat ){
// Инвертируем флаг уменьшения/увеличения              
if( press_cnt == 5 ){
pwmInc = !pwmInc;
}//pres_cnt = 0
// Изменям значение диммера             
else if( press_cnt > 5 ){   
if( pwmInc ){
if( pwmLevel < 255 )pwmLevel+=15;
else pwmLevel = 255;
}//pwmInc
else {
if( pwmLevel >0 )pwmLevel-=15;   
else pwmLevel = 0;
}// else pwmInc
}            
analogWrite(ledPin, pwmLevel);
}          
}
else {
// Короткое (менее 1 сек) нажатие клавиши         
if( press_cnt > 0 && press_cnt < 5 ){
// Включение/отключение лампы            
pwmStat = !pwmStat;
if( pwmStat ) {                  
analogWrite(ledPin, pwmLevel);
}
else {
analogWrite(ledPin, 0);                  
}             
}
press_cnt = 0;
}
ms1 = ms;
press_flag = false;
}  
}

 

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

kalbas0000 пишет:

суть алгоритма от двух кнопок. короткое нажатие 1 вой кнопки вкл. короткое 2ой вык. длительное удерживание кнопки 1 яркость + 2ой яркость - . 

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

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

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

ADR
Offline
Зарегистрирован: 13.09.2016

Не буду утверждать, т.к. не уверен, но...

Почему бы не считать пачку импульсов в течении скажем 1 секунды - коротким нажатием,

а пачку импульсов в течении двух секунд длинным.

Время скорелировать в соответствии с частоттой импульсов пульта.

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

ADR, при таком подходе, вы не сможете зафиксировать корокткое нажатие ранее, чем пройдёт 2 секунды (или сколько там). Некоторые так делают, но отсюда и берутся тормозные пульты на которые потом все пользователи матерятся.

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

Вот смотрите, в Windows одиночное нажатие мышки на файл - выбор его, а двойное - запуск. Оно так и работает. Пришло нажатие - файл выбирается. Пришло второе в пределах определённого интервала - уже выбранный файл запускается. Т.е. та же самая архитектура, которую я и описал.

ssss
Offline
Зарегистрирован: 01.07.2016

ЕвгенийП пишет:

при таком подходе, вы не сможете зафиксировать корокткое нажатие ранее, чем пройдёт 2 секунды (или сколько там). Некоторые так делают, но отсюда и берутся тормозные пульты на которые потом все пользователи матерятся.

Угу! А регулировка громкости на теликах как делается?

ADR
Offline
Зарегистрирован: 13.09.2016

Этода. Нужна третья кнопка.

Громкость не проблема, когда есть отдельная кнопка вкл\выкл

ssss
Offline
Зарегистрирован: 01.07.2016

ADR пишет:

Этода. Нужна третья кнопка.

И пятое колесо для телеги! Нужно всего лишь определиться, что есть короткое нажатие, а что длинное. Остальное не суть.

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

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

Т.е. ТС нужно подумать и как-то поменять алгоритм. 

Хотя, все пульты, что у меня есть дают именно краткие импульсы при постоянном нажатии, но я слышал, что есть и такие, что дают постоянный сигнал. Если у ТС именно такой, то проблемы нет - делай что хочешь.

Подождём, что скажет ТС.