===== Эксперимент 14. Секундомер =====
В прошлом эксперименте мы научились выводить данные на LED - индикатор. Усовершенствуем немного схему и программу, что бы получить простейший секундомер, который отсчитывает и отображает секунды и будет управляться кнопкой.
==== Схема эксперимента ====
{{ :products:ardu:exp14_shema_tk.png?nolink&400 |}}
{{ :products:ardu:exp13_sch.png?nolink&400 |}}
//Рисунок 1. Электрическая принципиальная схема эксперимента//
{{ :products:ardu:exp14.png?direct&600 |}}
//Рисунок 2. Монтажная схема эксперимента//
==== Программный код эксперимента ====
int a = 8;
int b = 9;
int c = 11;
int d = 5;
int e = 4;
int f = 7;
int g = 6;
int h = 10;
int keyPin = 12;
// Цифра "Один"
void display1(void) {
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
}
// Цифра "Два"
void display2(void) {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(e,HIGH);
digitalWrite(d,HIGH);
}
// Цифра "Три"
void display3(void) {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(g,HIGH);
}
// Цифра "Четыре"
void display4(void) {
digitalWrite(f,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
}
// Цифра "Пять"
void display5(void) {
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
}
// Цифра "Шесть"
void display6(void) {
digitalWrite(a,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
}
// Цифра "Семь"
void display7(void) {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
}
// Цифра "Восемь"
void display8(void) {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
}
// Цифра "Девять"
void display9(void) {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(g,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(f,HIGH);
}
// Цифра "Нуль"
void display0(void) {
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
}
//Очистка дисплея
void clearDisplay(void) {
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(g,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
}
void setup() {
int i;
for(i=4;i<=11;i++)
pinMode(i,OUTPUT);
pinMode(keyPin,INPUT);
digitalWrite(h,HIGH);
display0();
}
int x = -1;
int switchState = 0;
int oldSwitchState = 0;
boolean lightsOn = false;
void loop() {
switchState = digitalRead(keyPin);
if (switchState != oldSwitchState) {
oldSwitchState = switchState;
if (switchState == HIGH) {
lightsOn = !lightsOn;
}
}
if(lightsOn) {
delay(100);
x = x + 1;
}
if (x == 0) {clearDisplay(); display0();}
if (x == 1) {clearDisplay(); display1();}
if (x == 2) {clearDisplay(); display2();}
if (x == 3) {clearDisplay(); display3();}
if (x == 4) {clearDisplay(); display4();}
if (x == 5) {clearDisplay(); display5();}
if (x == 6) {clearDisplay(); display6();}
if (x == 7) {clearDisplay(); display7();}
if (x == 8) {clearDisplay(); display8();}
if (x == 9) {clearDisplay(); display9();}
if (x > 9) {x = 0;}
}
На первый взгляд программа может показаться очень сложной, но не стоит пугаться, давайте присмотримся повнимательнее.\\
В начале программы мы инициализируем переменные соответствующие номерам пинов к которым подключен LED - индикатор и кнопка.\\
Далее следуют одиннадцать функций очень похожих друг на друга. При выполнении функций ''display0()...display9()'' на LED - индикаторе зажигаются цифры от 0 до 9, а при выполнении функции ''clearDisplay()'' все сегменты индикатора гаснут.\\
В функции ''setup()'' настраиваем пины контроллера и запускаем на выполнение функцию ''display0()'', что-бы на индикаторе при запуске сразу загорелся **"0"**.\\
В функции ''loop()'' прописан обработчик кнопки, который запускает или останавливает смену цифр на LED - индикаторе.\\
Благодаря тому, что мы отображение цифр вынесли в отдельные функции, основной цикл программы более прост и легче читаем. Кроме того при допущении ошибки ее легче найти и исправить.
==== Дополнительное задание ====
Добавь к цифрам 0..9 еще буквы A, b, C d E F, чтобы секундомер переключал символы от 0 до F
=== Задание повышенной сложности ===
Напиши программу с аналогичным результатом используя массивы