Таймер на Ардуино, непонятки
- Войдите на сайт для отправки комментариев
Пт, 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. Теперь все работает.
С кнопками все Ок, работают как надо.
Всем спасибо!!!