Часы на семисегментных индикаторах

Здравствуйте. Делаю часы на семисегментных индикаторах. Их 4 шт. Имеются 3 кнопки. Две из которых устанавливают время. 3 служит для переключения между минутами и часами, а также при удержании отправляет в функцию где и происходит отсчёт времени. Проблема в строках 112 - 115. То есть когда мы установили время, запустили функцию Clock(), данные которые записались в one_seg two_seg three_seg four_seg, не передаются функциям one two three four. Я в программировании новичок, хотелось бы узнать как исправить ошибку.

#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define F 7
#define G 8
#include <GyverButton.h>


GButton button1(A0, HIGH_PULL);
GButton button2(A1, HIGH_PULL);
GButton button3(A2, HIGH_PULL);

////////////////////
///////////////////
byte one_seg = 0;
byte two_seg = 0;
byte three_seg = 0;
byte four_seg = 0;



byte minuts_set = 0;
byte hours_set = 0;
byte minuts_need = 0;
byte hours_need = 0;
byte val = 0;
unsigned long timing = 0;
unsigned long tim = millis();
void setup() {
  Serial.begin(9600);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(A0, INPUT_PULLUP);
  pinMode(A1, INPUT_PULLUP);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
}

void loop() {
  static bool insert_hours = true;

  one(); digitalWrite(9, HIGH); delay(1); digitalWrite(9, LOW); delay(1);
  two(); digitalWrite(10, HIGH); delay(1); digitalWrite(10, LOW); delay(1);
  three(); digitalWrite(11, HIGH); delay(1); digitalWrite(11, LOW); delay(1);
  four(); digitalWrite(12, HIGH); delay(1); digitalWrite(12, LOW); delay(1);

  button1.tick();
  button2.tick();
  button3.tick();
  if (button1.isClick()) {
    insert_hours = !insert_hours;
  }
  if (button1.isHolded()) {
    Clock();
  }
  if (button2.isClick() or button2.isStep()) {
    if (insert_hours) {
      if (++minuts_set > 59) {
        minuts_set = 0;
      }
    }
    else {
      if (++hours_set > 23) {
        hours_set = 0;
      }
    }
  }
  ///////////////////////////////////////////
  if (button3.isClick() or button3.isStep()) {
    if (insert_hours) {
      if (--minuts_set < 0) {
        minuts_set = 59;
      }
    }
    else {
      if (--hours_set < 0) {
        hours_set = 23;
      }
    }
  }
  one_seg = minuts_set % 10;
  two_seg = minuts_set / 10;
  three_seg = hours_set % 10;
  four_seg = hours_set / 10;
  
}

