Эксперимент 27. Счетчик

Проведем еще один эксперимент с индикатором, чтобы закрепить знания. В прошлом эксперименте цифры переключались сами, а теперь мы будем переключать их по нажатию на кнопку. Получится счетчик нажатий на кнопку.

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

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

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

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

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

Exp27.ino
  1. #define BUTTON_PIN 0
  2.  
  3. bool button_state = LOW;
  4. bool button_old_state = LOW;
  5. int count = 0;
  6.  
  7. int segments[7] = {14, 13, 4, 5, 12, 16, 15}; // ABCDEFG
  8.  
  9. int digits[10][7] = {
  10. {1, 1, 1, 1, 1, 1, 0}, // 0
  11. {0, 1, 1, 0, 0, 0, 0}, // 1
  12. {1, 1, 0, 1, 1, 0, 1}, // 2
  13. {1, 1, 1, 1, 0, 0, 1}, // 3
  14. {0, 1, 1, 0, 0, 1, 1}, // 4
  15. {1, 0, 1, 1, 0, 1, 1}, // 5
  16. {1, 0, 1, 1, 1, 1, 1}, // 6
  17. {1, 1, 1, 0, 0, 0, 0}, // 7
  18. {1, 1, 1, 1, 1, 1, 1}, // 8
  19. {1, 1, 1, 1, 0, 1, 1}, // 9
  20. };
  21.  
  22. void draw_time(int digit) {
  23. for (int i = 0; i < 7; i++) {
  24. if (digits[digit][i]) digitalWrite(segments[i], HIGH);
  25. else digitalWrite(segments[i], LOW);
  26. }
  27. }
  28.  
  29. void setup() {
  30. for (int i = 0; i < 7; i++){
  31. pinMode(segments[i], OUTPUT);
  32. }
  33. pinMode(BUTTON_PIN, INPUT);
  34. draw_time(count);
  35. }
  36.  
  37. void loop() {
  38. button_state = digitalRead(BUTTON_PIN);
  39. if (button_state == LOW and button_old_state == HIGH) {
  40. count++;
  41. if (count > 9) count = 0;
  42. draw_time(count);
  43. }
  44. button_old_state = button_state;
  45. }

Объявляем переменные и настраиваем кнопку.

  1. bool button_state = LOW;
  2. bool button_old_state = LOW;
  3. int count = 0;

В переменную button_state будем считывать состояние кнопки, d button_sstate_old — хранить прошлое состояние кнопки, чтобы обнаруживать нажатия, а в count — хранить количество зарегистрированных нажатий.

Логика работы программы аналогична прошлому эксперименту, кроме основного цикла. Сначала определяем состояние кнопки. Если новое состояние «нажато» и прошлое «не нажато», то увеличиваем значение счетчика нажатий.

  1. button_state = digitalRead(BUTTON_PIN);
  2. if (button_state == LOW and button_old_state == HIGH) {
  3. count++;

Проверяем не переполнился ли счетчик, если количество нажатий было больше 9, то обнуляем его. Отображаем текущее состояние счетчика нажатий на дисплее

  1. if (count > 9) count = 0;
  2. draw_time(count);

Записываем текущее состояние кнопки как старое.

  1. button_old_state = button_state;

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

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