Научившись подключать и управлять светодиодным индикатором попробуем использовать его для отображения данных. Сконструируем простейший секундомер, который отсчитывает и отображает секунды от 0 до 9.
Оставим схему, собранную на прошлом эксперименте.
Рисунок 1. Электрическая принципиальная схема эксперимента
Токоограничительные резисторы обязательны!
int segments[7] = {14, 13, 4, 5, 12, 16, 15}; // ABCDEFG int digits[10][7] = { {1, 1, 1, 1, 1, 1, 0}, // 0 {0, 1, 1, 0, 0, 0, 0}, // 1 {1, 1, 0, 1, 1, 0, 1}, // 2 {1, 1, 1, 1, 0, 0, 1}, // 3 {0, 1, 1, 0, 0, 1, 1}, // 4 {1, 0, 1, 1, 0, 1, 1}, // 5 {1, 0, 1, 1, 1, 1, 1}, // 6 {1, 1, 1, 0, 0, 0, 0}, // 7 {1, 1, 1, 1, 1, 1, 1}, // 8 {1, 1, 1, 1, 0, 1, 1}, // 9 }; void draw_time(int digit) { for (int i = 0; i < 7; i++) { } } void setup() { for (int i = 0; i < 7; i++){ } } void loop() { for (int i = 0; i < 7; i++) { draw_time(i); } }
В этой программе мы записали номера выводов микроконтроллера, к которым подключены сегменты индикатора, в массив 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
.
void loop() { for (int i = 0; i <= 9; i++) { draw_time(i); } }
Рассмотрим код функции draw_time
, которая предназначена для отображения цифры, передаваемой ей в качестве параметра.
void draw_time(int digit) { for (int i = 0; i < 7; i++) { } }
Если сегмент должен быть включен (digits[digit][i])
, то нужно его зажечь. Номер пина, который нужно включить, записан в массиве segments
в элементе с индексом i
. Именно поэтому мы сделали так, что последовательность пинов в массиве segments
соответствует им в массиве digits
, чтобы у них были одинаковые индексы.
Добавь к цифрам 0..9 еще буквы A, b, C d E F, чтобы секундомер переключал символы от 0 до F