Esptop 10 z czujnikiem ruchu PIR za pomocą przerwań i timerów - Arduino IDE

Esptop 10 z czujnikiem ruchu PIR za pomocą przerwań i timerów - Arduino IDE

ESP32 to płyta mikrokontrolera oparta na IoT, która może być używana do interfejsu, kontroli i odczytu różnych czujników. PIR lub czujnik ruchu jest jednym z urządzeń, które możemy połączyć z ESP32, aby wykryć ruch obiektu w zakresie czujnika ruchu za pomocą ESP32.

Zanim zaczniemy interfejs ESP32 z czujnikiem PIR, musimy wiedzieć, jak działają przerwania i jak je czytać i obsługiwać w ESP32. Następnie musimy zrozumieć podstawową koncepcję funkcji Delay () i Millis () w programowaniu ESP32.

Omówmy szczegółowo działanie PIR z ESP32.

Oto treść tego artykułu:

  1. Co to są przerwania
    • 1.1: przerwa szpilki w ESP32
    • 1.2: Jak zadzwonić do przerwania w ESP32
  2. Timery w programowaniu ESP32
    • 2.1: Funkcja opóźnienia ()
    • 2.2: Funkcja millis ()
  3. Łączenie czujnika PIR z ESP32
    • 3.1: Czujnik ruchu PIR (HC-SR501)
    • 3.2: Pinout HC-SR501
    • 3.3: Kod
    • 3.4: Wyjście

1: Co to są przerwania

Większość wydarzeń, które mają miejsce w programowaniu ESP32, działa sekwencyjnie, co oznacza wiersz po wykonywaniu linii kodu. Aby obsłużyć i kontrolować zdarzenia, które nie muszą działać podczas sekwencyjnego wykonywania kodu Przerwania są używane.

Na przykład, jeśli chcemy wykonać określone zadanie, gdy wystąpi jakieś specjalne zdarzenie, lub sygnał spustowy jest podawany cyfrowym pinom mikrokontrolera, używamy przerwania.


Z przerwy nie musimy ciągle sprawdzać cyfrowego stanu pinu wejściowego ESP32. Gdy wystąpi przerwanie, procesor zatrzymuje program główny i nazywana jest nowa funkcja znana jako ISR (Rutyna usługi przerwania). Ten ISR Funkcja obsługuje przerwanie spowodowane po tym powrocie do programu głównego i rozpoczęcie wykonywania. Jednym z przykładów ISR jest Czujnik ruchu pir Który generuje przerwanie po wykryciu ruchu.

1: przerwa szpilki w ESP32

Zewnętrzne lub sprzętowe przerwanie może być spowodowane dowolnym modułem sprzętowym, taki jak czujnik dotykowy lub przycisk. Przerwanie dotykowe zdarzają się, gdy wykryto dotyk w pinach ESP32 lub przerywanie GPIO można również użyć po naciśnięciu klawisza lub przycisku.

W tym artykule spowodujemy przerwanie, gdy ruch zostanie wykryty za pomocą czujnika PIR z ESP32.

Prawie wszystkie szpilki GPIO oprócz 6 zintegrowanych pinów SPI, które zwykle pojawiają się w 36-Wersji płyty ESP32 nie można użyć do celów wywoływania przerwań. Aby otrzymać zewnętrzne przerwanie, następujące piny wyróżnione w fioletowym kolorze, które można użyć w ESP32:

Ten obraz ma 30 -pinowe ESP32.

2: Zadzwonienie do przerwania w ESP32

Aby użyć przerwania w ESP32, możemy zadzwonić załącznik () funkcjonować.

Ta funkcja akceptuje trzy argumenty:

    • Pin GPIO
    • Funkcja do wykonania
    • Tryb
załącznik (DigitalPintoInterrupt (GPIO), funkcja, tryb);


1: GPIO Pin to pierwszy argument zwany wewnątrz załącznik () funkcjonować. Na przykład, aby użyć cyfrowego pinu 12 jako źródła przerwania, możemy go nazwać za pomocą DigitalPintoInterrut (12) funkcjonować.

2: Funkcja Do wykonania jest program wykonywany za każdym razem, gdy przerwanie zostanie osiągnięte lub wyzwalane przez źródło zewnętrzne lub wewnętrzne. Może to mrugać diodą LED lub obracanie alarmu przeciwpożarowego.

3: Tryb jest trzecim i ostatnim argumentem, którego potrzebuje funkcja przerwania. Opisuje, kiedy wywołać przerwanie. Poniżej można użyć trybów:

    • Niski: Wywołaj przerwanie za każdym razem, gdy zdefiniowany pin GPIO jest niski.
    • Wysoki: Wywołaj przerwanie za każdym razem, gdy zdefiniowany pin GPIO jest wysoki.
    • Zmiana: Przerwanie wyzwalacza za każdym razem, gdy pin GPIO zmienia swoją wartość z wysokiej na niską lub odwrotnie.
    • Spadający: Tryb jest wyzwalaniem przerwania, gdy określony szpilka zaczyna spadać z wysokiego stanu do niskiego.
    • Rosnący: Tryb jest to wyzwalanie przerwania, gdy pewna szpilka zaczyna się rosnąć z niskiego stanu do wysokiego.

