Лекција 14/31-3: Arduino кодирање millis() пример 3 со копче
Дали некогаш сте требале вашиот Arduino да запомни кога се случило нешто—како притискање на копче—и потоа да преземе акција точно одредено време подоцна, сè додека остатокот од вашата програма работи непречено? Ова е класичен предизвик во Arduino програмирањето, а решението е функцијата millis(). Овој туторијал, дел од Robojax Arduino курсот, демонстрира практичен пример: откривање дали копче е притиснато втор пат по истекот на 5-секундно доцнење од првото притискање. Оваа техника е основна за создавање одговорни, неблокирачки проекти каде времето е критично.
Овој модел на користење на millis() за следење на времето без запирање на програмата е суштински за широк опсег на реални апликации. Еве неколку идеи за да ги инспирирате вашите сопствени проекти:
- Интерфејси со копчиња со дебаунсинг: Имплементирајте систем каде копчето мора да се држи одредено време (на пр., 3 секунди) за да се вклучи уред, спречувајќи случајни притискања.
- Секвенцијални акции: Креирајте систем каде еден настан, како активирање на сензор за движење, подготвува секундарна акција што се случува само ако друг настан се појави во одреден временски прозорец.
- Тајмери за корисничка интеракција: Изградете проект што бара „потврден“ влез (како второ притискање на копче) во одредено време за да изврши критична функција, како испраќање команда или стартување мотор.
- Портање на сензори: Користете прв сигнал од сензор за да започнете временски прозорец, во кој читањето на втор, различен сензор се смета за валидно или се игнорира.
Потребен хардвер
Овој проект користи компоненти од SunFounder 3-во-1 Arduino комплетот, кој е одличен ресурс за учење. Ќе ви требаат:
- Arduino плоча (Uno, Nano, итн.)
- Моментално притисно копче
- Поврзувачки жици
Водич за поврзување
Поврзувањето за овој пример е многу едноставно, благодарение на внатрешните pull-up отпорници на 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, ја извршува акцијата—во овој случај, печати порака на Serial Monitor-от.
Демонстрација на жив проект
Во видеото, кодот е поставен на Arduino, и Serial Monitor-от е отворен за да се набљудува однесувањето. (Во видеото на 16:03) Ќе ја видите вредноста на millis() како континуирано се печати, покажувајќи го времето од стартувањето на програмата. Кога ќе го притиснете копчето за прв пат, се печати порака како Прво притискање на:5019. Ако го притиснете копчето повторно и го држите повеќе од 5 секунди од првото притискање, се печати пораката Акција по 5 секунди од првото притискање. Ова демонстрира дека акцијата се активира само кога второто притискање се случува по истекот на одреденото доцнење.
Моќта на овој пристап е што линијата Serial.println(millis()) на врвот на циклусот продолжува да работи без прекин, докажувајќи дека временската логика не го блокира извршувањето на другиот код. Ова е основната предност на користењето millis() наместо функцијата delay().
Поврзани проекти од ова видео
- Лекција 14/31-1: Arduino Millis (без delay) и map функции | SunFounder Robojax
- Лекција 14/31-2: Arduino кодирање millis() пример 2 со настан
- Лекција 14/31-4: Arduino кодирање map() пример 1
- Лекција 14/31-5: Arduino кодирање map() пример 2
Поглавја
- [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] Практичен пример за мапирање на проценти на осветленост на LED
/*
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");
}
}
}
Работи што можеби ќе ви требаат
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Ресурси и референци
-
ДокументацијаDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
НадворешноPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Датотеки📁
Упатство за корисникот
-
Прирачник за склопување на SunFounder 3-во-1 Arduino паметен автомобилОвој документ покажува чекор по чекор склопување на SunFounder 3-во-1 Arduino паметен автомобил
SunFounder_car_assembly_manual.pdf1.20 MB