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

В прошлом эксперименте мы научились выводить данные на LED - индикатор. Усовершенствуем немного схему и программу, что бы получить простейший секундомер, который отсчитывает и отображает секунды и будет управляться кнопкой.

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

Рисунок 1. Электрическая принципиальная схема эксперимента

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

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

Exp14
  1. int a = 8;
  2. int b = 9;
  3. int c = 11;
  4. int d = 5;
  5. int e = 4;
  6. int f = 7;
  7. int g = 6;
  8. int h = 10;
  9. int keyPin = 12;
  10.  
  11. // Цифра "Один"
  12. void display1(void) {
  13. digitalWrite(b,HIGH);
  14. digitalWrite(c,HIGH);
  15. }
  16. // Цифра "Два"
  17. void display2(void) {
  18. digitalWrite(a,HIGH);
  19. digitalWrite(b,HIGH);
  20. digitalWrite(g,HIGH);
  21. digitalWrite(e,HIGH);
  22. digitalWrite(d,HIGH);
  23. }
  24. // Цифра "Три"
  25. void display3(void) {
  26. digitalWrite(a,HIGH);
  27. digitalWrite(b,HIGH);
  28. digitalWrite(c,HIGH);
  29. digitalWrite(d,HIGH);
  30. digitalWrite(g,HIGH);
  31. }
  32. // Цифра "Четыре"
  33. void display4(void) {
  34. digitalWrite(f,HIGH);
  35. digitalWrite(b,HIGH);
  36. digitalWrite(g,HIGH);
  37. digitalWrite(c,HIGH);
  38. }
  39. // Цифра "Пять"
  40. void display5(void) {
  41. digitalWrite(a,HIGH);
  42. digitalWrite(f,HIGH);
  43. digitalWrite(g,HIGH);
  44. digitalWrite(c,HIGH);
  45. digitalWrite(d,HIGH);
  46. }
  47. // Цифра "Шесть"
  48. void display6(void) {
  49. digitalWrite(a,HIGH);
  50. digitalWrite(f,HIGH);
  51. digitalWrite(g,HIGH);
  52. digitalWrite(c,HIGH);
  53. digitalWrite(d,HIGH);
  54. digitalWrite(e,HIGH);
  55. }
  56. // Цифра "Семь"
  57. void display7(void) {
  58. digitalWrite(a,HIGH);
  59. digitalWrite(b,HIGH);
  60. digitalWrite(c,HIGH);
  61. }
  62. // Цифра "Восемь"
  63. void display8(void) {
  64. digitalWrite(a,HIGH);
  65. digitalWrite(b,HIGH);
  66. digitalWrite(g,HIGH);
  67. digitalWrite(c,HIGH);
  68. digitalWrite(d,HIGH);
  69. digitalWrite(e,HIGH);
  70. digitalWrite(f,HIGH);
  71. }
  72. // Цифра "Девять"
  73. void display9(void) {
  74. digitalWrite(a,HIGH);
  75. digitalWrite(b,HIGH);
  76. digitalWrite(g,HIGH);
  77. digitalWrite(c,HIGH);
  78. digitalWrite(d,HIGH);
  79. digitalWrite(f,HIGH);
  80. }
  81. // Цифра "Нуль"
  82. void display0(void) {
  83. digitalWrite(a,HIGH);
  84. digitalWrite(b,HIGH);
  85. digitalWrite(c,HIGH);
  86. digitalWrite(d,HIGH);
  87. digitalWrite(e,HIGH);
  88. digitalWrite(f,HIGH);
  89. }
  90. //Очистка дисплея
  91. void clearDisplay(void) {
  92. digitalWrite(a,LOW);
  93. digitalWrite(b,LOW);
  94. digitalWrite(g,LOW);
  95. digitalWrite(c,LOW);
  96. digitalWrite(d,LOW);
  97. digitalWrite(e,LOW);
  98. digitalWrite(f,LOW);
  99. }
  100.  
  101. void setup() {
  102. int i;
  103. for(i=4;i<=11;i++)
  104. pinMode(i,OUTPUT);
  105. pinMode(keyPin,INPUT);
  106. digitalWrite(h,HIGH);
  107. display0();
  108. }
  109.  
  110. int x = -1;
  111. int switchState = 0;
  112. int oldSwitchState = 0;
  113. boolean lightsOn = false;
  114. void loop() {
  115. switchState = digitalRead(keyPin);
  116. if (switchState != oldSwitchState) {
  117. oldSwitchState = switchState;
  118. if (switchState == HIGH) {
  119. lightsOn = !lightsOn;
  120. }
  121. }
  122. if(lightsOn) {
  123. delay(100);
  124. x = x + 1;
  125. }
  126. if (x == 0) {clearDisplay(); display0();}
  127. if (x == 1) {clearDisplay(); display1();}
  128. if (x == 2) {clearDisplay(); display2();}
  129. if (x == 3) {clearDisplay(); display3();}
  130. if (x == 4) {clearDisplay(); display4();}
  131. if (x == 5) {clearDisplay(); display5();}
  132. if (x == 6) {clearDisplay(); display6();}
  133. if (x == 7) {clearDisplay(); display7();}
  134. if (x == 8) {clearDisplay(); display8();}
  135. if (x == 9) {clearDisplay(); display9();}
  136. if (x > 9) {x = 0;}
  137. }

На первый взгляд программа может показаться очень сложной, но не стоит пугаться, давайте присмотримся повнимательнее.
В начале программы мы инициализируем переменные соответствующие номерам пинов к которым подключен LED - индикатор и кнопка.
Далее следуют одиннадцать функций очень похожих друг на друга. При выполнении функций display0()…display9() на LED - индикаторе зажигаются цифры от 0 до 9, а при выполнении функции clearDisplay() все сегменты индикатора гаснут.
В функции setup() настраиваем пины контроллера и запускаем на выполнение функцию display0(), что-бы на индикаторе при запуске сразу загорелся «0».
В функции loop() прописан обработчик кнопки, который запускает или останавливает смену цифр на LED - индикаторе.
Благодаря тому, что мы отображение цифр вынесли в отдельные функции, основной цикл программы более прост и легче читаем. Кроме того при допущении ошибки ее легче найти и исправить.

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

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

Задание повышенной сложности

Напиши программу с аналогичным результатом используя массивы