Dzisiaj będziemy używać Rosnący tryb jako trzeci argument funkcji przerwania, ilekroć czujnik PIR wykryje LED lub czujnik przerwania, ponieważ przechodzi od niskiego stanu do wysokiego.

2: Timery w programowaniu ESP32

Timery w programowaniu mikrokontrolera odgrywają znaczącą rolę w wykonywaniu instrukcji dla określonego okresu czasu lub w określonym przypadku czasu.

Dwie główne funkcje powszechnie używane do wyzwalania wyjścia są opóźnienie() I Millis (). Różnica między obiema jako funkcja opóźnienia () zatrzymuje resztę programu, gdy zacznie się wykonywać, podczas gdy Millis () działa przez określony czas, a program wraca do głównych funkcji.

Tutaj będziemy używać diody LED z czujnikiem PIR i nie chcemy go spustu lśnić po uruchomieniu przerwań. Będziemy używać funkcji Millis (), która pozwala nam świecić przez pewien określony czas, a następnie ponownie wróci do oryginalnego programu, gdy ten czas mija.

1: Funkcja opóźnienia ()

Funkcja opóźnienia () jest dość prosta, wymaga tylko jednego argumentu SM niepodpisanego typu danych. Ten argument reprezentuje czas w milisekundach, który chcemy zatrzymać program, dopóki nie przejdzie do następnej linii.

Na przykład następująca funkcja zatrzyma program dla 1 sekunda.

opóźnienie (1000)


opóźnienie () to rodzaj funkcji blokowania programowania mikrokontrolerów. opóźnienie () blokuje resztę kodu do wykonania, dopóki ten konkretny czas funkcji nie zakończy. Jeśli chcemy wykonać wiele instrukcji, powinniśmy unikać korzystania z funkcji opóźnienia, możemy użyć modułów RTC Millis lub Zewnętrznych.

2: Funkcja millis ()

Funkcja millis () zwraca liczbę przekazanych milisekund, ponieważ płyta ESP32 rozpoczęła obecny program. Pisząc kilka wierszy kodu, możemy łatwo obliczyć czas obecny w dowolnym instancji podczas uruchamiania kodu ESP32.

Millis jest powszechnie używany tam, gdzie musimy wykonywać wiele zadań bez blokowania reszty kodu. Oto składnia funkcji Millis używanej do obliczania, ile czasu minęło, abyśmy mogli wykonać konkretną instrukcję.

if (currentMillis - poprzednimillis> = interwał)
poprzednimillis = currentMillis;


Ten kod odejmuje poprzednie młyn () od bieżącego millis () Jeśli odejmowany czas jest równy w celu zdefiniowania interwału, zostanie wykonana określona instrukcja. Powiedzmy, że chcemy mrugnąć diodą LED przez 10 sekund. Po co 5 minutach możemy ustawić przedział czasu na 5 minut (300000 ms). Kod sprawdzi interwał za każdym razem, gdy kod się uruchomi, po osiągnięciu go mrugnie diodą LED przez 10 sekund.

Notatka: Tutaj będziemy używać funkcji Millis () do interfejsu ESP32 z czujnikiem PIR. Głównym powodem użycia Milli i nie opóźniania jest to, że funkcja Millis () nie blokuje kodu, tak jak funkcja opóźnienia (). Tak więc, gdy PIR wykryje ruch, zostanie wygenerowane przerwanie. Korzystanie z funkcji przerwania millis () uruchomi diodę LED na zdefiniowany czas później, jeśli funkcja ruchu zostanie zatrzymana millis ().

W przypadku, gdy użyliśmy funkcji opóźnienia (), całkowicie zablokuje to kod, a każde spowodowane przerwaniem nie zostanie odczytane przez ESP32, co spowoduje awarię projektu.

3: Interfejsowanie czujnika PIR z ESP32

Tutaj będziemy używać funkcji Millis () w kodzie Arduino IDE, ponieważ chcemy wyzwolić LED za każdym razem, gdy czujnik PIR wykryje pewien ruch. Ta dioda lśni przez określony czas później, wróci do normalnego stanu.

Oto lista komponentów, które będziemy wymagani:

    • Rada ds. Rozwoju ESP32
    • Czujnik ruchu PIR (HC-SR501)
    • PROWADZONY
    • 330 Ohm Resistor
    • Łączenie przewodów
    • Tablica chleba

Schematyczny dla czujnika PIR z ESP32:


Połączenia PIN ESP32 z czujnikiem PIR to:

ESP32 Czujnik pir
Vin VCC
GPIO13 NA ZEWNĄTRZ
GND GND

1: Czujnik ruchu PIR (HC-SR501)

Pir jest akronimem dla pasywny czujnik podczerwieni. Wykorzystuje parę czujników piroelektrycznych, które wykrywają ciepło wokół otoczenia. Oba te czujniki pyroelektryczne leżą jeden po drugim, a gdy obiekt wchodzi w ich zakres, zmiana energii cieplnej lub różnica sygnału między obiema czujnikami powoduje niskie wyjście czujnika PIR. Gdy PIR Out Pin zniknie, możemy ustawić konkretną instrukcję do wykonania.


Poniżej znajduje się charakterystyka czujnika PIR:

    • Czułość można ustawić w zależności od lokalizacji projektu (takiego jak wykrywanie myszy lub ruchy liści).
    • Czujnik PIR można ustawić, jak długo wykrywa obiekt.
    • Powszechnie używane w alarmach bezpieczeństwa w domu i innych zastosowaniach w zakresie wykrywania ruchu opartego na termicznych.

2: Pinout HC-SR501

PIR HC-SR501 jest wyposażony w trzy piny. Dwa z nich to piny zasilania dla VCC i GND, a jeden jest pinem wyjściowym dla sygnału spustu.


Poniżej znajduje się opis pinów czujników PIR:

Szpilka Nazwa Opis
1 VCC Pin wejściowy dla czujnika Podłącz do pin ESP32 VIN
2 NA ZEWNĄTRZ Wyjście czujnika
3 GND GND czujnika

3: Kod

Teraz program ESP32 Napisz podany kod w Arduino IDE Editor i prześlij go do ESP32.

#określone okresy czasowe 10
const int led = 4; /*Pin GPIO 4 zdefiniowany dla LED*/
const int pir_out = 13; /*Pin GPIO 13 dla pir out*/
unsigned długi current_time = millis (); /*zmienna zdefiniowana do przechowywania wartości młynów*/
niepodpisany długi poprzedni_trig = 0;
boolean start_time = false;
void iram_attr detectSmovement () /*Sprawdź ruch* /
Seryjny.println („wykryty ruch”);
DigitalWrite (LED, High); /*Włącz diodę LED, jeśli warunek jest prawdziwy*/
Start_time = true;
Poprzedni_trig = millis ();

void setup ()
Seryjny.rozpocząć (115200); /*Wskaźnik transmisji seryjnej*/
pinmode (pir_out, input_pullup); /*Tryb czujnika ruchu PIR zdefiniowany*/
/*PIR jest skonfigurowany w trybie rosnącym, ustaw pin czujnik ruchu jako wyjście*/
załącznik (DigitalPintoInterrupt (PIR_OUT), detectSmovement, Rising);
pinmode (LED, wyjście); /*zestaw prowadzący do niskiego*/
DigitalWrite (LED, niski);

void Loop ()
Current_time = millis (); /*przechowuj aktualny czas*/
if (start_time && (current_time - poprzedni_trig> (czasy TimeSecond*1000))) /*przedział czasu, po czym LED wyłączy się* /
Seryjny.println („ruch zatrzymany”); /*Wydrukuje ruch zatrzymany, jeśli nie wykryto żadnego ruchu*/
DigitalWrite (LED, niski); /*Ustaw o niskim poziomie, jeśli warunek jest fałszywy*/
Start_time = false;


Kod rozpoczął się od zdefiniowania pinów GPIO dla wyjścia LED i PIR. Następnie stworzyliśmy trzy różne zmienne, które pomogą włączyć LED po wykryciu ruchu.

Te trzy zmienne są Current_time, poprzedni_trig, I Czas startu. Zmienne te będą przechowywać czas bieżący, czas, w którym ruch jest wykrywany i timer po wykryciu ruchu.

Najpierw w części konfiguracji zdefiniowaliśmy szeregowy wskaźnik transmisji do komunikacji. Następnie za pomocą pinmode () Ustaw czujnik ruchu PIR jako podciąganie wejściowe. Aby ustawić przerwanie PIR załącznik () jest opisany. Opisano GPIO 13 w celu wykrycia ruchu w trybie wzrostu.

Dalej w części LOOP () Kod, za pomocą funkcji MILLIS () Włączamy i wyłączamy LED po osiągnięciu wyzwalacza.

4: Wyjście

W sekcji wyjściowej możemy zobaczyć, że obiekt jest poza zasięgiem czujnika PIR, więc PROWADZONY jest zmieniony WYŁĄCZONY.


Teraz ruch wykryty przez LED czujnika pir NA Do 10 Sec Następnie, jeśli nie zostanie wykryty ruch, pozostanie WYŁĄCZONY Do otrzymania następnego spustu.


Następujące moc wyjściową pokazuje monitor szeregowy w Arduino IDE.

Wniosek

Czujnik PIR z ESP32 może pomóc w wykryciu ruchu obiektów przechodzących przez jego zakres. Korzystając z funkcji przerwania w programowaniu ESP32, możemy uruchomić odpowiedź na określonym styku GPIO. Po wykryciu zmiany funkcja przerwania zostanie uruchomiona, a dioda LED włączy.