ESP32 z czujnikiem ruchu PIR wykorzystującym przerwania i timery – Arduino IDE

Esp32 Z Czujnikiem Ruchu Pir Wykorzystujacym Przerwania I Timery Arduino Ide



ESP32 to płyta mikrokontrolera oparta na IoT, która może być używana do łączenia, sterowania i odczytu różnych czujników. PIR lub czujnik ruchu to jedno z urządzeń, które możemy połączyć z ESP32 w celu wykrycia ruchu obiektu w zasięgu czujnika ruchu za pomocą ESP32.

Zanim przystąpimy do łączenia ESP32 z czujnikiem PIR musimy wiedzieć jak działają przerwania oraz jak je odczytywać 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
  • Timery w programowaniu ESP32
  • Połączenie czujnika PIR z ESP32

    1: Czym są przerwania

    Większość zdarzeń zachodzących w programowaniu ESP32 odbywa się sekwencyjnie, co oznacza wykonywanie kodu linia po linii. Aby obsługiwać i kontrolować zdarzenia, które nie muszą być uruchamiane podczas sekwencyjnego wykonywania kodu Przerywa są używane.





    Na przykład, jeśli chcemy wykonać określone zadanie, gdy wystąpi jakieś specjalne zdarzenie lub podany zostanie sygnał wyzwalający na piny cyfrowe mikrokontrolera, używamy przerwania.


    W przypadku przerwy nie musimy stale sprawdzać stanu cyfrowego pinu wejściowego ESP32. Kiedy pojawia się przerwanie, procesor zatrzymuje program główny i wywoływana jest nowa funkcja, znana jako ISR ( Przerwij procedurę obsługi ). Ten ISR funkcja obsługuje przerwanie wywołane po tym powrocie do programu głównego i rozpoczęciu jego wykonywania. Jednym z przykładów ISR jest Czujnik ruchu PIR który generuje przerwanie po wykryciu ruchu .



    1.1: Piny przerwań w ESP32

    Przerwanie zewnętrzne lub sprzętowe może być spowodowane przez dowolny moduł sprzętowy, taki jak czujnik dotykowy lub przycisk. Przerwania dotykowe mają miejsce, gdy dotyk zostanie wykryty na pinach ESP32 lub przerwanie GPIO może być również użyte po naciśnięciu klawisza lub przycisku.

    W tym artykule uruchomimy przerwanie po wykryciu ruchu za pomocą czujnika PIR z ESP32.

    Prawie wszystkie piny GPIO z wyjątkiem 6 zintegrowanych pinów SPI, które zwykle wchodzą w skład zestawu 36 -pinowa wersja płytki ESP32 nie może być używana do wywoływania przerwań. Tak więc, aby otrzymać zewnętrzne przerwanie, oto piny podświetlone na fioletowo, których można użyć w ESP32:

    Ten obraz przedstawia 30-pinowy ESP32.

    1.2: Wywołanie przerwania w ESP32

    Za użycie przerwania w ESP32 możemy zadzwonić dołączyćPrzerwanie() funkcjonować.

    Ta funkcja przyjmuje następujące trzy argumenty:

      • Pin GPIO
      • Funkcja do wykonania
      • Tryb
    dołącz Przerwij ( cyfrowePinToInterrupt ( GPIO ) , funkcjonować , tryb ) ;


    1: GPIO pin jest pierwszym argumentem wywołanym wewnątrz dołączyćPrzerwanie() funkcjonować. Na przykład, aby użyć cyfrowego pinu 12 jako źródła przerwania, możemy to nazwać za pomocą cyfrowePinToInterrupt(12) funkcjonować.

    2: Funkcja do wykonania to program wykonywany za każdym razem, gdy przerwanie zostanie osiągnięte lub wyzwolone przez zewnętrzne lub wewnętrzne źródło. Może to być miganie diody LED lub włączenie alarmu przeciwpożarowego.

    3: Tryb jest trzecim i ostatnim argumentem, którego potrzebuje funkcja przerwania. Opisuje, kiedy należy wyzwolić przerwanie. Można użyć następujących trybów:

      • Niski: Wyzwalaj przerwanie za każdym razem, gdy zdefiniowany pin GPIO jest niski.
      • Wysoki: Wyzwalaj przerwanie za każdym razem, gdy zdefiniowany pin GPIO jest wysoki.
      • Zmiana: Wyzwalaj przerwanie za każdym razem, gdy pin GPIO zmieni swoją wartość z wysokiego na niski lub odwrotnie.
      • Spadający: Jest to tryb wyzwalania przerwania, gdy określony pin zaczyna spadać ze stanu wysokiego do niskiego.
      • Rosnący: Jest to tryb wyzwalania przerwania, gdy określony pin zaczyna rosnąć od stanu niskiego do wysokiego.

    Dzisiaj będziemy używać Rosnący mode jako trzeci argument funkcji przerwania za każdym razem, gdy czujnik PIR wykryje, dioda LED przerwania lub czujnik zaświeci się, ponieważ przechodzi ze stanu niskiego do wysokiego.

    2: Timery w programowaniu ESP32

    Timery w programowaniu mikrokontrolerów odgrywają znaczącą rolę w wykonywaniu instrukcji przez określony czas lub w określonym czasie.

    Dwie główne funkcje powszechnie używane do wyzwalania wyjścia to opóźnienie() oraz milis() . Różnica między nimi polega na tym, że funkcja delay() zatrzymuje resztę programu po rozpoczęciu wykonywania, podczas gdy millis() działa przez określony czas, po czym program wraca do głównych funkcji.

    Tutaj będziemy używać diody LED z czujnikiem PIR i nie chcemy, aby świeciła ona ciągle po wyzwoleniu przerwania. Będziemy używać funkcji millis(), która pozwala nam świecić przez określony czas, a następnie ponownie powraca do pierwotnego programu, gdy minie ten znacznik czasu.

    2.1: funkcja opóźnienia().

    funkcja delay() jest dość prosta, wymaga tylko jednego argumentu, którym jest SM typu unsigned long danych. Argument ten reprezentuje czas w milisekundach, na jaki chcemy wstrzymać program, dopóki nie przejdzie on do następnej linii.

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

    opóźnienie ( 1000 )


    delay() jest rodzajem funkcji blokującej programowanie mikrokontrolerów. delay() blokuje wykonanie pozostałej części kodu, dopóki ta konkretna funkcja nie zostanie zakończona. Jeśli chcemy wykonać wiele instrukcji, powinniśmy unikać używania funkcji opóźnienia, zamiast tego możemy użyć modułów millis lub zewnętrznych modułów czasowych RTC.

    2.2: millis() Funkcja

    Funkcja millis() zwraca liczbę milisekund, które upłynęły od momentu uruchomienia bieżącego programu przez płytkę ESP32. Pisząc kilka linijek kodu możemy łatwo obliczyć aktualny czas w dowolnym momencie podczas uruchamiania kodu ESP32.

    millis jest szeroko stosowany tam, gdzie musimy uruchomić wiele zadań bez blokowania reszty kodu. Oto składnia funkcji millis używanej do obliczania, ile czasu upłynęło, abyśmy mogli wykonać określoną instrukcję.

    jeśli ( obecny Millis - poprzedni Millis > = interwał ) {
    poprzedni Millis = aktualny Millis;
    }


    Ten kod odejmuje poprzednią millis() od bieżącej millis(), jeśli odejmowany czas jest równy zdefiniowaniu interwału wykonania określonej instrukcji. Powiedzmy, że chcemy mrugać diodą LED przez 10 sekund. Po każdych 5 minutach możemy ustawić przedział czasu równy 5 minutom (300000ms). Kod będzie sprawdzał interwał za każdym razem, gdy kod zostanie uruchomiony, po osiągnięciu tego czasu dioda LED będzie migać przez 10 sekund.

    Notatka: Tutaj użyjemy funkcji millis() do połączenia ESP32 z czujnikiem PIR. Głównym powodem używania milli i not delay jest to, że funkcja millis() nie blokuje kodu, tak jak zrobiła to funkcja delay(). Więc gdy PIR wykryje ruch, zostanie wygenerowane przerwanie. Użycie funkcji przerwania millis() spowoduje wyzwolenie diody LED na określony czas, po czym, jeśli ruch zostanie zatrzymany, funkcja millis() zresetuje się i zaczeka na następne przerwanie.

    W przypadku, gdybyśmy użyli funkcji delay(), całkowicie zablokuje ona kod i wywołane przerwanie nie zostanie odczytane przez ESP32, co spowoduje niepowodzenie projektu.

    3: Połączenie czujnika PIR z ESP32

    Tutaj będziemy używać funkcji millis() w kodzie Arduino IDE, ponieważ chcemy wyzwalać diodę LED za każdym razem, gdy czujnik PIR wykryje jakiś ruch. Ta dioda LED będzie świecić przez określony czas, po czym powróci do normalnego stanu.

    Oto lista komponentów, które będą nam potrzebne:

      • Płytka rozwojowa ESP32
      • Czujnik ruchu PIR (HC-SR501)
      • DOPROWADZIŁO
      • Rezystor 330 omów
      • Łączenie przewodów
      • deska do krojenia chleba

    Schematyczny dla czujnika PIR z ESP32:


    Połączenia pinowe ESP32 z czujnikiem PIR to:

    ESP32 Czujnik PIR
    chodź Vcc
    GPIO13 NA ZEWNĄTRZ
    GND GND

    3.1: Czujnik ruchu PIR (HC-SR501)

    PIR to skrót od pasywny czujnik podczerwieni . Wykorzystuje parę czujników piroelektrycznych, które wykrywają ciepło wokół otoczenia. Oba te czujniki piroelektryczne leżą jeden za drugim, a gdy obiekt znajdzie się w ich zasięgu, zmiana energii cieplnej lub różnica sygnałów między tymi dwoma czujnikami powoduje, że sygnał wyjściowy czujnika PIR jest NISKI. Gdy pin wyjściowy PIR przejdzie w stan NISKI, możemy ustawić określoną instrukcję do wykonania.


    Poniżej przedstawiono charakterystykę czujnika PIR:

      • Czułość można ustawić w zależności od lokalizacji projektu (np. wykrywanie ruchu myszy lub liścia).
      • Czujnik PIR można ustawić na czas wykrywania obiektu.
      • Szeroko stosowany w alarmach bezpieczeństwa w domu i innych aplikacjach do wykrywania ruchu opartych na termice.

    3.2: Układ pinów HC-SR501

    PIR HC-SR501 jest dostarczany z trzema pinami. Dwa z nich to piny zasilania dla Vcc i GND, a jeden to pin wyjściowy dla sygnału wyzwalającego.


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

    Szpilka Nazwa Opis
    1 Vcc Pin wejściowy dla czujnika Podłącz do ESP32 Pin Pin
    dwa NA ZEWNĄTRZ Wyjście czujnika
    3 GND Masa czujnika

    3.3: Kod

    Teraz, aby zaprogramować ESP32, napisz podany kod w edytorze Arduino IDE i prześlij go do ESP32.

    #define timeSeconds 10
    const int led = 4 ; /* PIN GPIO 4 zdefiniowane dla DOPROWADZIŁO */
    const int PIR_Out = 13 ; /* Pin GPIO 13 dla Wyjście PIR */
    unsigned long Bieżący_Czas = milis ( ) ; /* zmienna zdefiniowana dla przechowywanie wartości milisekund */
    długi bez znaku Poprzedni_wyzwalacz = 0 ;
    wartość logiczna Czas_początkowy = fałszywy ;
    void IRAM_ATTR wykrywa ruch ( ) { /* sprawdzać dla ruch */
    Serial.println ( „WYKRYTO RUCH” ) ;
    cyfrowy zapis ( LED, WYSOKI ) ; /* Włącz diodę LED jeśli warunek jest PRAWDA */
    Czas_początkowy = PRAWDA ;
    Poprzedni_wyzwalacz = milis ( ) ;
    }
    unieważnić konfigurację ( ) {
    Serial.początek ( 115200 ) ; /* szybkość transmisji dla Komunikacja szeregowa */
    Tryb pinów ( PIR_Out, INPUT_PULLUP ) ; /* Zdefiniowany tryb czujnika ruchu PIR */
    /* Czujnik PIR jest skonfigurowany w tryb WZROST, ustawić pin czujnika ruchu jak wyjście */
    dołącz Przerwij ( cyfrowePinToInterrupt ( PIR_Out ) , wykrywa Ruch, WZROST ) ;
    Tryb pinów ( dioda LED, WYJŚCIE ) ; /* ustawić LED na NISKI */
    cyfrowy zapis ( dioda LED, NISKA ) ;
    }
    pusta pętla ( ) {
    Bieżący_czas = milis ( ) ; /* przechowywać prąd czas */
    jeśli ( Czas startu && ( Bieżący_czas - poprzedni_wyz > ( czasSekundy * 1000 ) ) ) { /* Przedział czasu po który Dioda LED wyłączy się */
    Serial.println ( „RUCH ZATRZYMANY” ) ; /* Ruch wydruków zatrzymany jeśli nie wykryto ruchu */
    cyfrowy zapis ( dioda LED, NISKA ) ; /* Ustaw diodę LED na NISKI jeśli warunek jest fałszywy */
    Czas_początkowy = fałszywy ;
    }
    }


    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ć diodę LED po wykryciu ruchu.

    Te trzy zmienne są Bieżący_czas, Poprzedni_wyzwalacz, oraz Czas startu. Zmienne te będą przechowywać aktualny czas, czas wykrycia ruchu oraz licznik czasu po wykryciu ruchu.

    W części konfiguracyjnej najpierw zdefiniowaliśmy szybkość transmisji szeregowej do komunikacji. Dalej za pomocą tryb pin() ustaw czujnik ruchu PIR jako INPUT PULLUP. Aby ustawić przerwanie PIR dołączyćPrzerwanie() jest opisany. GPIO 13 jest opisany do wykrywania ruchu w trybie RISING.

    Następnie w części kodu loop() za pomocą funkcji millis() włączyliśmy i wyłączyliśmy diodę LED po osiągnięciu wyzwalacza.

    3.4: Wyjście

    W sekcji wyjściowej widzimy, że obiekt jest poza zasięgiem czujnika PIR, więc DOPROWADZIŁO jest zmieniony WYŁĄCZONY .


    Teraz ruch wykryty przez czujnik PIR LED zacznie się obracać NA dla 10 sek po tym, jeśli nie zostanie wykryty żaden ruch, pozostanie WYŁĄCZONY aż do odebrania następnego wyzwalacza.


    Poniższe dane wyjściowe są wyświetlane na monitorze szeregowym w Arduino IDE.

    Wniosek

    Czujnik PIR z ESP32 może pomóc w wykrywaniu ruchu obiektów przechodzących przez jego zasięg. Korzystając z funkcji przerwania w programowaniu ESP32 możemy wywołać odpowiedź na określonym pinie GPIO. Po wykryciu zmiany zostanie uruchomiona funkcja przerwania i zaświeci się dioda LED.