===== Эксперимент 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.
* Сделай обратный счетчик, чтобы его значение уменьшалось при нажатии