Proiectul meu este un dispozitiv care determina automat cate tigari au mai ramas intr-un pachet, folosind un senzor de greutate de precizie.
Ideea a pornit de la o observatie simpla: de multe ori nu stii cate tigari mai ai in pachet fara sa-l deschizi sau sa numeri manual. Sistemul rezolva acest lucru intr-un mod non-invaziv, fara a modifica pachetul si fara procesare de imagine complexa.
Sistemul foloseste un senzor de forta (load cell 1kg) conectat la un modul HX711 (ADC 24-bit) pentru a masura greutatea pachetului cu precizie sub 0.1g. Deoarece fiecare tigara cantareste aproximativ 1.13g, iar greutatea ambalajului gol este calibrata la pornire, microcontrollerul calculeaza numarul de tigari prin impartirea greutatii nete la greutatea unei singure tigari. Rezultatul este afisat in timp real pe un display TM1637 cu 4 cifre.
Proiectul este util pentru ca:
Sistemul este compus din urmatoarele module:
initiala ATmega328P Xplained Mini a fost inlocuita din cauza unei probleme
hardware (semnatura de device 0x000000 la programare — microcontrollerul nu mai raspundea corect la programatorul EDBG integrat, indiferent de toolchain sau configuratie). Arduino Uno foloseste acelasi microcontroller ATmega328P, cu bootloader standard si upload prin UART, eliminand complet problema de programare.
cu greutatea plasata pe el. Genereaza un semnal diferential de tensiune
in intervalul mV.
24 de biti dedicat celulelor de sarcina. Comunica cu ATmega328P printr-un
protocol two-wire (DOUT si SCK) pe pinii D7 si D8.
Display-ul 7-segment raw 5461AS initial a fost inlocuit cu modulul TM1637
deoarece acesta are driver integrat, eliminand necesitatea multiplexarii software si a rezistoarelor individuale pe segmente. Comunicarea se face prin protocol two-wire (CLK, DIO) pe pinii PD2 si PD3.
de la rail-ul de 5V al Arduino Uno prin breadboard.
Fluxul de functionare: la pornire, sistemul face tara automata (2 secunde). Utilizatorul plaseaza pachetul pe platforma si citeste numarul de tigari afisat in timp real. Comanda 't' prin Serial recalibreaza tara.
| Modul | Descriere Tehnica | Protocol / Interfata |
|---|---|---|
| Arduino Uno (ATmega328P) | Unitate centrala, 16MHz, 5V | Master |
| Load Cell 1kg | Senzor mecanic rezistiv (punte Wheatstone) | Semnal analogic diferential |
| HX711 | ADC 24-bit + amplificator | Two-wire: DAT (D7), CLK (D8) |
| TM1637 4 cifre | Display 7-segment cu driver integrat | Two-wire: CLK (PD2), DIO (PD3) |
| Componenta | Rol in proiect | Interfata |
|---|---|---|
| Arduino Uno (ATmega328P) | Unitate centrala de procesare | — |
| Display TM1637 4 cifre | Afisarea numarului de tigari | CLK=PD2, DIO=PD3 |
| HX711 modul GroundStudio | ADC 24-bit pentru load cell | DAT=D7, CLK=D8 |
| Load cell 1kg | Masurarea greutatii pachetului | E+/E-/A+/A- la HX711 |
| Breadboard + fire jumper | Montaj circuit prototip | — |
| Modul | Semnal | Pin Arduino Uno | Pin ATmega328P |
|---|---|---|---|
| TM1637 — CLK | OUT | D2 | PD2 |
| TM1637 — DIO | OUT/IN | D3 | PD3 |
| HX711 — DAT | IN | D7 | PD7 |
| HX711 — CLK | OUT | D8 | PB0 |
| TM1637 — VCC | PWR | 5V | — |
| TM1637 — GND | GND | GND | — |
| HX711 — VDD | PWR | 5V | — |
| HX711 — GND | GND | GND | — |
TM1637 foloseste protocol bit-bang implementat manual pe DDRD/PORTD. HX711 este citit prin libraria HX711_ADC cu averaging intern. Nu sunt necesare rezistoare externe — TM1637 are driver integrat, iar HX711 are amplificator dedicat.
TODO — schema KiCad in lucru.
Am validat functionarea sistemului complet:
Montaj breadboard cu TM1637 si Arduino Uno
Proiectul functioneaza end-to-end: load cell-ul citeste greutatea pachetului, HX711 amplifica semnalul, Arduino Uno calculeaza numarul de tigari si afiseaza rezultatul pe TM1637 in timp real.
| Biblioteca | Rol | Justificare |
|---|---|---|
| HX711_ADC (olkal) | Citire date load cell | Implementeaza averaging si filtrare interna, reducand zgomotul. Citirea raw bit-bang manuala a dat rezultate instabile in teste initiale. |
| AVR libc (avr/io.h, util/delay.h) | Acces registre hardware | Folosita direct pentru TM1637 si configurarea perifericelor — fara overhead Arduino. |
Protocolul TM1637 este implementat manual pe registre (DDRD, PORTD), fara librarie externa.
Proiectul combina masurarea gravimetrica de precizie cu estimarea prin divizare pentru a numara obiecte mici (~1g) fara contact vizual. Fata de solutiile clasice cu camera + computer vision (imposibile pe ATmega328P cu 2KB RAM), abordarea prin greutate este robusta, ieftina si functioneaza in orice conditii de iluminare.
| Laborator | Functionalitate | Unde in cod |
|---|---|---|
| Lab 0 — GPIO | Configurare pini TM1637 prin DDRD/PORTD | tm_start(), tm_write_byte() |
| Lab 1 — UART | Comunicatie seriala pentru calibrare si debug | Serial.begin(57600), comenzi 't' |
| Lab 3 — Timere | Timer1 CTC pentru multiplexare display (implementare anterioara cu 5461AS) | ISR(TIMER1_COMPA_vect) |
Registre AVR folosite direct: DDRD, PORTD, DDRC, PORTC,
PINC, TCCR1A, TCCR1B, OCR1A, TIMSK1.
setup() ├── Initializare GPIO (DDRD, DDRB) ├── Initializare TM1637 (tm_set_brightness) ├── Initializare HX711_ADC (start + tare 2s) └── Serial 57600 baud loop() ├── LoadCell.update() ← citire HX711 non-blocanta ├── getData() ← greutate in grame ├── scade GREUTATE_PAC (7.00g) ← elimina greutatea pachetului gol ├── round(net / 1.13) ← calcul numar tigari ├── afiseaza_numar() ← scrie pe TM1637 via PORTD └── Serial print ← debug
TM1637 foloseste pinii PD2/PD3 prin protocol bit-bang implementat manual. HX711_ADC ruleaza non-blocant prin LoadCell.update() apelat in fiecare iteratie. Calculul se face la fiecare 500ms pentru stabilitate.
Calibrarea s-a realizat in 3 pasi:
LoadCell.start(2000, true) face zero automat.
Retara manuala prin comanda t in Serial Monitor.
si s-a calculat factorul prin LoadCell.getNewCalibration(12.6).
Rezultat: **CAL_FACTOR = 736.75**. - **Greutate per tigara**: masurata individual → **1.13g**. Greutatea pachetului gol → **7.00g**.
Eroarea de histerezis masurata: ±0.15g. La 20 de tigari in pachet, eroarea maxima cumulata ramane sub 1 tigara.
reducand zgomotul de la ±100 unitati raw la ±10 unitati.
LoadCell.update() in loc de citire blocanta —loop-ul ramane responsiv pentru comenzi Serial.
din cauza histerezisului.
Sistemul masoara greutatea cu o eroare de ±0.06g in conditii stabile (load cell fixat rigid). Eroarea de histerezis dupa ridicarea greutatii este de ±0.15g, acceptabila pentru scopul proiectului.
Teste efectuate:
Proiectul demonstreaza ca masurarea gravimetrica este o alternativa viabila si ieftina la procesarea de imagine pentru numararea obiectelor mici. Precizia de ±0.15g a load cell-ului de 1kg este suficienta pentru a distinge o singura tigara de 0.92g cu o marja de eroare acceptabila.
Principalele provocari intampinate:
programare (semnatura 0x000000) care a necesitat inlocuirea cu Arduino Uno
si a fost inlocuit cu modulul TM1637 cu driver integrat
citiri stabile