Эксперимент 26. Секундомер

Научившись подключать и управлять светодиодным индикатором попробуем использовать его для отображения данных. Сконструируем простейший секундомер, который отсчитывает и отображает секунды от 0 до 9.

Схема эксперимента

Оставим схему, собранную на прошлом эксперименте. Рисунок 1. Электрическая принципиальная схема эксперимента

Токоограничительные резисторы обязательны!

Рисунок 2. Монтажная схема эксперимента

Программный код эксперимента

Exp26.ino
  1. int segments[7] = {14, 13, 4, 5, 12, 16, 15}; // ABCDEFG
  2.  
  3. int digits[10][7] = {
  4. {1, 1, 1, 1, 1, 1, 0}, // 0
  5. {0, 1, 1, 0, 0, 0, 0}, // 1
  6. {1, 1, 0, 1, 1, 0, 1}, // 2
  7. {1, 1, 1, 1, 0, 0, 1}, // 3
  8. {0, 1, 1, 0, 0, 1, 1}, // 4
  9. {1, 0, 1, 1, 0, 1, 1}, // 5
  10. {1, 0, 1, 1, 1, 1, 1}, // 6
  11. {1, 1, 1, 0, 0, 0, 0}, // 7
  12. {1, 1, 1, 1, 1, 1, 1}, // 8
  13. {1, 1, 1, 1, 0, 1, 1}, // 9
  14. };
  15.  
  16. void draw_time(int digit) {
  17. for (int i = 0; i < 7; i++) {
  18. if (digits[digit][i]) digitalWrite(segments[i], HIGH);
  19. else digitalWrite(segments[i], LOW);
  20. }
  21. }
  22.  
  23. void setup() {
  24. for (int i = 0; i < 7; i++){
  25. pinMode(segments[i], OUTPUT);
  26. }
  27. }
  28.  
  29. void loop() {
  30. for (int i = 0; i < 7; i++) {
  31. draw_time(i);
  32. delay(1000);
  33. }
  34. }

В этой программе мы записали номера выводов микроконтроллера, к которым подключены сегменты индикатора, в массив segments. Порядок перечисления сегментов указан в комментарии в этой строке.

Комментарии используются в программах, чтобы записать какие либо пояснения к коду, и предназначены только для человека, который читает код. Комментарии никак не влияют на выполнение программы. В языке Arduino комментарий начинается с символов //. Также часто комментируют части кода, которые не должны исполняться, но удалять совсем их пока не нужно.

В строке 3 объявляем массив, в котором описываем цифры от 0 до 9 и какие сегменты должны светиться на индикаторе, чтобы эту цифру отобразить, а какие должны быть потушены. Для описания этого мы использовали двумерный массив. Это массив, у которого каждый из элементов является тоже массивом. Посмотрим внимательнее: элементом под индексом 0 у массива digits[0] является массив {1, 1, 1, 1, 1, 1, 0}. Это перечисление состояний сегментов для отображения цифры 0. Порядок перечисления соответствует порядку в массиве segments. Это важно и потребуется нам для отображения цифр. Для того, чтобы обратиться элементу массива состояний нужно использовать выражение такого видаdigits[0][0], оно вернет 1.

В основном цикле программы мы с помощью цикла for перебираем цифры от 0 до 9 включительно и вызываем функцию draw_time(i) для каждой цифры. Обрати внимание на оператор меньше или равно <= в цикле for.

  1. void loop() {
  2. for (int i = 0; i <= 9; i++) {
  3. draw_time(i);
  4. delay(1000);
  5. }
  6. }

Рассмотрим код функции draw_time, которая предназначена для отображения цифры, передаваемой ей в качестве параметра.

  1. void draw_time(int digit) {
  2. for (int i = 0; i < 7; i++) {
  3. if (digits[digit][i]) digitalWrite(segments[i], HIGH);
  4. else digitalWrite(segments[i], LOW);
  5. }
  6. }

Если сегмент должен быть включен (digits[digit][i]), то нужно его зажечь. Номер пина, который нужно включить, записан в массиве segments в элементе с индексом i. Именно поэтому мы сделали так, что последовательность пинов в массиве segments соответствует им в массиве digits, чтобы у них были одинаковые индексы.

Дополнительные задания

Добавь к цифрам 0..9 еще буквы A, b, C d E F, чтобы секундомер переключал символы от 0 до F