Доброй ночи друзья и коллеги! Ситуация в следующем работаю с каном авто, все кнокпи работают по кану. Хочу подключить их чтобы управлять Ардуинкой в своих личных целях. Имеется UNO и Atmega 2450. Написал скетч на обработку одиночного нажатия, а вот с длительным не могу справится. то есть например нажимаю 1 раз кнопку звук + и приходит 2-3 одинаковых сигнала в кан пусть будет 12345. То есть если жму долго он так и будет кидать в лог: 12345 12345 12345 12345 12345 12345 Вот мне нужно при удерживании скажем более 8 секунд сделать чтобы он выполнял другое действие. Пробовал millis() ставить, но он к сожалению не обнуляется. Пока что работает только один мой вариант по количеству, то есть если пришло в лог более 8 одинаковых сигналов 12345 то выполнять долгое действие, но это не очень удобно, так как счетчик не обнуляется а постоянно по кругу идут. Или может подскажите как обнулять счетчик если допустим между действиями прошло более скажем 3 секунд. Заранее благодарен, Андрей.
Код (C++): const int buttonPin=2;// вывод кнопки 0 нажата 1 нет uint32_t last_millis; // переменные: последний millis uint8_t botton(){ if (digitalRead(buttonPin) == 1){ // кнопка не нажата last_millis = millis(); return 0;} delay(30); while (digitalRead(buttonPin) == 0); delay(30); if (last_millis+65 > millis()){ // ложное срабатывание last_millis = millis(); return 0;} if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек last_millis = millis(); return 1;} last_millis = millis(); // длинное нажатие больше 0.30 сек return 2; }; void setup() { pinMode(buttonPin, INPUT_PULLUP); // вывод на ввод с подтягивающим резистром last_millis = millis(); } void loop() { switch (botton()) { case 1: Serial.println("Short press"); break; case 2: Serial.println("Long press"); break; } }
Спасибо вам большое, но я с таким кодом мозг сломаю Попроще нечего нет? Вот пример моего кода, хочется что то маленькое и простое. Код (C++): if(rpId == 410) //Нажат кнопка след. трек >> { irsend.sendNEC (0x11E937,32); Serial.println("Next track"); } Что то типа : Код (C++): if(rpId == 410) //Нажат кнопка след. трек >> { NexTreck = NexTreck+ 1; if (NexTreck > 5) { irsend.sendNEC (0x11E937,32); //Нажат кнопка след. трек долго Serial.println("Next Long track"); } irsend.sendNEC (0x11E937,32); Serial.println("Next track"); }
А не получится . Ну нельзя запихать в маленькую туфельку большую лапу. То что легко для пользователя кнопку оказывается сложно для программиста. Компьютерная мышка тоже проста. А вот для ее поддерки нужена Винда.
Подожди, но вот этот вариант же работает, просто тут срабатывание каждый 8ое нажатие, не важно долгое или одиночное. Как то можно выставить промежутки сброса, чтобы он высчитывал промежутки и сбрасывал их? Нажал кнопку один раз и отпустил, если задержка более скажем 0.1 счетчик сбрасывается, если задержки нет то после получения более 8 секунд выполняется лонг и опять сброс счетчика. Или что то в этом роде. Код (C++): if(rpId == 410) //Нажат кнопка след. трек >> { nextrack = nextrack++ if (nextrack > 8) { irsend.sendNEC (0x15D937,32); Serial.println("Next LOND press track"); } irsend.sendNEC (0x11E937,32); Serial.println("Next track"); }
У вас ИК пульт. При нажатии на кнопку пульта приходят сигналы. И вы хотите , что бы при долгом нажатии, пришло 8 одинаковых сигналов, которые будут опознаваться как долгое нажатие?
Ик выполняет действия после получения нужного сигнала, тут он вообще не причем. Допустим я нажимаю один раз на кнопку и сразу же отпускаю: приходит один сигнал 123213213 Я нажимаю и удерживаю кнопку и приходит: 123213213 123213213 123213213 123213213 123213213 бесконечно пока я не отпущу кнопку. Вот мне необходимо чтобы при долгом нажатии скажем более 5 секунд выполнялось мое действие. То есть можно как бы по периоду времени или по количеству пришедших сигналов, Но главное что бы был сброс времени или количества. Например по времени: если я нажал и держал 4 секунды отпустил и потом через какое то время нажал еще 1 секунду подержал то долгое нажатие не срабатывает. Только когда выдержаны целые 5 секунд без промежутков. То же самое пример: Долгое нажатие срабатывает только после того как пришло 8 сигналов 123213213, но есть ли пришло 7, я отпустил кнопку, подождал период и нажал снова как бы дослал еще 1 сигнал то долгое нажатие не срабатывает. Только когда пришло 8 сигналов без промежутков. То есть в определенный период.