Таймер на Ардуино, непонятки
- Войдите на сайт для отправки комментариев
Пт, 01/02/2019 - 15:27
Добрый день, изучаю Ардуино.
Задача - сделать таймер для настольных игр. Пока есть ардуино и 3 кнопки, подсоединеные к цифровым выводам. Секунду выдерживаю с помошью millies
Кнопка на пине 2 - старт отсчета, при повторном нажатии отсчет начинается заново.
Кнопка на пине 3 - увеличить таймер на 5 сек, если таймер не считает.
Кнопка на пине 10 - уменьшить таймер на 5 сек, если таймер не считает.
Все отрабатывается нормально, но при достижении 0 система начинает каждый шаг уменьшать переменную count на картинке видно. Поччему это происходит не могу понять.
Подскажите, можно как-нибудь доработать код, чтобы работало с millis(), или надо делать на delay с прерываниями?
int count = 0; int start_count = 10; //начальное значение счетчика времени boolean but1Flag; boolean but1; boolean but2Flag; boolean but2; boolean but3Flag; boolean but3; boolean led_flag = 0; unsigned long lastPress = 0; boolean cikl = 0; int count_delay = 0; void setup() { pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(10, INPUT_PULLUP); pinMode(13, OUTPUT); Serial.begin(9600); count = start_count; } void loop() { //Обработка нажатия кнопки 1 but1 = !digitalRead(2); if (but1 == true && but1Flag == false && millis() - lastPress > 300) { if (cikl = true) { count = start_count; } but1Flag = 1; lastPress = millis(); led_flag = !led_flag; cikl = true; digitalWrite(13, led_flag); } if (but1 == 0 && but1Flag == 1) { but1Flag = 0; } //Отработка нажатия кнопки 2 but2 = !digitalRead(3); if (but2 == true && but2Flag == false && millis() - lastPress > 300 && cikl == false) { but2Flag = 1; lastPress = millis(); start_count = start_count+5; count = start_count; } if (but2 == 0 && but2Flag == 1) { but2Flag = 0; } //Отработка нажатия кнопки 3 but3 = !digitalRead(10); if (but3 == true && but3Flag == false && millis() - lastPress > 300 && cikl == false) { but3Flag = 1; lastPress = millis(); start_count = start_count-5; count = start_count; } if (but3 == 0 && but3Flag == 1) { but3Flag = 0; } Serial.println(count); if (cikl == true && (millis() - count_delay) > 1000) { if (count < 1) { count = start_count; } count-- ; count_delay = millis(); } }
На картинке видно, что доходит до нуля и прыгает вверх, к (start_count -1).
Что Вам точно надо - это после каждого -5 или +5 проверять - не вышел ли start_count из допустимого диапазона. А то он и -900 может получиться.
очень плохая идея минусовать счетчик (декремент) и проверять его значение меньше единицы. Перепишите скеч на инкрементные условия, проверяйте переполнение. Напишите скетч где будет только одна кнопка, которая будет убавлять счетчик таймера на заданное значение и выводить в сериал. Потом отдельный скетч для кнопки, в котором четчик будет запускаться и останавливаться по нажатию с выводом в сериал каждую секунду т.е. условие с 2 таймерами или одним, но с обдуманным подходом в использовании.
Если коротко - напишите несколько скетчей под каждую кнопку.
И тему про кнопки почитайте, если схема действительно такая.
Если коротко - напишите несколько скетчей под каждую кнопку.
Спасибо, таким образом вычислил, что count_delay уходит в минус при достижении 32000. Оказывается неправильно указал тип переменной. Должна быть unsigned long или long. Теперь все работает.
С кнопками все Ок, работают как надо.
Всем спасибо!!!