Уважаемые люди, помогите начинающему программисту, попытался написать скетч для таймера на ардуине меге, с семисегментным индикатором, вроде как сначало получилось но при его работе заметил свой косяк!!. таймер при переходе с 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
А вы как хотели? У вас для отображения числа используется остаток от деления на 10. Соответственно, ни о каком правильном подсчёте секунд при таком раскладе речь идти не может. В функции displayNumber вам надо понять, сколько минут, и сколько секунд:
И уже каждое это число выводить.
спасибо за помощь
мозг уже плывёт((( это мне надо указать ещё что такое nam верно???
Вы зачем вторую функцию с таким же именем нагородили? Я вам показал, как из переданного в функцию числа получить кол-во минут и секунд, дальше - вы вольны поступать с этой информацией так, как вам надо.
тяжело ещё даётся всё это))))))))))
не могу ещё много чего понять, как и здесь куда и чё вставлять и редактировать)))))
знаю что это наглось но не могли бы подправить скетч и вставить это куда надо?