IR brojač: prebroj pojavljivanja predmeta

Poveži reflektivni IR modul, filtriraj njegov digitalni izlaz i broji samo nove detekcije nakon prihvaćenog slobodnog stanja.

Senzori i prikaz mjerenjaPočetni nivo75 min

Ciljevi učenja

  • Povezati 3,3 V reflektivni IR modul na GPIO27 i indikatorsku LED na GPIO25 preko 220 Ω.
  • Provjeriti aktivni nivo modula i uskladiti DETECTED_LEVEL.
  • Objasniti provjeru stabilnosti od 50 ms za detekciju i oslobađanje.
  • Brojati samo novi prihvaćeni prelaz poslije slobodnog stanja, bez ponavljanja tokom držanja.
  • Provjeriti pokretanje sa prisutnim predmetom i objasniti ograničenja broja digitalnih detekcija.

Prije početka

Završi kurseve 03 i 07: događaji tastera, digitalni senzorski izlaz, polaritet i vremenska provjera stabilnosti.

Referentna postavka

Ploča u Arduino IDE-u
ESP32 Dev Module
Arduino-ESP32
3.3.12
Serial Monitor
115200 baud

Ovo je referentni profil, a ne identifikacija ploče sa fotografije. Za ESP32-C3/S2/S3 ili drugačije označenu ploču treba prilagoditi GPIO i provjeriti šemu prije spajanja.

Šta ćemo napraviti

Napravićemo brojač pojavljivanja predmeta ispred infracrvenog modula. Kada predmet uvedemo u područje detekcije, broj se uvećava za jedan. Držanje predmeta ispred senzora ne povećava broj ponovo. LED pokazuje trenutno prihvaćenu detekciju, a Serial Monitor prikazuje broj događaja.

Kurs nadograđuje prethodno automatsko svjetlo: sada pored stanja prepoznajemo i događaj. Posebno ćemo provjeriti pokretanje uređaja dok je predmet već ispred senzora, kako reset ne bi stvorio izmišljeni novi prolazak.

Šta ćeš naučiti

  • Povezati reflektivni IR modul i provjeriti aktivni nivo njegovog izlaza.
  • Prihvatiti promjenu poslije 50 ms stabilnog signala.
  • Brojati samo prelaz iz slobodnog u zauzeto područje detekcije.
  • Objasniti zašto je prije nove detekcije potreban prihvaćen slobodan ulaz.
  • Razlikovati broj detekcija od udaljenosti i broja različitih predmeta.

Predznanje

Završi kurseve 03 i 07. Potrebno je razumjeti razliku između dugog držanja tastera i jednog pritiska, podešavanje polariteta digitalnog senzora i vremensku provjeru stabilnosti. Ovdje senzor zamjenjuje taster, a broj događaja zamjenjuje promjenu zapamćenog stanja LED diode.

Potrebna oprema

KomponentaKoličinaSpecifikacija i napomene
ESP32 razvojna ploča sa klasičnim ESP32-WROOM-32 modulom1GPIO nazivi moraju odgovarati referentnom profilu; fizički položaj izvoda provjeriti na ploči.
USB kabl za podatke i napajanje1Priključak prilagoditi ploči; komplet na slici navodi Micro-USB.
Eksperimentalna ploča1Komplet navodi 830 kontaktnih tačaka. Provjeriti eventualni prekid naponskih vodova.
IR modul za detekciju prepreke1Reflektivni IR modul, potvrđen za 3,3 V; VCC/GND/OUT. Referentni OUT je aktivan na LOW.
Crvena LED dioda1Anoda A i katoda K; provjeriti polaritet stvarne komponente.
Otpornik 220 Ω1Po jedan otpornik za svaku LED granu; 220 Ω iz kompleta.
Spojni kablovi6M-M ili F-M prema priključcima ploče.

Okvirna količina, zavisno od rasporeda i tipa priključaka.

Pripremi i komad kartona za ponovljive probe. Koristi reflektivni IR modul dokumentovan za napajanje od 3,3 V, sa priključcima VCC, GND i OUT. Tačan model i raspored pinova ne određujemo prema fotografiji. Referentna ploča je klasični ESP32/WROOM-32; druge ESP32 porodice traže prilagođavanje.

Šta senzor zaista javlja

Predajnik emituje infracrveno svjetlo, a prijemnik registruje povratni odraz. SunFounderov referentni modul podržava 3,3–5 V i daje HIGH bez detekcije, a LOW pri detekciji. Trimer mijenja uslove okidanja. Naš program zato početno koristi DETECTED_LEVEL = LOW.

Ovo je digitalni izlaz: rezultat znači da je uslov detekcije ispunjen ili nije. Program iz njega ne može izračunati centimetre. Ni svaki porast broja ne predstavlja drugi predmet: isti karton uklonjen i vraćen daje novi događaj. Dva predmeta između kojih modul nikada ne prijavi slobodno područje daju samo jednu neprekidnu detekciju.

Odraz zavisi i od površine; SunFounderova dokumentacija reflektivnog IR modula opisuje slabiju korisnu detekciju tamnijih predmeta. Zbog toga ćemo ispitati različite predmete umjesto pretpostavke da jedan položaj trimera znači univerzalnu udaljenost.

Šema i povezivanje

Šema povezivanja

Referentni IR modul radi na 3,3 V, sa izlazom OUT koji je LOW pri detekciji. Potvrdi polaritet svog modula. Ovo je digitalna detekcija refleksije, bez mjerenja rastojanja.

Šema povezivanja — električne veze navedene u tabeli ispod
Šema povezivanjaUvećajSVGPNG
Veze · Šema povezivanja
OdDoOpis veze
ESP32.3V3U1.VCCNapajanje modula; provjeriti oznaku VCC.
ESP32.GNDU1.GNDZajednička masa ploče i senzora.
U1.OUTESP32.GPIO27Digitalni signal nivoa 3,3 V prema GPIO27.
ESP32.GPIO25R1.1Digitalni izlaz za LED.
R1.2D1.ASerijski otpornik R1, 220 Ω, prema anodi LED.
D1.KESP32.GNDKatoda prema zajedničkoj masi.
  1. Odspoji USB i pronađi oznake 3V3, GND, GPIO27 i GPIO25 na ESP32.
  2. Spoji VCC IR modula na 3V3, a GND na zajedničku masu.
  3. Spoji OUT modula na GPIO27. Prati oznake svog modula, ne redoslijed priključaka na drugoj fotografiji.
  4. Spoji GPIO25 preko R1 od 220 Ω na anodu D1, a katodu na GND.
  5. Usmjeri predajnik i prijemnik prema slobodnom prostoru. Provjeri veze, pa vrati USB.

GPIO27 koristi INPUT_PULLUP. Podešavanje je opisano u Espressif GPIO dokumentaciji. Napajanje modula sa 3V3 održava ovu vježbu u domenu 3,3 V; ne spajaj izlaz modula napajanog sa 5 V direktno na GPIO.

Priprema Arduino okruženja

U Arduino IDE-u 2.x izaberi ESP32 Dev Module, port ploče i paket esp32 by Espressif Systems 3.3.12. Espressifovo uputstvo opisuje instalaciju. Dodatne biblioteke nisu potrebne.

Raspakuj Arduino primjer i otvori ir_counter/ir_counter.ino. Zadrži naziv foldera ir_counter. Pokreni Verify, zatim Upload, i otvori Serial Monitor na 115200 baud. Za prvu probu ukloni karton ispred modula.

Kompletan Arduino program

ir_counter.ino Arduino / C++
Preuzmi .ino

#include <Arduino.h>

// Reflective obstacle module: 3.3 V supply and 3.3 V-compatible OUT.
constexpr uint8_t INPUT_PIN = 27;
constexpr uint8_t LED_PIN = 25;
constexpr int DETECTED_LEVEL = LOW;  // Change only after checking your module.
constexpr uint32_t FILTER_MS = 50;
constexpr uint32_t REPORT_MS = 500;

int candidateLevel = HIGH;
uint32_t candidateSince = 0;
uint32_t lastReportAt = 0;
uint32_t detectionCount = 0;
bool acceptedKnown = false;
bool acceptedDetected = false;
bool armed = false;

void setup() {
  Serial.begin(115200);
  pinMode(INPUT_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  candidateLevel = digitalRead(INPUT_PIN);
  candidateSince = millis();
  lastReportAt = candidateSince;
  Serial.println("IR counter: first qualify CLEAR, then each new detection counts once.");
}

void loop() {
  const uint32_t now = millis();
  const int raw = digitalRead(INPUT_PIN);
  if (raw != candidateLevel) {
    candidateLevel = raw;
    candidateSince = now;
  }
  if (static_cast<uint32_t>(now - candidateSince) >= FILTER_MS) {
    const bool detected = (candidateLevel == DETECTED_LEVEL);
    if (!acceptedKnown || detected != acceptedDetected) {
      acceptedKnown = true;
      acceptedDetected = detected;
      if (!acceptedDetected) {
        armed = true;
      } else if (armed) {
        ++detectionCount;
        armed = false;
      }
    }
  }
  digitalWrite(LED_PIN, acceptedKnown && acceptedDetected ? HIGH : LOW);
  if (static_cast<uint32_t>(now - lastReportAt) >= REPORT_MS) {
    lastReportAt = now;
    Serial.print("raw="); Serial.print(raw);
    Serial.print(" detected=");
    Serial.print(!acceptedKnown ? "WAITING" : (acceptedDetected ? "YES" : "NO"));
    Serial.print(" count="); Serial.print(detectionCount);
    Serial.print(" armed="); Serial.println(armed ? "YES" : "NO");
  }
}

Prikaz i preuzimanje koriste isti program. Prvo posmatraj podrazumijevano ponašanje, pa tek onda mijenjaj konstantu polariteta ako je potrebno.

Od sirovog nivoa do događaja

FILTER_MS određuje 50 ms stabilnosti. candidateLevel pamti trenutnog kandidata, a candidateSince vrijeme od kojeg je nepromijenjen. Svaka sirova promjena ponovo započinje provjeru. acceptedKnown označava da je barem jedno stanje prošlo početnu kvalifikaciju.

acceptedDetected opisuje prihvaćenu detekciju. LED prati to stanje, dok detectionCount pamti broj događaja kao uint32_t. armed označava da je prethodno prihvaćeno slobodno područje i da sljedeća detekcija smije povećati broj. Poslije brojanja armed postaje netačno; nova prihvaćena slobodna faza ponovo ga uključuje.

Program ne broji svaki prolazak kroz loop() sa aktivnim ulazom. Broj se povećava samo kada novo prihvaćeno stanje predstavlja detekciju i brojanje je spremno. Čak i ako predmet ostane deset sekundi, to je jedan događaj. REPORT_MS određuje izvještaj svakih 500 ms: raw je 0/1 za LOW/HIGH, detected daje YES/NO ili početno WAITING, count broj, a armed spremnost YES/NO.

Početno stanje i polaritet

Na resetu broj je nula, LED ugašena i armed netačno. Ako je predmet već prisutan, njegova stabilna detekcija uključiće LED, ali broj ostaje nula. Ukloni predmet dovoljno dugo da slobodno stanje prođe filter; tek sljedeće unošenje daje prvi događaj.

Provjeri sirovi nivo bez predmeta i sa kartonom. Ako se ne razlikuju, podesi trimer uz male pomake i ponovi probu. Ako dokumentacija i opažanje tvog modula potvrđuju aktivni HIGH, postavi DETECTED_LEVEL = HIGH, ponovo učitaj program i resetuj eksperiment. Kod podrazumijevanog aktivnog LOW, nepovezan ulaz sa pull-upom može izgledati slobodno, pa sama ta poruka nije dokaz ispravnog povezivanja.

Pokretanje i očekivani rezultati

Svaku fazu zadrži dvije sekunde. Počni resetom bez predmeta i sačekaj prihvaćeno slobodno stanje.

RedoslijedBrojLED i spremnost za novi događaj
Slobodno područje poslije resetovanja0Ugašena; spremno.
Unesi karton1Uključena; čeka oslobađanje.
Zadrži isti karton1Uključena; bez dodatnog brojanja.
Ukloni karton1Ugašena; ponovo spremno.
Ponovo unesi karton2Uključena; čeka oslobađanje.

Zatim resetuj uređaj sa kartonom ispred njega. Očekuj broj nula uz uključenu LED nakon kvalifikacije. Zabilježi svoja opažanja odvojeno od ovih očekivanja. Reset briše ovaj brojač jer ga program ne čuva trajno.

Najčešći problemi

SimptomProvjera i postupak
Broj ostaje nulaPrvo oslobodi područje dovoljno dugo; provjeri OUT, polaritet i prag.
Broj raste dok predmet mirujePosmatraj da li modul stvarno prelazi u slobodno stanje; stabilizuj položaj, prag i kontakte.
LED je aktivna kada nema predmetaProvjeri DETECTED_LEVEL i da li modul vidi sto ili drugi predmet.
Brzi prolazi se ne registrujuDetekcija i slobodna faza moraju zasebno trajati najmanje 50 ms.
Različiti predmeti daju različite rezultatePonovi probu uz isti položaj i osvjetljenje; promijenjen odraz mijenja detekciju.

Samostalni zadatak

Napravi pet sporih unošenja kartona uz jasno oslobađanje između njih. Zatim drži karton pet sekundi i provjeri da broj miruje. Ponovi seriju tamnijim predmetom pri istom položaju trimera. Zapiši uspješne detekcije; ne prepravljaj stvarni rezultat da bi odgovarao predviđenom broju.

Pitanja i smjernice za rješenje

Zašto predmet prisutan na resetu ne daje broj jedan? Nismo prethodno prihvatili slobodno stanje, pa nemamo dokaz novog prelaza. LED ipak pokazuje prihvaćenu detekciju.

Pet odvojenih kvalifikovanih unošenja daje pet događaja. Držanje ne dodaje događaje. Ako razmak između dva unošenja ne prođe filter, ona se spoje u jednu prihvaćenu detekciju. Iz broja ne možeš zaključiti smjer kretanja, udaljenost, identitet predmeta niti broj ljudi: bilježimo samo opisane promjene jednog digitalnog signala.

Preuzimanja

Primarni izvori