Lekcja 14/31-3: Przykład 3 kodowania Arduino millis() z przyciskiem
Czy kiedykolwiek potrzebowałeś, aby Twoje Arduino zapamiętało, kiedy coś się wydarzyło—na przykład naciśnięcie przycisku—a następnie wykonało akcję po dokładnie określonym czasie, jednocześnie pozwalając reszcie programu działać płynnie? To klasyczne wyzwanie w programowaniu Arduino, a rozwiązaniem jest funkcja millis(). Ten samouczek, będący częścią kursu Arduino Robojax, pokazuje praktyczny przykład: wykrywanie, czy przycisk został naciśnięty po raz drugi po upływie 5 sekund od pierwszego naciśnięcia. Ta technika jest podstawą do tworzenia responsywnych, nieblokujących projektów, w których czas ma kluczowe znaczenie.
Ten wzorzec użycia millis() do śledzenia czasu bez zatrzymywania programu jest niezbędny w szerokim zakresie rzeczywistych zastosowań. Oto kilka pomysłów, które mogą zainspirować Twoje własne projekty:
- Interfejsy przycisków z eliminacją drgań: Zaimplementuj system, w którym przycisk musi być przytrzymany przez określony czas (np. 3 sekundy), aby włączyć urządzenie, zapobiegając przypadkowym naciśnięciom.
- Sekwencyjne akcje: Stwórz system, w którym jedno zdarzenie, takie jak wyzwolenie czujnika ruchu, uzbraja dodatkową akcję, która występuje tylko wtedy, gdy inne zdarzenie nastąpi w określonym oknie czasowym.
- Timery interakcji z użytkownikiem: Zbuduj projekt wymagający "potwierdzenia" (np. drugiego naciśnięcia przycisku) w określonym czasie, aby wykonać kluczową funkcję, taką jak wysłanie polecenia lub uruchomienie silnika.
- Bramkowanie czujników: Użyj pierwszego sygnału z czujnika, aby rozpocząć okno czasowe, podczas którego odczyt z drugiego, innego czujnika jest uznawany za ważny lub ignorowany.
Wymagany sprzęt
Ten projekt wykorzystuje komponenty z zestawu SunFounder 3-in-1 Arduino, który jest świetnym zasobem do nauki. Będziesz potrzebować:
- Płytki Arduino (Uno, Nano itp.)
- Przycisku chwilowego
- Przewodów połączeniowych
Schemat połączeń
Okablowanie w tym przykładzie jest bardzo proste, dzięki wewnętrznym rezystorom podciągającym Arduino, co eliminuje potrzebę zewnętrznego rezystora. (Na filmie o 08:29)
- Podłącz jedną nogę przycisku do pinu GND na Arduino.
- Podłącz drugą nogę przycisku do cyfrowego pinu 2 na Arduino.
Używając INPUT_PULLUP, pin jest wewnętrznie podłączony do 5V, więc normalnie odczytuje HIGH. Po naciśnięciu przycisku pin jest łączony z GND, co powoduje odczyt LOW. To jest logika, której użyjemy w kodzie.
Wyjaśnienie kodu
Sednem tego projektu jest logika, która śledzi pierwsze naciśnięcie przycisku, a następnie sprawdza drugie naciśnięcie po określonym czasie. Kod jest zaprojektowany jako nieblokujący, co oznacza, że nie wstrzymuje wykonywania innych zadań w Twojej funkcji loop().
Na górze szkicu znajdziesz kluczowe zmienne konfigurowalne przez użytkownika, które kontrolują zachowanie czasowe:
unsigned long event = 5000;// 5 sekund
unsigned long buttonPushed =0;
event: To kluczowa zmienna czasowa. Ustawia czas opóźnienia w milisekundach. W tym przykładzie jest ustawiona na5000, co równa się 5 sekundom. Możesz zmienić tę wartość na dowolny inny czas, aby dopasować ją do potrzeb projektu.buttonPushed: Ta zmienna jest używana jako flaga i znacznik czasu. Zaczyna od0i jest aktualizowana do wartościmillis()przy pierwszym naciśnięciu przycisku. Ten zapisany czas jest następnie używany do obliczenia różnicy przy sprawdzaniu drugiego naciśnięcia.
Logika w funkcji loop() działa w dwóch etapach. Najpierw odczytuje stan przycisku i, jeśli jest naciśnięty po raz pierwszy (pb == LOW && buttonPushed == 0), zapisuje bieżący czas za pomocą millis() do zmiennej buttonPushed. Drugi etap sprawdza, czy przycisk jest nadal naciśnięty i czy pierwsze naciśnięcie zostało zarejestrowane. Jeśli tak, oblicza różnicę czasu między bieżącym czasem a czasem pierwszego naciśnięcia. Jeśli ta różnica jest większa lub równa czasowi event, wykonuje akcję—w tym przypadku wypisuje komunikat na monitorze szeregowym.
Demonstracja projektu na żywo
Na filmie kod jest wgrywany do Arduino, a monitor szeregowy jest otwierany, aby obserwować zachowanie. (Na filmie o 16:03) Zobaczysz, jak wartość millis() jest ciągle wypisywana, pokazując czas od uruchomienia programu. Po pierwszym naciśnięciu przycisku pojawi się komunikat, taki jak First push at:5019. Jeśli naciśniesz przycisk ponownie i przytrzymasz go dłużej niż 5 sekund od pierwszego naciśnięcia, pojawi się komunikat Action after 5 seconds of first push. To pokazuje, że akcja jest wyzwalana tylko wtedy, gdy drugie naciśnięcie nastąpi po upływie określonego czasu.
Potęga tego podejścia polega na tym, że linia Serial.println(millis()) na górze pętli działa bez przerwy, co dowodzi, że logika czasowa nie blokuje wykonywania innego kodu. To jest podstawowa zaleta używania millis() zamiast funkcji delay().
Powiązane projekty z tego filmu
- Lekcja 14/31-1: Arduino Millis (bez opóźnienia) i funkcje map | SunFounder Robojax
- Lekcja 14/31-2: Arduino kodowanie millis() przykład 2 ze zdarzeniem
- Lekcja 14/31-4: Arduino kodowanie map() przykład 1
- Lekcja 14/31-5: Arduino kodowanie map() przykład 2
Rozdziały
- [00:00] Wprowadzenie do millis() i kursu
- [01:19] Co to jest millis() i dlaczego go używać?
- [03:06] Pierwszy praktyczny przykład: drukowanie millis()
- [05:46] Użycie millis() do wyzwolenia zdarzenia po 5 sekundach
- [08:29] Przykład 2: Akcja przycisku z 5-sekundowym opóźnieniem
- [12:14] Przykład 3: Wykrywanie drugiego naciśnięcia przycisku po opóźnieniu
- [17:20] Wprowadzenie do funkcji map()
- [19:47] Praktyczny przykład mapowania procentów jasności diody 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");
}
}
}
Rzeczy, których możesz potrzebować
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Zasoby i odniesienia
-
DokumentacjaDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
ZewnętrznyPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Pliki📁
Instrukcja obsługi
-
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