void Clock(void) {
  minuts_need = minuts_set - 1;
  hours_need = hours_set;
  while (true) {
    if (millis() - timing > 1000) {
      timing = millis();
      ++minuts_need;
      if (minuts_need > 59) {
        minuts_need = 0;
        ++hours_need;
        if (hours_need > 23) {
          hours_need = 0;
        }
      } 
    }
    one_seg = minuts_need%10;
    two_seg = minuts_need/10;
    three_seg = hours_need %10;
    four_need = hours_need/10;

      
  }
}
void one() {
  if (one_seg == 0 || one_seg == 10 || one_seg == 20 || one_seg == 30 || one_seg == 40 || one_seg == 50) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 1);
    digitalWrite(G, 0);
  }
  if (one_seg == 1 || one_seg == 11 || one_seg == 21 || one_seg == 31 || one_seg == 41 || one_seg == 51) {
    digitalWrite(A, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 0);
    digitalWrite(E, 0);
    digitalWrite(F, 0);
    digitalWrite(G, 0);
  }
  if (one_seg == 2 || one_seg == 12 || one_seg == 22 || one_seg == 32 || one_seg == 42 || one_seg == 52) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 0);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 0);
    digitalWrite(G, 1);
  }
  if (one_seg == 3 || one_seg == 13 || one_seg == 23 || one_seg == 33 || one_seg == 43 || one_seg == 53) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 0);
    digitalWrite(F, 0);
    digitalWrite(G, 1);
  }
  if (one_seg == 4 || one_seg == 14 || one_seg == 24 || one_seg == 34 || one_seg == 44 || one_seg == 54) {
    digitalWrite(A, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 0);
    digitalWrite(E, 0);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
  if (one_seg == 5 || one_seg == 15 || one_seg == 25 || one_seg == 35 || one_seg == 45 || one_seg == 55) {
    digitalWrite(A, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 0);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
  if (one_seg == 6 || one_seg == 16 || one_seg == 26 || one_seg == 36 || one_seg == 46 || one_seg == 56) {
    digitalWrite(A, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
  if (one_seg == 7 || one_seg == 17 || one_seg == 27 || one_seg == 37 || one_seg == 47 || one_seg == 57) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 0);
    digitalWrite(E, 0);
    digitalWrite(F, 0);
    digitalWrite(G, 0);
  }
  if (one_seg == 8 || one_seg == 18 || one_seg == 28 || one_seg == 38 || one_seg == 48 || one_seg == 58) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
  if (one_seg == 9 || one_seg == 19 || one_seg == 29 || one_seg == 39 || one_seg == 49 || one_seg == 59) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 0);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }


}
void two() {
  if (two_seg == 0) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 1);
    digitalWrite(G, 0);
  }
  if (two_seg == 1) {
    digitalWrite(A, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 0);
    digitalWrite(E, 0);
    digitalWrite(F, 0);
    digitalWrite(G, 0);
  }
  if (two_seg == 2) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 0);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 0);
    digitalWrite(G, 1);
  }
  if (two_seg == 3) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 0);
    digitalWrite(F, 0);
    digitalWrite(G, 1);
  }
  if (two_seg == 4) {
    digitalWrite(A, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 0);
    digitalWrite(E, 0);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
  if (two_seg == 5) {
    digitalWrite(A, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 0);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
}
void three() {
  if (three_seg == 0 || three_seg == 10 || three_seg == 20) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 1);
    digitalWrite(G, 0);
  }
  if (three_seg == 1 || three_seg == 11 || three_seg == 21) {
    digitalWrite(A, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 0);
    digitalWrite(E, 0);
    digitalWrite(F, 0);
    digitalWrite(G, 0);
  }
  if (three_seg == 2 || three_seg == 12 || three_seg == 22) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 0);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 0);
    digitalWrite(G, 1);
  }
  if (three_seg == 3 || three_seg == 13 || three_seg == 23) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 0);
    digitalWrite(F, 0);
    digitalWrite(G, 1);
  }
  if (three_seg == 4 || three_seg == 14) {
    digitalWrite(A, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 0);
    digitalWrite(E, 0);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
  if (three_seg == 5 || three_seg == 15) {
    digitalWrite(A, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 0);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
  if (three_seg == 6 || three_seg == 16) {
    digitalWrite(A, 1);
    digitalWrite(B, 0);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
  if (three_seg == 7 || three_seg == 17) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 0);
    digitalWrite(E, 0);
    digitalWrite(F, 0);
    digitalWrite(G, 0);
  }
  if (three_seg == 8 || three_seg == 18) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
  if (three_seg == 9 || three_seg == 19) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 0);
    digitalWrite(F, 1);
    digitalWrite(G, 1);
  }
}
void four() {
  if (four_seg == 0) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 1);
    digitalWrite(G, 0);
  }
  if (four_seg == 1) {
    digitalWrite(A, 0);
    digitalWrite(B, 1);
    digitalWrite(C, 1);
    digitalWrite(D, 0);
    digitalWrite(E, 0);
    digitalWrite(F, 0);
    digitalWrite(G, 0);
  }
  if (four_seg == 2) {
    digitalWrite(A, 1);
    digitalWrite(B, 1);
    digitalWrite(C, 0);
    digitalWrite(D, 1);
    digitalWrite(E, 1);
    digitalWrite(F, 0);
    digitalWrite(G, 1);
  }
}

Этим функциям невозможно что-то передать, т.к. у них пустой список параметров.
Переформулируйте свою проблему как-то пор-другому, чтобы было понятно, о чем речь.
Вообще принято приводить схему.
А проблему желательно формулировать так:

  1. Чего хочется добиться.
  2. Что вместо этого происходит.
  3. Чем первое отличается от второго.
