В прошлом примере #1, на предыдущей странице, предложил совместить в скетче два варианта управления светодиодом. Получается, что добавив внешнюю кнопку, по её нажатию, мы будем управлять кодом скетча (программы). Ниже рассмотрим этот пример.
Начнём с того, что добавим в схему ещё кнопку SB2, сигнал с который мы будем подавать на pin4. Для этой кнопки так же добавим стягивающий резистор R3 на 10...18 кОм. Схема представлена на рисунке ниже.
Кнопка SB2 одним контактом подключена к +5V, а второй контакт к стягивающему резистору R3. От их соединения идёт подключение к контакту pin4. Второй свободный вывод резистора R3 подключен к контакту GND. Светодиод VD1(HL1) подключаем через ограничивающий резистор 330...1000 Ом.
Всё, подключения сделаны, переходим к программе.
Добавим в скетч переменную switchPin, которая будет определять pin для управления режимами работы светодиода.
Добавим переменные currentSwitch и lastSwitch для хранения состояния этой переключающей кнопки. Добавим переменную flag, через неё мы будем переключать код программы.
В настроечную функцию setup() добавим инициализацию новой кнопки, определив её как вход (INPUT). В рабочей функции loop() мы совместим коды разных режимов работы светодиода.
В начале работы функции loop() мы опрашиваем кнопку выбора режима, и если она была нажата, то выбираем тот код программы, который будет задавать определённый режим работы кнопки SB1, управляющей работой светодиода.
Так как у нас всего два режима работы светодиода, то достаточно использовать конструкцию if-else.
Вот полный скетч, его можно скопировать и вставить в свой Arduino IDE:
/************************************************************* * 2018-03-11 Mr.ALB Тренировка в программировании Ардуино *************************************************************/ // Переменные с пинами подключенных устройств int buttonPin = 2;// Подключаем кнопку SB1 на 2-й pin int switchPin = 4;// Подключаем кнопку SB2 на 4-й pin // Подключаем светодиод на 5-й pin, можно на любой с PWM int ledPin = 5; // Переменные для хранения состояния кнопки и светодиода boolean lastButton = LOW; boolean currentButton = LOW; boolean lastSwitch = false; boolean currentSwitch = false; boolean flag = false;// Изначально установлен 1-й режим int ledLevel = 0; // Настройка изменения яркости int deltaLevel = 10; // Шаг изменения яркости int sign = 1; // Знак шага int step_delay = 120;// Здержка в шаге изменения яркости светодиода // Настройка сигнализатора окончания изменения яркости // Число морганий светодиода на pin13 (LED_BUILTIN) int max_blink = 3; // Задержка состояния светодиода, немного уменьшил int blink_delay = 250; /************************************************************* * Настроечная функция, выполняется один раз вначале *************************************************************/ void setup() { pinMode(buttonPin, INPUT); pinMode(switchPin, INPUT);// Pin устанавливаем как вход pinMode(ledPin, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); // Потушим светодиод на pin13 (LED_BUILTIN) digitalWrite(LED_BUILTIN, LOW); } /************************************************************* * При нажатии на кнопку SB1: * Режим 1: Светодиод медленно увеличивает яркость * При повторном нажатии на кнопку, * светодиод медленно гаснет. * Режим 2: Светодиод медленно увеличивает яркость до максимума, * а затем уменьшает яркость до полного потухания. * При нажатии на кнопку SB2 * происходит смена режимов действия кнопки SB1 * *************************************************************/ void loop() { // Опрос кнопки SB2 currentSwitch = fn_debounce(lastSwitch,switchPin); // Переключаем режимы работы программы if(lastSwitch == LOW && currentSwitch == HIGH) { if(flag == false) flag = true; else flag = false; // Сигнализируем о смене режима программы fn_blink(1, blink_delay); } // Опрос кнопки SB1 currentButton = fn_debounce(lastButton,buttonPin); // Управляем работой светодиода по указанному режиму if(lastButton == LOW && currentButton == HIGH) { if(flag) { if(ledLevel == 0) sign = 1; if(ledLevel == 255) sign = -1; // Изменяем яркость светодиода fn_stepBrightness(step_delay,deltaLevel,sign); } else { fn_stepBrightness(step_delay,deltaLevel,1);// Зажигается fn_stepBrightness(step_delay,deltaLevel,-1);// Тухнет } // Сигнализируем об окончании изменения fn_blink(max_blink, blink_delay); } lastButton = currentButton;// Переписываем состояние кнопки SB1 lastSwitch = currentSwitch;// Переписываем состояние кнопки SB2 } /************************************************************* * Функция для подавления дребезга * Модифицирована, добавлен опрос конкретного pin-а *************************************************************/ boolean fn_debounce(boolean last,int btnPin) { // Читаем состояние кнопки boolean current = digitalRead(btnPin); if(last != current) { delay(5); current = digitalRead(btnPin); } return current; } /************************************************************* * Функция сигнализации окончания цикла * изменения яркости светодиода *************************************************************/ void fn_blink(int blink_max, int blink_delay) { for(int i = 0; i < blink_max; i++) { digitalWrite(LED_BUILTIN, HIGH); delay(blink_delay); digitalWrite(LED_BUILTIN, LOW); delay(blink_delay); } } /************************************************************* * Функция изменения яркости светодиода *************************************************************/ void fn_stepBrightness(int step_delay, int deltaLevel, int sign) { for(int i = 0; i < (int(256 / deltaLevel) + 1); i++) { ledLevel = ledLevel + deltaLevel * sign; // Ограничиваем диапазон значений ledLevel = constrain(ledLevel, 0, 255); delay(blink_delay); analogWrite(ledPin, ledLevel); delay(step_delay); } }
Как вы видели, в скетче немного модифицировал функцию устранения дребезга debounse в fn_debounce, добавил ещё один аргумент для указания какой pin опрашивать, так как у нас уже две кнопки, а в дальнейшем их может быть много.
Можно представленный скетч модернизировать: режимы работы кнопки выделить в отдельные функции, или в одну функцию с аргументом выбора режима. Тогда вызывая её в loop(), и определяя номер режима, можно создать очень много режимов работы светодиода или какого другого исполнительного механизма. Конечно, в таком случае портебуется использовать не конструкцию if-else, а, к примеру, switch, и тип переменной flag определить как int.
Скетч можно скачать тут: sketch__2.zip
2018-07-23