Форум РадиоКот https://radiokot.ru/forum/ |
|
Проблема-кнопка, простая, да не очень https://radiokot.ru/forum/viewtopic.php?f=57&t=146480 |
Страница 1 из 1 |
Автор: | PJufa [ Пн июл 03, 2017 12:23:59 ] |
Заголовок сообщения: | Проблема-кнопка, простая, да не очень |
народ, беда, помогите разобраться if (timer != timerPress) не срабатывает эта строка && timer <= (timerPress + 300) и эта часть код и монитор порта прилогаю версия arduino IDE 1.8.2 есть светодиод (полевик и набор из 20 шт 5730) хочу управлять им и с пульта и с кнопки поэтому там button пульт будет задействован позже. на пульте есть неиспользуемая кнопка... она сделана для других стран я уже пробовал ее - работает код получен и прочее СУТЬ! при нажатии на кнопку длительностью меньше 300 миллисекунд включает val = 255 - подаем на светодиод при повторном нажатии меньше 300 миллисекунд подает val = 0 при удержании с выключенного положения больше 300 миллисекунд начинает прибавлять значение val (скажем прибавили до 180) при нажатии менее 300 мс val=0 при длительном нажатии начинает убавлять(скажем 150) совсем не светит почти и при длительном нажатии опять начинает прибавлять... гладко было было на бумаге, да вот чет не ожидал что так сразу спотыкаться начну... всем спасибо за конструктивные ответы СпойлерКод: int val = 0; // создаем переменную регулировки и определяем её значение boolean button = false; // нажатие кнопки (пульта или клацалки) boolean flag = false; // сработка кнопки unsigned long timer = 0; // таймер с момента включения unsigned long timerPress = 0; // таймер удержания кнопки int gatePin = 3; // указываем пин который будем управлять затвором int buttonPin = 5; // указываем пин кнопки int regim = 0; // режим int trend = 1; //направление переключения режимов в большую или меньшую сторону void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); } void loop() { timer = millis(); button = digitalRead(buttonPin); // нажатие кнопки if (button == true) //если кнопка нажата ... { flag = true; //поднимаем флаг if (timer != timerPress) // и если таймеры не равны { timerPress = timer; // то таймеру нажатия присваивается значение таймера } } //отпускание кнопки if (button == false && regim == 0 && flag == true && timer < (timerPress + 300)) // если кнопка отжата и режим 0 и таймер меньше таймера нажатия на 300 мс { flag = false; // опускаем флаг regim = 255; // режим равен 255 } if (button == false && regim == 255 && flag == true && timer < (timerPress + 300) ) // если кнопка отжата и режим 255 и таймер меньше таймера нажатия на 300 мс { flag = false; // опускаем флаг regim = 0; // режим равен 0 } // ружимы if (regim == 0) { val = 0; } if (regim == 1) { val = 180; } if (regim == 2) { val = 180; } if (regim == 3) { val = 190; } if (regim == 4) { val = 200; } if (regim == 5) { val = 200; } if (regim == 6) { val = 210; } if (regim == 7) { val = 220; } if (regim == 8) { val = 230; } if (regim == 9) { val = 240; } if (regim == 10) { val = 255; } //вывод значения analogWrite(gatePin , val); //вывод в монитор Serial.print(" timer-"); Serial.print (timer); Serial.print(" timerPress-"); Serial.print (timerPress); Serial.print(" button-"); Serial.print (button); Serial.print(" flag-"); Serial.print (flag); Serial.print(" val-"); Serial.println(val); //делея тут не будет в итоге delay(10); } это получаю в монитор порта ![]() |
Автор: | Morroc [ Пн июл 03, 2017 16:48:41 ] |
Заголовок сообщения: | Re: Проблема-кнопка, простая, да не очень |
if (timer != timerPress) не срабатывает эта строка Это ненужное условие, что то там у вас не то если такое требуется. В целом для начала нужно разобраться с антидребезгом, иначе можно не понять в программе проблема или в железе (если вы конечно не в протеусе это гоняете). |
Автор: | Ivanoff-iv [ Вт июл 04, 2017 04:30:40 ] |
Заголовок сообщения: | Re: Проблема-кнопка, простая, да не очень |
сделай опрос кнопки регулярным (через определенное время, допустим 30мс, например по прерыванию таймера) если (кнопка нажата) - {приращай переменную (только следи чтобы за пределы возможности переменной не выросла, например: если (х<250) то х++; сдесь же можно проверить и длинное нажатие если (х=100) выставляем соотв флаг} иначе /*при отпущенной кнопке */ {проверяй состояние переменной: х<6 дребезг (ни чего не делаем), 5<х<100 короткое нажатие (выставляем соотв. флаг), после проверки переменную сбрасываем в 0}; в коде самой программы иногда поглядываем на флаги и если видим что установлен — выполняем соотв. действие и сбрасываем. п.с. длинное нажатие тоже можно проверять при отпущенной кнопке: х>99 длинное. (выставляем соотв флаг) ,но тогда оно и срабатывать будет только при отпускании кнопки. п.с.2: если действие длинного нажатия нужно продолжительное — в самой программе сбрасываем флаг если переменная==0 если нужно цикличное действие — при достижении мах (не обязательно 250) переменную сбрасываем в значение сработки длинного нажатия 100. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |