This is an old revision of the document!


Sistem automat de numărare a obiectelor pe bandă- Țurcanu Cătălin

Introducere

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.

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ă.

Utilitate:

Practică pentru învățarea folosirii senzorilor, microprocesorului si afișajelor

Aplicabilă în industrie, depozite, educație

Descriere generală

Schema bloc: [ Obiect ] → [ Senzor IR ] → [ Arduino Uno ] → [ LCD ]

                                                ↓  
                                ↑
                            [ Buton Reset ]  [ Buzzer ]
                           

Descriere module: Senzor IR – detectează trecerea obiectului

Arduino Uno – controlează logica de numărare, afișare, memorare și semnalizare

LCD 16×2 – afișează numărul curent de obiecte

Buzzer – emite un sunet la fiecare trecere

Buton – resetează contorul la zero

Hardware Design

Listă componente: 1x Arduino UNO R3

1x Modul senzor IR

1x Display LCD 16×2

1x Buzzer activ

1x Push button

1x Breadboard

Fire jumper

1x Rezistență 10kΩ (pentru buton)

1x Rezistență 220Ω (pentru test LED)

Poze:

Diagrame de semnal: Prezintă semnalul digital DOUT al senzorului:

LOW când detectează obstacol

HIGH în lipsa obstacolului

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 16×2 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);

}

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

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

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.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2025/iotelea/catalin.turcanu.1748281817.txt.gz · Last modified: 2025/05/26 20:50 by catalin.turcanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0