Πίσω στο Blog

ESP32: ανίχνευση κίνησης με PIR

Βήμα βήμα οδηγός για αισθητήρα κίνησης με ESP32 και PIR: λίστα εξαρτημάτων, συνδεσμολογία, έτοιμος κώδικας και μια σελίδα που βλέπεις από το κινητό σου μέσα στο WiFi του σπιτιού.

Με μια πλακέτα ESP32, έναν αισθητήρα κίνησης PIR και τρία καλώδια φτιάχνεις σε ένα απόγευμα έναν ανιχνευτή κίνησης που δείχνει σε μια σελίδα, μέσα στο WiFi του σπιτιού σου, πότε κινήθηκε κάτι τελευταία φορά. Δεν χρειάζεται κόλληση, ούτε πείρα στα ηλεκτρονικά. Παρακάτω έχεις τα εξαρτήματα, τη συνδεσμολογία και ολόκληρο τον κώδικα.

Τι θα φτιάξουμε

Ο αισθητήρας PIR (passive infrared) αντιλαμβάνεται την αλλαγή της υπέρυθρης ακτινοβολίας μπροστά του, δηλαδή το σώμα ενός ανθρώπου ή ζώου που κινείται. Όταν συμβεί αυτό, βγάζει σήμα στην έξοδό του. Το ESP32 διαβάζει το σήμα, ανάβει ένα LED και κρατά το πλήθος των κινήσεων με την ώρα της τελευταίας. Ταυτόχρονα σηκώνει έναν μικρό web server, ώστε να ανοίγεις την κατάσταση από οποιονδήποτε browser στο ίδιο δίκτυο.

Είναι ο ίδιος τρόπος δουλειάς που χρησιμοποίησα και στον αισθητήρα θερμοκρασίας με WiFi, οπότε αν έχεις ήδη στήσει εκείνο το project, εδώ θα νιώσεις οικεία.

Εξαρτήματα και κόστος

  • Πλακέτα ESP32 DevKit, με USB καλώδιο για τροφοδοσία και ανέβασμα κώδικα.
  • Αισθητήρας κίνησης PIR τύπου HC-SR501.
  • Τρία καλώδια jumper θηλυκό προς θηλυκό (ή αρσενικό προς θηλυκό, ανάλογα με την πλακέτα σου).

Τα βρίσκεις σε όποιο κατάστημα ηλεκτρονικών ή marketplace προτιμάς και συνολικά ξοδεύεις περίπου 8 έως 12 ευρώ, ανάλογα με το πού θα ψωνίσεις. Το LED της πλακέτας (στις περισσότερες είναι στο GPIO 2) αρκεί για την ένδειξη, άρα δεν χρειάζεσαι εξωτερικό.

Συνδεσμολογία

Ο PIR έχει τρεις ακίδες: VCC, OUT και GND. Τις ενώνεις με το ESP32 ως εξής:

PIRESP32
VCCVIN (5V από το USB)
OUTGPIO 27
GNDGND

Προσοχή στην τροφοδοσία

Ο HC-SR501 θέλει 5V για να δουλέψει σωστά, γι' αυτό το VCC πάει στο VIN και όχι στο 3V3. Η έξοδός του (OUT) βγάζει λογικό σήμα 3,3V, που το ESP32 διαβάζει χωρίς πρόβλημα. Αν έχεις διαφορετικό μοντέλο PIR, έλεγξε το φύλλο δεδομένων του πριν τον συνδέσεις.

Ο κώδικας

Χρησιμοποιώ το Arduino IDE με εγκατεστημένο το πακέτο πλακετών ESP32. Οι βιβλιοθήκες WiFi και WebServer περιλαμβάνονται, άρα δεν κατεβάζεις τίποτα επιπλέον. Άλλαξε μόνο το όνομα και τον κωδικό του WiFi σου.

#include <WiFi.h>
#include <WebServer.h>

const char* WIFI_SSID = "TO_WIFI_SOU";
const char* WIFI_PASS = "O_KODIKOS_SOU";

const int PIR_PIN = 27;
const int LED_PIN = 2;

WebServer server(80);
bool lastState = false;
unsigned long lastMotion = 0;
int events = 0;

void handleRoot() {
  String html = "<!doctype html><html><head><meta charset='utf-8'>";
  html += "<meta name='viewport' content='width=device-width,initial-scale=1'>";
  html += "<meta http-equiv='refresh' content='5'><title>Αισθητήρας κίνησης</title></head><body>";
  html += "<h1>Αισθητήρας κίνησης</h1>";
  html += "<p>Κινήσεις από την εκκίνηση: " + String(events) + "</p>";
  if (events == 0) {
    html += "<p>Δεν έχει ανιχνευθεί κίνηση ακόμα.</p>";
  } else {
    html += "<p>Τελευταία κίνηση πριν " + String((millis() - lastMotion) / 1000) + " δευτερόλεπτα.</p>";
  }
  html += "</body></html>";
  server.send(200, "text/html; charset=utf-8", html);
}

