===== Эксперимент 26. Секундомер =====
Научившись подключать и управлять светодиодным индикатором попробуем использовать его для отображения данных. Сконструируем простейший секундомер, который отсчитывает и отображает секунды от 0 до 9.
==== Схема эксперимента ====
Оставим схему, собранную на прошлом эксперименте.
{{ :products:esp-iot:exp9_sch.png?nolink |}}
//Рисунок 1. Электрическая принципиальная схема эксперимента//
Токоограничительные резисторы обязательны!
{{ :products:esp-iot:exp9_mont.png?direct&600 |}}
//Рисунок 2. Монтажная схема эксперимента//
==== Программный код эксперимента ====
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++) {
if (digits[digit][i]) digitalWrite(segments[i], HIGH);
else digitalWrite(segments[i], LOW);
}
}
void setup() {
for (int i = 0; i < 7; i++){
pinMode(segments[i], OUTPUT);
}
}
void loop() {
for (int i = 0; i < 7; i++) {
draw_time(i);
delay(1000);
}
}
В этой программе мы записали номера выводов микроконтроллера, к которым подключены сегменты индикатора, в массив ''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);
delay(1000);
}
}
Рассмотрим код функции ''draw_time'', которая предназначена для отображения цифры, передаваемой ей в качестве параметра.
void draw_time(int digit) {
for (int i = 0; i < 7; i++) {
if (digits[digit][i]) digitalWrite(segments[i], HIGH);
else digitalWrite(segments[i], LOW);
}
}
Если сегмент должен быть включен ''(digits[digit][i])'', то нужно его зажечь. Номер пина, который нужно включить, записан в массиве ''segments'' в элементе с индексом ''i''. Именно поэтому мы сделали так, что последовательность пинов в массиве ''segments'' соответствует им в массиве ''digits'', чтобы у них были одинаковые индексы.
* [[https://alexgyver.ru/lessons/arrays/|Подробнее о массивах]]
==== Дополнительные задания ====
Добавь к цифрам 0..9 еще буквы A, b, C d E F, чтобы секундомер переключал символы от 0 до F