Таймер на Ардуино, непонятки

Aleksandr Makarov
Offline
Зарегистрирован: 01.02.2019

Добрый день, изучаю Ардуино.

Задача - сделать таймер для настольных игр. Пока есть ардуино и 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();
  }
}

sadman41
Offline
Зарегистрирован: 19.10.2016

На картинке видно, что доходит до нуля и прыгает вверх, к (start_count -1).

Что Вам точно надо - это после каждого -5 или +5 проверять - не вышел ли start_count из допустимого диапазона. А то он и -900 может получиться.

Гриша
Offline
Зарегистрирован: 27.04.2014

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

Если коротко - напишите несколько скетчей под каждую кнопку. 

bwn
Offline
Зарегистрирован: 25.08.2014

И тему про кнопки почитайте, если схема действительно такая.

Aleksandr Makarov
Offline
Зарегистрирован: 01.02.2019

Гриша пишет:

Если коротко - напишите несколько скетчей под каждую кнопку. 

Спасибо, таким образом вычислил, что count_delay уходит в минус при достижении 32000. Оказывается неправильно указал тип переменной. Должна быть unsigned long или long. Теперь все работает.

С кнопками все Ок, работают как надо.

 

Всем спасибо!!!