This shows you the differences between two versions of the page.
pm:prj2025:iotelea:catalin.turcanu [2025/05/21 20:32] catalin.turcanu [Hardware Design] |
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 | 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 |