Уроки Ардуино: Башня из светящихся светодиодов
Это второй урок курса и здесь мы добавим еще идин электронный компонент – кнопку. Кнопки имеются в любом из наборов серии «Дерзай» («Базовый», «Изучаем Arduino» и «Умный дом»). И мы создадим проект «Строим – разбираем башню из светящихся светодиодов».
Для данного проекта Вам понадобятся следующие детали, которые имеются в каждом из наборов Arduino :
- Arduino Uno;
- Кабель USB;
- Плата прототипирования;
- Провода «папа-папа» — 12 шт;
- Резисторы 220 Ом – 8 шт;
- Светодиоды – 8 шт;
- Кнопка – 2 шт;
- Резисторы 10 кОм – 2 шт.
И так, начнем с описания проекта.
Восемь, подключенных к контроллеру Arduino, светодиодов расположены в ряд. Кладем первый «кирпич» (зажигаем первый светодиод). Положить на него следующий «кирпич» (зажечь следующий светодиод) и далее (максимум до восьмого). Снимаем «кирпич» – гасим последний зажженный светодиод. Одна кнопка у нас для укладки «кирпичей», другая – для снятия.
В состав каждого из наборов серии «Дерзай» входит книга Джереми Блюма «Изучаем Arduino: инструменты и методы технического волшебства». Я надеюсь, Вы уже изучили главы 2.7, 2.8, где рассказывается о подключении кнопки, о борьбе с дребезгом и приводятся примеры скетчей для работы с кнопкой. Тогда соберем на макетной плате схему, представленную на рисунке 1.
Рисунок 1. Схема соединений в проекте Ардуино
Теперь приступим к написанию скетча.
Весь основной цикл программы мы постоянно опрашиваем кнопки, ожидаем нажатия. После нажатия кнопки следует реакция – изменение переменной count1 (количества кирпичей (зажженных светодиодов) в башне). Обращаем внимание что это число не может быть меньше 0 и больше значения COUNT_LEDS. Функция change_count1() возвращает измененное состояние count1:
int change_count1(int but) { if(but==0) // добавить return min(count1+1,COUNT_LEDS); else // снять return max(count1-1,0); }
После изменения значения count1 нам необходимо «переcтроить» башню, чтобы она соответствовала новому значению count1. Нам нужно зажечь светодиоды с 0 до count1 и потушить светодиоды c count1 до последнего (COUNT_LEDS=8). Для этого вызываем функцию setleds(), передавая ей в качестве аргумента значение count1:
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); }
Для устранения дребезга кнопок используем функцию debounce() из книги Джереми Блюма «Изучаем Arduino: инструменты и методы технического волшебства».
Создадим в Arduino IDE новый скетч, занесем в него код из листинга 1 и загрузим скетч на на плату Arduino. Напоминаем, что в настройках Arduino IDE необходимо выбрать тип платы (Arduino UNO) и порт подключения платы.
Листинг 1
// количество кнопок #define COUNT_BUTTONS 2 // количество светодиодов #define COUNT_LEDS 8 // Выводы Arduino для подключения // список светодиодов int pinleds[8]={4,5,6,7,8,9,10,11}; // список кнопок int pinbuttons[2]={2,3}; // список сохранения предыдущих состояний кнопок int lastbuttons[2]={0,0}; // список сохранения текущих состояний кнопок int currentbuttons[2]={0,0}; // переменныя - количество кирпичей - горящих светодидов int count1=0; void setup() { // настроить выводы Arduino для светодиодов как выходы for(int i=0;i<COUNT_LEDS;i++) { pinMode(pinleds[i], OUTPUT); } // установить число кирпичей (0) setleds(0); } // the loop function runs over and over again forever void loop() { // проверка нажатия кнопок выбора программ for(int i=0;i<COUNT_BUTTONS;i++) { currentbuttons[i] = debounce(lastbuttons[i],pinbuttons[i]); if (lastbuttons[i] == 0 && currentbuttons[i] == 1) // если нажатие... { // реакция на нажатие - изменение count1 count1=change_count1(i); // обновление состояния башни setleds(count1); } lastbuttons[i] = currentbuttons[i]; } } // изменение количества кирпичей // (количества светодиодов) int change_count1(int but) { if(but==0) // добавить return min(count1+1,COUNT_LEDS); else // снять return max(count1-1,0); } // изменение состояния башни // (включение-выключение светодиодов) 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,3,4). Если у вас большее количество светодиодов, Вы можете увеличить максимальный размер башни, используя оставшиеся выводы Arduino.
Рисунок 2,3,4. Работа по постройке башни на макетной плате
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.