1 лайк


Схема такая + 3 кнопки подключенные к A0, A1, A2 (резисторы 220 Ом, транзисторы Bc547)

Хочется, чтобы после того как я выставил нужное время, и удержал кнопку button1 у меня на индикаторы выводилось время - часы и минуты с соответствующих переменных(minuts_need и hours_need)
Что происходит:
Я устанавливаю время, удерживаю кнопку button1 и у меня гаснут индикаторы. Через монитор порта часы работают как надо. Проблема с выводом полученных значений minuts_need и hours_need на индикаторы.

Рисуй полную схему, по твоему описанию - это:

А где Вы пытаетесь вывести их на индикаторы?

Это вторая часть. Для начала нужно с кнопками разобраться. А то они вроде бы и есть, но на схеме нет. И как подключены - неизвестно.

Почему все новички, так любят семисегментные индикаторы? Почему не просто готовый дисплей? Или они у вас размером по 30см?

Из-за мнимой простоты. Подумаешь, какая-то дешифрация, динамическое переключение, транзисторные ключи…
Вот по и2с вывести символ намного сложней)

Строка 112-115

После означенных строк что? А ничего. Надо запускать функции one(), two(),tree(),four(). Причем по очереди, выдерживая паузу.
Аа, эти функции в начале лупа идут. А зачем там 2 паузы на сегмент?

Да. Получилось. Спасибо большое!

Там обычная развертка. Сперва загорается один, гаснет. Загорается второй, гаснет. И так далее по кругу

Просто переключать знакоместо лучше без пауз. А то получается 50/50 горит не горит. Тускло)


Да нет, вполне себе ярко) Камера не передаёт

Цитирую:

И где в этих строках Вы пытаетесь вывести что-то на индикаторы?
Где здесь вообще хотя бы упоминаются индикаторы?

А теперь обьясните, как у вас вообще могут работать кнопки, если у вас внутри функции Clock() бесконечный цикл? (строка 100)

И что за бредятина с условиями в функции one() ?

Как one_seg может быть 13 или 23, если вы его вычисляете как остаток от деления на десять?

@JesterKING, вижу что стараешься, но делаешь как то совсем примитивно. Даю наводку.)

Спойлер
// получим шрифт цифр
const uint8_t font[] PROGMEM = {
// abcdefgh
  B11111100,  //0     a
  B01100000,  //1    --
  B11011010,  //2  f|  |b
  B11110010,  //3    --g
  B01100110,  //4  e|  |c
  B10110110,  //5    -- .h
  B10111110,  //6     d
  B11100000,  //7
  B11111110,  //8
  B11110110,  //9
  B11101110,  //A
  B00111110,  //b
  B11000110,  //o градус
  B01111010,  //d
  B10011110,  //E
  B10001110,  //F
// abcdefgh
};

static uint8_t getFont(uint8_t digit) {
  return pgm_read_byte(&font[digit & B1111]);
}


// display clock
void display(uint8_t hour, uint8_t minute) {
  #if LIDERING0
  segment[0] = getFont(hour / 10);
  #else
  segment[0] = hour / 10 ? getFont(hour / 10) : 0;
  #endif
  segment[1] = getFont(hour % 10);
  segment[2] = getFont(minute / 10);
  segment[3] = getFont(minute % 10);
}

Могу за себя ответить.

Живу в маленьком городке, где в оффлайне практически ничего купить нельзя, любая хреновинка - минимум недельное ожидание. Потому давно включил предельную запасливость и имею обширный СВХ.

Иметь в СВХ готовые дисплей не так легко - нужно ведь иметь на разное количество знаков. Куда как проще иметь одиночные индикаторы и ручками набирать столько знаков, сколько надо под задачу.

Простите, Евгений Петрович, но в группе “новички” вас нет :slight_smile:
Я сам, вначале увлечения, накупил их кучу. Но после того, как пару раз спаял 4 шт между собой, понял, что ошибся. Теперь у меня на СВХ модули из трёх и четырёх штук.
И это при том, что я сразу понимал, как правильно их подключить и программировать. А вот выбор ТС мне не понятен.
Просто за последний месяц куча тем с этими семисегментниками, и кто как извращается.