===== Эксперимент 27. Счетчик ===== Проведем еще один эксперимент с индикатором, чтобы закрепить знания. В прошлом эксперименте цифры переключались сами, а теперь мы будем переключать их по нажатию на кнопку. Получится счетчик нажатий на кнопку. ==== Схема эксперимента ==== Добавим кнопку к схеме собранной ранее. {{ :products:esp-iot:exp11_sch.png?nolink |}} //Рисунок 1. Электрическая принципиальная схема эксперимента// Токоограничительные резисторы обязательны! {{ :products:esp-iot:exp11_mont.png?direct&600 |}} //Рисунок 2. Монтажная схема эксперимента// ==== Программный код эксперимента ==== #define BUTTON_PIN 0 bool button_state = LOW; bool button_old_state = LOW; int count = 0; 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); } pinMode(BUTTON_PIN, INPUT); draw_time(count); } void loop() { button_state = digitalRead(BUTTON_PIN); if (button_state == LOW and button_old_state == HIGH) { count++; if (count > 9) count = 0; draw_time(count); } button_old_state = button_state; } Объявляем переменные и настраиваем кнопку. bool button_state = LOW; bool button_old_state = LOW; int count = 0; В переменную ''button_state'' будем считывать состояние кнопки, d ''button_sstate_old'' — хранить прошлое состояние кнопки, чтобы обнаруживать нажатия, а в ''count'' — хранить количество зарегистрированных нажатий. Логика работы программы аналогична прошлому эксперименту, кроме основного цикла. Сначала определяем состояние кнопки. Если новое состояние "нажато" и прошлое "не нажато", то увеличиваем значение счетчика нажатий. button_state = digitalRead(BUTTON_PIN); if (button_state == LOW and button_old_state == HIGH) { count++; Проверяем не переполнился ли счетчик, если количество нажатий было больше 9, то обнуляем его. Отображаем текущее состояние счетчика нажатий на дисплее if (count > 9) count = 0; draw_time(count); Записываем текущее состояние кнопки как старое. button_old_state = button_state; ==== Дополнительные задания ==== * Добавь к цифрам 0..9 еще буквы A, b, C d E F, чтобы счетчик переключал символы от 0 до F. * Сделай обратный счетчик, чтобы его значение уменьшалось при нажатии