void setup() {
  Serial.begin(115200);
  pinMode(PIR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);

  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Άνοιξε στον browser: http://");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.begin();
}

void loop() {
  bool state = digitalRead(PIR_PIN) == HIGH;
  digitalWrite(LED_PIN, state ? HIGH : LOW);

  if (state && !lastState) {
    events++;
    lastMotion = millis();
  }
  lastState = state;

  server.handleClient();
}

Πώς το δοκιμάζεις

  1. Ανέβασε τον κώδικα και άνοιξε το Serial Monitor στα 115200 baud.
  2. Περίμενε να εμφανιστεί η διεύθυνση IP της πλακέτας και γράψε την στον browser του κινητού ή του υπολογιστή, με το ίδιο WiFi.
  3. Άφησε τον αισθητήρα να σταθεροποιηθεί. Ο HC-SR501 χρειάζεται συνήθως περίπου ένα λεπτό μετά την ενεργοποίηση, και μέχρι τότε μπορεί να δίνει τυχαία σήματα.
  4. Κούνα το χέρι σου μπροστά του. Το LED πρέπει να ανάψει και ο μετρητής στη σελίδα να ανέβει.

Ρυθμίσεις και σωστή τοποθέτηση

Στην πλακέτα του HC-SR501 υπάρχουν δύο μικρά ποτενσιόμετρα. Το ένα ρυθμίζει την ευαισθησία, δηλαδή από πόσο μακριά αντιδρά, και το άλλο το χρόνο που μένει ενεργή η έξοδος μετά από μια κίνηση. Γύρνα τα με ένα μικρό κατσαβίδι ώστε να βρεις ό,τι σου ταιριάζει στον χώρο σου.

Η τοποθέτηση μετράει όσο και ο κώδικας. Απόφυγε να στρέφεις τον αισθητήρα προς παράθυρο με άμεσο ήλιο, καλοριφέρ ή κλιματιστικό, γιατί οι απότομες αλλαγές θερμοκρασίας μπορούν να του δώσουν ψευδή σήματα. Ένα γωνιακό σημείο σε ύψος ενός μέτρου περίπου είναι συνήθως καλή αρχή.

Επόμενα βήματα

Όταν δουλέψει, μπορείς να προσθέσεις βομβητή, να στέλνεις ειδοποίηση στο κινητό ή να καταγράφεις τις κινήσεις σε βάση δεδομένων. Για να μπει όλο σε ένα καθαρό κουτί, μπορείς να σχεδιάσεις και να τυπώσεις μια δική σου θήκη, όπως έκανα στη θήκη smartwatch με ESP32-C3. Αν δεν έχεις ασχοληθεί με την εκτύπωση, ρίξε μια ματιά στο άρθρο Τι είναι το 3D Printing.

Συχνές ερωτήσεις

Χρειάζομαι εξωτερικό LED ή αντίσταση;

Όχι για αυτό το project. Χρησιμοποιούμε το LED που έχει ήδη η πλακέτα. Αν βάλεις εξωτερικό LED, θα χρειαστείς και αντίσταση σειράς.

Γιατί ο αισθητήρας ανάβει μόνος του όταν τον ενεργοποιώ;

Είναι φυσιολογικό τις πρώτες δεκάδες δευτερόλεπτα. Ο PIR χρειάζεται χρόνο για να προσαρμοστεί στο περιβάλλον. Περίμενε περίπου ένα λεπτό πριν κρίνεις τα αποτελέσματα.

Δουλεύει η σελίδα και έξω από το σπίτι;

Όχι, ανοίγει μόνο μέσα στο ίδιο δίκτυο WiFi. Για πρόσβαση από οπουδήποτε χρειάζεται επιπλέον ρύθμιση, π.χ. αποστολή των δεδομένων σε έναν server.

Μπορώ να χρησιμοποιήσω άλλο pin αντί για το GPIO 27;

Ναι, αρκεί να αλλάξεις τον αριθμό στη σταθερά PIR_PIN και να διαλέξεις pin που επιτρέπει είσοδο στη δική σου πλακέτα.

Θες βοήθεια με το δικό σου project;

Αν θέλεις να μετατρέψεις αυτή την ιδέα σε κάτι πιο ολοκληρωμένο, από έναν αισθητήρα με ειδοποιήσεις μέχρι μια εφαρμογή που συνδέεται με αυτόν, δες τις υπηρεσίες μου ή γράψε μου στο iliaskdamianidis@gmail.com. Απαντώ μέσα σε 24 ώρες.