Szukaj kodu

Lekcja 14/31-2: Przykład 2 kodowania Arduino millis() z zdarzeniem

Lekcja 14/31-2: Przykład 2 kodowania Arduino millis() z zdarzeniem

W tym samouczku nauczysz się, jak używać funkcji Arduino millis(), aby wyzwolić działanie dopiero po upływie określonego czasu, bez blokowania reszty programu. To podstawowa technika tworzenia responsywnych projektów Arduino, w których wiele zadań musi działać jednocześnie, takich jak miganie diod LED podczas odczytu czujników lub monitorowania naciśnięć przycisków. Ten konkretny przykład skupia się na wyzwalaniu zdarzenia po pięciu sekundach, ale logika może być zastosowana w niezliczonych rzeczywistych scenariuszach.

Zmontowany samochód Sunfounder

Oto kilka praktycznych przykładów, jak możesz użyć tego wzorca we własnych projektach:

  • Opóźniona aktywacja: Włącz wentylator lub pompę dopiero po tym, jak system działa przez określony czas.
  • Blokady bezpieczeństwa: Wymagaj przytrzymania przycisku przez określony czas przed wykonaniem niebezpiecznej czynności, takiej jak uruchomienie silnika.
  • Alerty czasowe: Wyzwól alarm lub powiadomienie, jeśli odczyt czujnika nie zmienił się w określonym oknie czasowym.
  • Liczniki nieblokujące: Utwórz licznik „watchdog", który resetuje urządzenie, jeśli stanie się ono nieaktywne.

Podstawowym problemem, który to rozwiązuje, jest ograniczenie funkcji delay(). Gdy użyjesz delay(5000), Arduino przestaje wykonywać jakikolwiek inny kod przez te pięć sekund. To jest w porządku w przypadku prostych szkiców, ale staje się poważnym problemem w bardziej złożonych projektach, gdzie musisz odczytywać czujniki, aktualizować wyświetlacze lub nasłuchiwać naciśnięć przycisków podczas oczekiwania. Funkcja millis(), która zlicza milisekundy od momentu włączenia płytki, pozwala sprawdzić czas bez wstrzymywania programu.

Wymagany sprzęt

  • Płytka Arduino (Uno, Nano, Mega itp.)
  • Przycisk
  • Przewody połączeniowe

Schemat połączeń

Połączenia w tym przykładzie są bardzo proste. Używany jest wewnętrzny rezystor podciągający, więc nie jest potrzebny zewnętrzny rezystor dla przycisku.

  • Podłącz jedną nogę przycisku do pinu GND na Arduino.
  • Podłącz drugą nogę przycisku do pinu cyfrowego 2 na Arduino.

Ponieważ w kodzie używamy INPUT_PULLUP, pin będzie odczytywał HIGH, gdy przycisk nie jest wciśnięty, i LOW, gdy jest wciśnięty, łącząc pin z masą. (na filmie o 08:29)

Zrozumienie kodu

Ten kod demonstruje prosty licznik oparty na zdarzeniach. Program ciągle wypisuje bieżącą wartość millis() do monitora szeregowego. Gdy przycisk jest wciśnięty i przytrzymany, a Arduino działa przez co najmniej 5 sekund, wypisze „Take action" do monitora szeregowego. Kluczowe jest to, że sprawdzenie millis() nie zatrzymuje ciągłego wypisywania czasu.

Rozłóżmy na części konfigurowalne elementy kodu:

unsigned long event = 5000;// 5 sekund

To najważniejsza zmienna do skonfigurowania. Określa czas trwania „zdarzenia" w milisekundach. W tym przykładzie jest ustawiona na 5000, co równa się 5 sekundom. Aby zmienić opóźnienie, po prostu zmodyfikuj tę liczbę. Na przykład ustawienie jej na 10000 spowoduje wyzwolenie działania po 10 sekundach. Kluczowe jest użycie typu danych unsigned long, ponieważ wartość millis() może być bardzo duża i ostatecznie przekroczy maksymalną wartość standardowej zmiennej int, powodując błędy w porównaniach. (na filmie o 05:46)

