Уроки Ардуино. Индикатор времени нажатия кнопки.
Это четвертый урок курса и здесь мы будем использовать только компоненты из предыдущих уроков. А значит владельцы любого из наборов серии «Дерзай» («Базовый«, «Изучаем Arduino» и «Умный дом«) смогут его повторить. Уже на следующем уроке мы приступим к созданию первой игры на Arduino, а на уроке нам надо получить навыки по измерению времени нажатия кнопок. Они нам пригодятся при написании игры.
Мы создадим проект «Индикатор времени нажатия кнопки». Для данного проекта Вам понадобятся следующие детали, которые имеются в каждом из наборов Arduino :
- Arduino Uno;
- Кабель USB;
- Плата прототипирования;
- Провода «папа-папа» — 15 шт;
- Резисторы 220 Ом – 8 шт;
- Светодиоды – 8 шт;
- Кнопка – 2 шт;
- Резисторы 10 кОм – 2 шт;
- Потенциометр.
В качестве индикатора мы будем использовать шкалу из 8 светодиодов. Можно время нажатия кнопки измерять в секундах. Тогда для нажатия 1 секунда необходимо зажечь 1 светодиод, для времени нажатия 8 секунд – 8 светодиодов. Мы немного усложним задание и будем измерять время нажатия кнопки в условных единицах, например условная единица может принимать значение от 500 миллисекунд до 2 секунд. Значение условной единицы мы будем регулировать потенциометром, используя его в качестве аналогового датчика (см. Урок 3 ).
В программе 2 режима:
Режим 0 — ожидание – ждем нажатия первой кнопки. Индикация на светодиодной шкале предыдущего измерения.
Режим 1 — измерение – начинается по нажатию первой кнопки (отображение уровня на шкале горящими светодиодами). При отжатии кнопки подсчет останавливается и переходим в режим 0.
Режим 2 — установка уровня условной единицы – устанавливаем потенциометром значение условной единицы (отображение уровня на шкале мигающими светодиодами).
Будем использовать две кнопки. Нажатие на вторую кнопку – переключение из режима измерения в режим установки условной единицы и обратно. Во время режима 2, измерения времени нажатия первой кнопки не происходит.
Собираем схему, показанную на рисунке 1.
Рисунок 1. Схема соединений
Теперь приступим к написанию скетча.
В основном цикле прораммы – проверка факта нажатия или отжатия кнопки. И установка по этим событиям режима работы программы (0, 1 или 2). Далее в основном цикле программы для режима 1 проверяем время нажатия, переводим его в показания шкалы и вызываем функцию setleds() для индикации. Для режима 2 проверяем показания потенциометра (значение на аналоговом входе A0) и переводим их в значение условной единицы, а также переводим их в показания шкалы, при этом индикация идет с миганием с периодичностью 500 мсек.
Создадим в Arduino IDE новый скетч, занесем в него код из листинга 1 и загрузим скетч на на плату Arduino. Напоминаем, что в настройках Arduino IDE необходимо выбрать тип платы (Arduino UNO) и порт подключения платы.
Листинг 1
// количество кнопок #define COUNT_BUTTONS 2 // количество светодиодов #define COUNT_LEDS 8 // Аналоговый вход A0 для подключения потенциометра const int POT=0; // переменная для хранения значения потенциометра int valpot = 0; // условная единица мсек/1 шкалы int valscale=1000; // Выводы Arduino для подключения // список светодиодов int pinleds[8]={4,5,6,7,8,9,10,11}; // переменная для хранения времени нажатия мсек unsigned long alltimepressing=0; // переменная для хранения значения шкалы int countleds1=0; // список кнопок int pinbuttons[2]={2,3}; // список сохранения предыдущих состояний кнопок int lastbuttons[2]={0,0}; // список сохранения текущих состояний кнопок int currentbuttons[2]={0,0}; // состояние кнопки boolean pressing[2]={false,false}; // режим программы 0 - ожидание измерения, 1 - измерение, // 2 - установка единицы int res=0; // счетчик миллисекунд нажатия кнопки unsigned long millispressing=0; // служебная для мигагия unsigned long millisblink2=0; boolean blink2=true; void setup() { Serial.begin(9600); // настроить выводы Arduino для светодиодов как выходы for(int i=0;i<COUNT_LEDS;i++) { pinMode(pinleds[i], OUTPUT); digitalWrite(pinleds[i],LOW); } } void loop() { // проверка нажатия/отжатия кнопок for(int i=0;i<COUNT_BUTTONS;i++) { currentbuttons[i] = debounce(lastbuttons[i],pinbuttons[i]); if (lastbuttons[i] == 0 && currentbuttons[i] == 1) // если нажатие... { // реакция на нажатие Serial.print("press=");Serial.println(i); if(i==1) // кнопка 2 { if(res==1) res=2; else res=2-res; millisblink2=millis(); blink2=true; if(res==0) setleds(0); } else // кнопка 1 { if(res<2) // включение режима 1 { res=1; millispressing=millis(); alltimepressing=0; } } } if (lastbuttons[i] == 1 && currentbuttons[i] == 0) // если отжатие... { // реакция на отжатие Serial.print("un_press=");Serial.println(i); if(i==0) // кнопка 1 { if(res<2) res=0; } } lastbuttons[i] = currentbuttons[i]; } if(res==1) // подсчет времени нажатия и отображение { alltimepressing=millis()-millispressing; countleds1=min(8,alltimepressing/valscale); setleds(countleds1); } else if(res==2) // отображение уровня условной единицы { valpot = analogRead(POT); // чтение данных потенциометра valscale=map(valpot,0,1023,500,2000); if(blink2) setleds(map(valpot,0,1023,1,8)); // мигание - включить else setleds(0); // мигание - вывключить if(millis()-millisblink2>=500) // помянять флаг мигания { millisblink2=millis(); blink2=!blink2; } } } // (включение-выключение светодиодов) void setleds(int cnt) { // включение светодиодов от 0 до count1 for(int i=0;i<cnt;i++) digitalWrite(pinleds[i],HIGH); // включение светодиодов от 0 до count1 for(int i=cnt;i<COUNT_LEDS;i++) digitalWrite(pinleds[i],LOW); } /* Функция сглаживания дребезга * Принимает в качестве аргумента предыдущее состояние кнопки, * и выдает фактическое. */ int debounce(int last,int pin1) { int current = digitalRead(pin1); // Считать состояние кнопки if (last != current) // если изменилось... { delay(5); // ждем 5мс current = digitalRead(pin1); // считываем состояние кнопки return current; // возвращаем состояние кнопки } }
После загрузки жмем кнопку и наблюдаем увеличение значение на шкале светодиодов. В режиме 2 с помощью потенциометра устанавливаем значение условной единицы (скорость прироста значения времени нажатия) (см. рисунок 2,3).
Рисунок 2,3. Индикатор времени нажатия кнопки
На следующем уроке мы приступим к написанию игры на Arduino под названием ping-pong.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.