Таймер обратного отсчёта

Arhilon
Offline
Зарегистрирован: 24.06.2016

Уважаемые люди, помогите начинающему программисту, попытался написать скетч для таймера на ардуине меге, с семисегментным индикатором, вроде как сначало получилось но при его работе заметил свой косяк!!. таймер при переходе с 00 секунд показывает 99, а вот минуты нормально тикают, и ни как не могу разобратся чтоб всё нормально работало!! 
задача такова, при подаче питания на ардуино она включается и на индикаторах высвечивается 59 мин и 45 сек, и ждёт нажатия кнопки пуск, после этого начинает отсчёт времени, как только таймер дошёл до 00:00 просто перешёл в начальное состояние, также хочется добавить кнопку сброс, и кнопку которая позволяет отнимать минуты во время того как запущен таймер, по одной минуте за нажатие! вот то что смог кое как сделать(((( 
подключаю индикатор на прямую с ардуины, 
заранее благодарю всех кто поможет

 
 
int digit1 = 12; 
int digit2 = 9; 
int digit3 = 8; 
int digit4 = 6; 
 
 
int segA = 22; 
int segB = 24; 
int segC = 25; 
int segD = 27; 
int segE = 28; 
int segF = 23; 
int segG = 29; 
 
int start_num=5910;  //отображени времени
 
void setup() {                
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
 
  pinMode(digit1, OUTPUT);
  pinMode(digit2, OUTPUT);
  pinMode(digit3, OUTPUT);
  pinMode(digit4, OUTPUT);
  
  pinMode(13, OUTPUT);
}
 
void loop() {
  
   
  if((millis()/1000) < start_num){
    displayNumber(start_num -(millis()/1000));
  }
}
 
 
 
void displayNumber(int toDisplay) {
#define DISPLAY_BRIGHTNESS  500  //яркость 
 
#define DIGIT_ON  HIGH
#define DIGIT_OFF  LOW
 
  long beginTime = millis();
 
  for(int digit = 4 ; digit > 0 ; digit--) {
 
    
    switch(digit) {
    case 1:
      digitalWrite(digit1, DIGIT_ON);
      break;
    case 2:
      digitalWrite(digit2, DIGIT_ON);
      break;
    case 3:
      digitalWrite(digit3, DIGIT_ON);
      break;
    case 4:
      digitalWrite(digit4, DIGIT_ON);
      break;
    }
 
    
    lightNumber(toDisplay % 10);
    toDisplay /= 10;
 
    delayMicroseconds(DISPLAY_BRIGHTNESS); 
    
    lightNumber(10); 
 
   
    digitalWrite(digit1, DIGIT_OFF);
    digitalWrite(digit2, DIGIT_OFF);
    digitalWrite(digit3, DIGIT_OFF);
    digitalWrite(digit4, DIGIT_OFF);
  }
 
  while( (millis() - beginTime) < 10) ; 
 
}
void lightNumber(int numberToDisplay) {
#define SEGMENT_ON  LOW
#define SEGMENT_OFF HIGH
  switch (numberToDisplay){
  case 0:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_OFF);
    break;
и так далее до 9
 
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

А вы как хотели? У вас для отображения числа используется остаток от деления на 10. Соответственно, ни о каком правильном подсчёте секунд при таком раскладе речь идти не может. В функции displayNumber вам надо понять, сколько минут, и сколько секунд:

void displayNumber(int num)
{
  int min = num/60;
  int sec = num%60;
}

И уже каждое это число выводить.

 

Arhilon
Offline
Зарегистрирован: 24.06.2016

спасибо за помощь

мозг уже плывёт((( это мне надо указать ещё что такое nam верно??? 



int digit1 = 12; 
int digit2 = 9; 
int digit3 = 8; 
int digit4 = 6; 


int segA = 22; 
int segB = 24; 
int segC = 25; 
int segD = 27; 
int segE = 28; 
int segF = 23; 
int segG = 29; 

int start_num=5910;  //отображени

void setup() {                
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);

  pinMode(digit1, OUTPUT);
  pinMode(digit2, OUTPUT);
  pinMode(digit3, OUTPUT);
  pinMode(digit4, OUTPUT);
  
  pinMode(13, OUTPUT);
}

void loop() {
  
   
  if((millis()/1000) < start_num){
    displayNumber(start_num -(millis()/1000));
  }
}


void displayNumber(int num)

{
 int min = num/60;
 int sec = num%60;
}



void displayNumber(int toDisplay) {
#define DISPLAY_BRIGHTNESS  500  //яркость 

#define DIGIT_ON  HIGH
#define DIGIT_OFF  LOW

  long beginTime = millis();
  

  for(int digit = 4 ; digit > 0 ; digit--) {

    
    switch(digit) {
    case 1:
      digitalWrite(digit1, DIGIT_ON);
      break;
    case 2:
      digitalWrite(digit2, DIGIT_ON);
      break;
    case 3:
      digitalWrite(digit3, DIGIT_ON);
      break;
    case 4:
      digitalWrite(digit4, DIGIT_ON);
      break;
    }

    
    lightNumber(toDisplay % 10);
    toDisplay /= 10;

    delayMicroseconds(DISPLAY_BRIGHTNESS); 
    
    lightNumber(10); 

   
    digitalWrite(digit1, DIGIT_OFF);
    digitalWrite(digit2, DIGIT_OFF);
    digitalWrite(digit3, DIGIT_OFF);
    digitalWrite(digit4, DIGIT_OFF);
  }

  while( (millis() - beginTime) < 10) ; 
 
}


void lightNumber(int numberToDisplay) {

#define SEGMENT_ON  LOW
#define SEGMENT_OFF HIGH

  switch (numberToDisplay){

  case 0:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_OFF);
    break;

  case 1:
    digitalWrite(segA, SEGMENT_OFF);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_OFF);
    break;

  case 2:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_OFF);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 3:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 4:
    digitalWrite(segA, SEGMENT_OFF);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 5:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_OFF);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 6:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_OFF);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 7:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_OFF);
    break;

  case 8:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_ON);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 9:
    digitalWrite(segA, SEGMENT_ON);
    digitalWrite(segB, SEGMENT_ON);
    digitalWrite(segC, SEGMENT_ON);
    digitalWrite(segD, SEGMENT_ON);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_ON);
    digitalWrite(segG, SEGMENT_ON);
    break;

  case 10:
    digitalWrite(segA, SEGMENT_OFF);
    digitalWrite(segB, SEGMENT_OFF);
    digitalWrite(segC, SEGMENT_OFF);
    digitalWrite(segD, SEGMENT_OFF);
    digitalWrite(segE, SEGMENT_OFF);
    digitalWrite(segF, SEGMENT_OFF);
    digitalWrite(segG, SEGMENT_OFF);
    break;
  }
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вы зачем вторую функцию с таким же именем нагородили? Я вам показал, как из переданного в функцию числа получить кол-во минут и секунд, дальше - вы вольны поступать с этой информацией так, как вам надо.

Arhilon
Offline
Зарегистрирован: 24.06.2016

тяжело ещё даётся всё это))))))))))

не могу ещё много чего понять, как и здесь куда и чё вставлять и редактировать)))))

Arhilon
Offline
Зарегистрирован: 24.06.2016

знаю что это наглось но не могли бы подправить скетч и вставить это куда надо?