pinMode(2,INPUT_PULLUP);

Ta linia konfiguruje pin cyfrowy 2 jako wejście i aktywuje jego wewnętrzny rezystor podciągający. To kluczowy krok konfiguracji, który pozwala podłączyć przycisk bez zewnętrznego rezystora. Pin będzie odczytywał HIGH domyślnie i przejdzie do LOW, gdy przycisk zostanie wciśnięty, łącząc go z masą. Jeśli chcesz użyć innego pinu, zmień liczbę 2 tutaj oraz w linii digitalRead(2) w pętli. (na filmie o 08:46)

Logika wewnątrz loop() jest prosta. Odczytuje stan przycisku. Jeśli przycisk jest wciśnięty (pb == LOW), sprawdza, czy bieżący czas (millis()) jest większy lub równy zdefiniowanemu czasowi event. Jeśli oba warunki są spełnione, wypisuje komunikat o działaniu. Reszta pętli, która wypisuje czas, działa bez przerwy, demonstrując przewagę millis() nad delay().

Ten przykład sprawdza czas od momentu uruchomienia Arduino. Trzeci przykład w serii wideo rozwija tę koncepcję, rejestrując czas pierwszego naciśnięcia przycisku i wyzwalając działanie tylko wtedy, gdy drugie naciśnięcie nastąpi co najmniej 5 sekund później. Ta logika jest omówiona w Lekcji 14/31-3: Przykład 3 z millis() w Arduino z przyciskiem.

Demonstracja działania projektu na żywo

Po wgraniu kodu i otwarciu monitora szeregowego (przy 9600 bodach) zobaczysz ciągły strumień liczb, reprezentujących milisekundy od momentu włączenia płytki. Jeśli naciśniesz i przytrzymasz przycisk przed upływem 5 sekund, nic się nie stanie. Jednak jeśli naciśniesz i przytrzymasz przycisk po upływie 5 sekund, zobaczysz komunikat „Take action" wypisany w monitorze szeregowym. Działanie będzie się wypisywać tak długo, jak przycisk jest przytrzymany. To demonstruje nieblokujący licznik, który pozwala innemu kodowi (wypisywaniu) działać płynnie. (na filmie o 10:52)

Powiązane projekty z tego filmu

Ten film jest częścią serii o funkcjach czasu i mapowania w Arduino. Poznaj inne poradniki stworzone z tego samego materiału źródłowego:

Rozdziały

  • [00:00] Wprowadzenie do millis() i zestawu SunFounder
  • [01:19] Co to jest millis() i dlaczego używać go zamiast delay()?
  • [03:06] Praktyczna demonstracja: wyświetlanie wartości millis()
  • [05:46] Tworzenie zdarzenia z millis() i unsigned long
  • [08:29] Podłączanie i kodowanie przycisku z INPUT_PULLUP
  • [10:52] Uruchamianie przykładu zdarzenia z przyciskiem
  • [12:14] Zapowiedź przykładu 3: wykrywanie drugiego naciśnięcia przycisku
  • [17:20] Wprowadzenie do funkcji map()
  • [19:47] Kodowanie i demonstracja funkcji map() z diodą LED

Obrazy

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
Język: C++
/*
Lesson 14/31: Arduino coding millis() example 2 with event
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
void setup() {
  Serial.begin(9600);//initialize serial monitor
  Serial.println("Introduction to millis");
  pinMode(2,INPUT_PULLUP);
  


}

void loop() {
  // Robojax.com millis() example 1
  Serial.println(millis());
  int pb = digitalRead(2);// read pin 2
  if(pb ==LOW)
  {
      if(millis() >= event)
      {
        Serial.println("Take action");
      }// if end
  }// if end
  
}// loop end

Zasoby i odniesienia

Pliki📁

Instrukcja obsługi