Szukaj kodu

Lekcja 14/31-3: Przykład 3 kodowania Arduino millis() z przyciskiem

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.

Zmontowany samochód Sunfounder

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 na 5000, 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 od 0 i jest aktualizowana do wartości millis() 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

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

Obrazy

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
918-Lesson 14/31-3: Arduino coding millis() example 3 with push button
Język: C++
/*
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");
      }
  }
  
}

Zasoby i odniesienia

Pliki📁

Instrukcja obsługi