This shows you the differences between two versions of the page.
pm:prj2025:iotelea:catalin.turcanu [2025/05/08 13:54] catalin.turcanu |
pm:prj2025:iotelea:catalin.turcanu [2025/05/26 22:06] (current) catalin.turcanu [Descriere generală] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Nume proiect ====== | + | ====== Sistem automat de numărare a obiectelor pe bandă- Țurcanu Cătălin====== |
===== Introducere ===== | ===== Introducere ===== | ||
- | <note tip> | + | Acest proiect are ca scop construirea unui sistem simplu, eficient și fiabil care să numere automat obiectele ce trec pe o bandă transportoare, folosind un senzor de obstacole IR. Numărul total este afișat pe un ecran LCD, iar la fiecare obiect detectat se aude un semnal sonor generat de un buzzer. Proiectul salvează automat valoarea contorului în memoria microprocesorului, pentru a păstra datele chiar și după întreruperea alimentării. |
- | Prezentarea pe scurt a proiectului vostru: | + | |
- | * ce face | + | Ideea a pornit de la aplicații practice din fabrici și depozite unde este nevoie de un sistem de monitorizare a fluxului de produse fără intervenție umană. |
- | * care este scopul lui | + | |
- | * care a fost ideea de la care aţi pornit | + | Utilitate: |
- | * de ce credeţi că este util pentru alţii şi pentru voi | + | |
- | </note> | + | Practică pentru învățarea folosirii senzorilor, microprocesorului si afișajelor |
+ | |||
+ | Aplicabilă în industrie, depozite, educație | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
+ | |||
+ | Descriere module: | ||
+ | Senzor IR – detectează trecerea obiectului | ||
- | <note tip> | + | Arduino Uno – controlează logica de numărare, afișare, memorare și semnalizare |
- | O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. | + | |
+ | LCD 16x2 – afișează numărul curent de obiecte | ||
+ | |||
+ | Buzzer – emite un sunet la fiecare trecere | ||
+ | |||
+ | Buton – resetează contorul la zero | ||
+ | |||
+ | {{:pm:prj2025:iotelea:shiny_krunk-blorr.png?600|}} | ||
- | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | ||
- | </note> | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | <note tip> | + | Listă componente: |
- | Aici puneţi tot ce ţine de hardware design: | + | 1x Arduino UNO R3 |
- | * listă de piese | + | |
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | 1x Modul senzor IR |
- | * diagrame de semnal | + | |
- | * rezultatele simulării | + | 1x Display LCD 16x2 |
- | </note> | + | |
+ | 1x Buzzer activ | ||
+ | |||
+ | 1x Push button | ||
+ | |||
+ | 1x Breadboard | ||
+ | |||
+ | Fire jumper | ||
+ | |||
+ | 1x Rezistență 10kΩ (pentru buton) | ||
+ | |||
+ | 1x Rezistență 220Ω (pentru test LED) | ||
+ | |||
+ | Poze: | ||
+ | {{:pm:prj2025:iotelea:project1.jpg?200|}} | ||
+ | {{:pm:prj2025:iotelea:project2.jpg?200|}} | ||
+ | |||
+ | Diagrame de semnal: | ||
+ | Prezintă semnalul digital DOUT al senzorului: | ||
+ | |||
+ | LOW când detectează obstacol | ||
+ | |||
+ | HIGH în lipsa obstacolului | ||
===== 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 |