Урок 14/31-3: Пример 3 программирования Arduino с millis() и кнопкой
Вам когда-нибудь было нужно, чтобы ваш Arduino запомнил, когда что-то произошло—например, нажатие кнопки—и затем выполнил действие через точный промежуток времени, при этом остальная часть программы продолжала работать без сбоев? Это классическая задача в программировании Arduino, и решением является функция millis(). Этот учебник, являющийся частью курса Robojax по Arduino, демонстрирует практический пример: обнаружение повторного нажатия кнопки через 5 секунд после первого нажатия. Этот метод является основой для создания отзывчивых, неблокирующих проектов, где время имеет решающее значение.
Этот шаблон использования millis() для отслеживания времени без остановки программы необходим для широкого спектра реальных приложений. Вот несколько идей для вдохновения ваших собственных проектов:
- Интерфейсы кнопок с защитой от дребезга: Реализуйте систему, где кнопку необходимо удерживать в течение определенного времени (например, 3 секунды) для включения устройства, предотвращая случайные нажатия.
- Последовательные действия: Создайте систему, где одно событие, например срабатывание датчика движения, активирует вторичное действие, которое происходит только в том случае, если другое событие происходит в течение определенного временного окна.
- Таймеры взаимодействия с пользователем: Создайте проект, требующий «подтверждающего» ввода (например, второго нажатия кнопки) в течение заданного времени для выполнения критической функции, такой как отправка команды или запуск двигателя.
- Вентилирование датчиков: Используйте первый сигнал от датчика для запуска временного окна, в течение которого показания второго, другого датчика считаются действительными или игнорируются.
Необходимое оборудование
В этом проекте используются компоненты из набора SunFounder 3-in-1 Arduino, который является отличным ресурсом для обучения. Вам понадобятся:
- Плата Arduino (Uno, Nano и т. д.)
- Тактовая кнопка
- Соединительные провода
Руководство по подключению
Подключение в этом примере очень простое благодаря внутренним подтягивающим резисторам Arduino, что исключает необходимость во внешнем резисторе. (В видео на 08:29)
- Подключите одну ножку кнопки к контакту GND на Arduino.
- Подключите другую ножку кнопки к цифровому контакту 2 на Arduino.
Используя INPUT_PULLUP, контакт внутренне подключен к 5V, поэтому он обычно считывает HIGH. При нажатии кнопки она соединяет контакт с GND, вызывая считывание LOW. Это логика, которую мы будем использовать в коде.
Объяснение кода
Ядро этого проекта—логика, которая отслеживает первое нажатие кнопки, а затем проверяет второе нажатие через определенный интервал времени. Код разработан как неблокирующий, то есть он не приостанавливает выполнение других задач в вашем loop().
В верхней части скетча вы найдете ключевые настраиваемые переменные, которые управляют временным поведением:
unsigned long event = 5000;// 5 секунд
unsigned long buttonPushed =0;
event: Это ключевая переменная времени. Она задает длительность задержки в миллисекундах. В этом примере она установлена на5000, что равно 5 секундам. Вы можете изменить это значение на любую другую длительность в соответствии с потребностями вашего проекта.buttonPushed: Эта переменная используется как флаг и метка времени. Она начинается с0и обновляется до значенияmillis()при первом нажатии кнопки. Это сохраненное время затем используется для расчета разницы при проверке второго нажатия.
Логика в функции loop() работает в два этапа. Сначала она считывает состояние кнопки и, если она нажата в первый раз (pb == LOW && buttonPushed == 0), записывает текущее время через millis() в переменную buttonPushed. Второй этап проверяет, нажата ли кнопка все еще и было ли записано первое нажатие. Если да, то вычисляется разница во времени между текущим временем и временем первого нажатия. Если эта разница больше или равна вашему времени event, выполняется действие—в данном случае вывод сообщения в монитор последовательного порта.
Живая демонстрация проекта
В видео код загружается в Arduino, и открывается монитор последовательного порта для наблюдения за поведением. (В видео на 16:03) Вы увидите, как значение millis() непрерывно выводится, показывая время с момента запуска программы. При первом нажатии кнопки выводится сообщение типа First push at:5019. Если вы нажмете кнопку снова и удержите ее более 5 секунд с момента первого нажатия, выводится сообщение Action after 5 seconds of first push. Это демонстрирует, что действие срабатывает только тогда, когда второе нажатие происходит после истечения указанной задержки.
Сила этого подхода в том, что строка Serial.println(millis()) в начале цикла продолжает выполняться без прерываний, доказывая, что логика времени не блокирует выполнение другого кода. Это фундаментальное преимущество использования millis() перед функцией delay().
Связанные проекты из этого видео
- Урок 14/31-1: Arduino Millis (без задержки) и функции map | SunFounder Robojax
- Урок 14/31-2: Пример 2 кода Arduino millis() с событием
- Урок 14/31-4: Пример 1 кода Arduino map()
- Урок 14/31-5: Пример 2 кода Arduino map()
Главы
- [00:00] Введение в millis() и курс
- [01:19] Что такое millis() и зачем его использовать?
- [03:06] Первый практический пример: вывод millis()
- [05:46] Использование millis() для запуска события через 5 секунд
- [08:29] Пример 2: Действие кнопки с задержкой 5 секунд
- [12:14] Пример 3: Обнаружение второго нажатия кнопки после задержки
- [17:20] Введение в функцию map()
- [19:47] Практический пример сопоставления процентов яркости светодиода
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
unsigned long event = 5000;// 5 seconds
unsigned long buttonPushed =0;
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
pinMode(2,INPUT_PULLUP);
}
void loop() {
// ilmoFan.com example-2 millis()
Serial.println(millis());
int pb = digitalRead(2);// read pin 2
if(pb ==LOW && buttonPushed ==0)
{
buttonPushed =millis();
Serial.print("First push at:");
Serial.println(buttonPushed);
}
if( pb ==LOW && buttonPushed >0 )
{
unsigned long difference = millis()- buttonPushed;
if( difference >= event)
{
Serial.println("Action after 5 seconds of first push");
}
}
}
Вещи, которые могут вам понадобиться
-
АмазонкаSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Амазонка
-
Амазонка
-
Амазонка
-
Амазонка
Ресурсы и ссылки
-
ДокументацияДокументация для набора 3 в 1 IoT/умный автомобиль/обучающий комплект SunFounderdocs.sunfounder.com
-
Внешний
Файлы📁
Руководство пользователя
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB