This shows you the differences between two versions of the page.
|
pm:prj2025:iotelea:catalin.turcanu [2025/05/21 20:51] catalin.turcanu [Descriere generală] |
pm:prj2025:iotelea:catalin.turcanu [2025/05/26 22:06] (current) catalin.turcanu [Descriere generală] |
||
|---|---|---|---|
| Line 12: | Line 12: | ||
| Aplicabilă în industrie, depozite, educație | Aplicabilă în industrie, depozite, educație | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| - | + | ||
| - | Schema bloc: | + | |
| - | [ Obiect ] → [ Senzor IR ] → [ Arduino Uno ] → [ LCD ] | + | |
| - | ↓ ↓ | + | |
| - | [ EEPROM ] [ Buzzer ] | + | |
| - | ↑ | + | |
| - | [ Buton Reset ] | + | |
| Descriere module: | Descriere module: | ||
| Senzor IR – detectează trecerea obiectului | Senzor IR – detectează trecerea obiectului | ||
| Line 25: | Line 18: | ||
| Arduino Uno – controlează logica de numărare, afișare, memorare și semnalizare | Arduino Uno – controlează logica de numărare, afișare, memorare și semnalizare | ||
| - | LCD I2C – afișează numărul curent de obiecte | + | LCD 16x2 – afișează numărul curent de obiecte |
| Buzzer – emite un sunet la fiecare trecere | Buzzer – emite un sunet la fiecare trecere | ||
| - | Buton – resetează contorul la zero{{:pm:prj2025:iotelea:shiny_krunk-blorr.png?200|}} | + | Buton – resetează contorul la zero |
| + | |||
| + | {{:pm:prj2025:iotelea:shiny_krunk-blorr.png?600|}} | ||
| Line 53: | Line 48: | ||
| 1x Rezistență 220Ω (pentru test LED) | 1x Rezistență 220Ω (pentru test LED) | ||
| - | Scheme electrice/poze: | + | Poze: |
| + | {{:pm:prj2025:iotelea:project1.jpg?200|}} | ||
| + | {{:pm:prj2025:iotelea:project2.jpg?200|}} | ||
| Diagrame de semnal: | Diagrame de semnal: | ||
| Line 64: | Line 60: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | Mediu de dezvoltare | ||
| + | Folosim PlatformIO în Visual Studio Code pentru dezvoltare, compilare și upload. | ||
| + | Alternativ, codul poate fi rulat și cu Arduino IDE. | ||
| + | |||
| + | Microcontroller-ul folosit este ATmega328P (placa Arduino UNO). | ||
| + | |||
| + | Limbajul de programare: C++ (framework Arduino). | ||
| + | |||
| + | Librării și surse 3rd-party | ||
| + | #include <LiquidCrystal.h> – pentru controlul afișajului LCD 16x2 conectat în mod paralel (fără I2C). | ||
| + | |||
| + | #include <Arduino.h> – pentru funcții de bază (digitalWrite, millis, etc.), inclusă implicit în PlatformIO. | ||
| + | |||
| + | Algoritmi și structuri implementate | ||
| + | 1. Inițializare componente | ||
| + | Se definesc pinii pentru LCD, buzzer, LED-uri, senzor IR și butonul de reset. Se setează tipul fiecărui pin. | ||
| + | |||
| + | const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2, ct = 9; | ||
| + | const int irPin = 8; | ||
| + | const int buzzerPin = 10; | ||
| + | const int ledPin = 13; | ||
| + | const int resetButton = 7; | ||
| + | |||
| + | LiquidCrystal lcd(rs, en, d4, d5, d6, d7); | ||
| + | |||
| + | void setup() { | ||
| + | pinMode(irPin, INPUT); | ||
| + | pinMode(buzzerPin, OUTPUT); | ||
| + | pinMode(ledPin, OUTPUT); | ||
| + | pinMode(resetButton, INPUT); // conectat la GND | ||
| + | analogWrite(ct, 100); // luminozitate ecran | ||
| + | lcd.begin(16, 2); | ||
| + | lcd.print("Obiecte: "); | ||
| + | } | ||
| + | 2. Contorizarea obiectelor detectate | ||
| + | Senzorul IR emite semnal LOW când un obiect este prezent. Se folosește o variabilă objectDetected pentru a evita incrementările multiple la o singură trecere. | ||
| + | |||
| + | if (irStatus == LOW && !objectDetected) { | ||
| + | objectDetected = true; | ||
| + | counter++; | ||
| + | |||
| + | lcd.clear(); | ||
| + | lcd.print("Obiecte: "); | ||
| + | lcd.print(counter); | ||
| + | |||
| + | digitalWrite(buzzerPin, HIGH); | ||
| + | digitalWrite(ledPin, HIGH); | ||
| + | delay(100); | ||
| + | digitalWrite(buzzerPin, LOW); | ||
| + | digitalWrite(ledPin, LOW); | ||
| + | } | ||
| + | 3. Debounce pentru buton reset | ||
| + | Butonul resetează contorul și afișajul. Se aplică un delay pentru stabilizarea semnalului (debounce simplu software). | ||
| + | |||
| + | if (digitalRead(resetButton) == HIGH) { | ||
| + | counter = 0; | ||
| + | lcd.clear(); | ||
| + | lcd.print("Obiecte: "); | ||
| + | lcd.print(counter); | ||
| + | delay(300); | ||
| + | } | ||
| + | 4. Detecție de trafic rapid (ALERTĂ) | ||
| + | Se memorează ultimele 3 timestamp-uri folosind millis(). Dacă 3 obiecte trec în <1 sec, sistemul emite alertă. | ||
| + | |||
| + | lastTimes[0] = lastTimes[1]; | ||
| + | lastTimes[1] = lastTimes[2]; | ||
| + | lastTimes[2] = millis(); | ||
| + | |||
| + | if (lastTimes[2] - lastTimes[0] <= 1000 && lastTimes[0] != 0) { | ||
| + | lcd.clear(); | ||
| + | lcd.print("ALERTA: PREA"); | ||
| + | lcd.setCursor(0, 1); | ||
| + | lcd.print("MULTE OBIECTE"); | ||
| + | |||
| + | digitalWrite(buzzerPin, HIGH); | ||
| + | digitalWrite(ledPin, HIGH); | ||
| + | delay(2000); | ||
| + | digitalWrite(buzzerPin, LOW); | ||
| + | digitalWrite(ledPin, LOW); | ||
| + | |||
| + | counter = 0; // resetăm contorul | ||
| + | lcd.clear(); | ||
| + | lcd.print("Obiecte: "); | ||
| + | lcd.print(counter); | ||
| + | } | ||
| - | <note tip> | ||
| - | Descrierea codului aplicaţiei (firmware): | ||
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | ||
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | ||
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | ||
| - | * (etapa 3) surse şi funcţii implementate | ||
| - | </note> | ||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| - | <note tip> | + | Rezultate Obținute: |
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | S-a realizat cu succes un sistem funcțional de numărare a obiectelor detectate de un senzor IR. |
| - | </note> | + | |
| - | ===== Concluzii ===== | + | Afișajul LCD actualizează în timp real numărul obiectelor. |
| - | ===== Download ===== | + | Comportament corect în caz de treceri rapide, sistemul detectând fluxul excesiv și reacționând automat. |
| - | <note warning> | + | Testele au fost realizate atât pe breadboard cât și în PlatformIO, cu program funcțional încărcat cu succes. |
| - | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | |
| - | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | S-au folosit 5 piese electronice diferite și 4 concepte din laboratoare: GPIO, PWM, afișaj, debounce, memorie RAM și temporizare. |
| - | </note> | + | |
| - | ===== Jurnal ===== | + | ===== Concluzii ===== |
| + | Proiectul demonstrează aplicarea practică a noțiunilor de PM: programarea microcontrollerului, lucrul cu senzori digitali, afișaj și interacțiune hardware. | ||
| - | <note tip> | + | Codul este modular, comentat și poate fi ușor extins (ex: numărare bidirecțională, afișare pe serial monitor, stocare etc). |
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | |
| - | ===== Bibliografie/Resurse ===== | + | Se poate transforma într-un prototip real de contor pentru bandă transportoare în fabrici sau linii de sortare. |
| - | <note> | + | ===== Download ===== |
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | Proiectu{{:pm:prj2025:iotelea:pmproject.zip|}} |
| - | </note> | + | |
| + | ===== Bibliografie/Resurse ===== | ||
| - | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | LCD Help: |
| + | https://www.youtube.com/watch?v=860eErq9c3E | ||
| + | Sensor Help: | ||
| + | https://www.youtube.com/watch?v=OMZacCLRt9A | ||