This is an old revision of the document!


Cigarette Pack Counter

Introducere

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:

  • Demonstreaza utilizarea unui ADC extern de inalta precizie (24 biti)
  • Combina notiuni din laborator: GPIO, UART, Timere
  • Reprezinta o solutie robusta si independenta de conditiile de iluminare
  • Poate fi adaptat pentru orice produs cu greutate cunoscuta per unitate

Descriere generala

Sistemul este compus din urmatoarele module:

  • Arduino Uno (ATmega328P) este unitatea centrala de procesare. Placuta

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.
  • Load cell 1kg este senzorul mecanic care se deformeaza proportional

cu greutatea plasata pe el. Genereaza un semnal diferential de tensiune

  in intervalul mV.
  • Modulul HX711 este un amplificator si convertor analog-digital de

24 de biti dedicat celulelor de sarcina. Comunica cu ATmega328P printr-un

  protocol two-wire (DOUT si SCK) pe pinii D7 si D8.
  • Display TM1637 (4 cifre) afiseaza numarul curent de tigari din pachet.

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.
  • Alimentarea se face de la 5V prin USB. HX711 si TM1637 sunt alimentate

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)

Hardware Design

Componente folosite si rolul lor

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

Pinii utilizati

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.

Schema electrica

TODO — schema KiCad in lucru.

Dovada de functionare

Am validat functionarea sistemului complet:

  1. Display TM1637 afiseaza cifrele 0-9 corect in secventa de test
  2. HX711 citeste greutatea cu eroare de ±0.06g in conditii stabile
  3. Calculul numarului de tigari functioneaza corect cu factorul de calibrare determinat experimental

Montaj breadboard cu TM1637 si Arduino Uno

Montaj HX711 si load cell

Calcul greutate → numar tigari

  • Greutate ambalaj gol: 7.00g (calibrata experimental)
  • Greutate per tigara: 1.13g (masurata experimental)
  • Factor calibrare HX711: 736.75 (determinat cu obiect etalon de 12.6g)
  • Formula: nr_tigari = round( (greutate_totala - 7.00) / 1.13 )
  • Eroare histerezis load cell: ±0.15g (~13% din greutatea unei tigari)

Software Design

Stadiul actual al implementarii

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.

Biblioteci folosite

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.

Element de noutate

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.

Functionalitati din laborator utilizate

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.

Scheletul proiectului

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.

Calibrare senzor

Calibrarea s-a realizat in 3 pasi:

  1. Tara: la pornire, LoadCell.start(2000, true) face zero automat.

Retara manuala prin comanda t in Serial Monitor.

  1. Factor de calibrare: s-a pus un obiect cu masa cunoscuta (12.6g)

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.

Optimizari realizate

  1. Averaging in HX711_ADC: libraria face media mai multor citiri intern,

reducand zgomotul de la ±100 unitati raw la ±10 unitati.

  1. Update non-blocant: LoadCell.update() in loc de citire blocanta —

loop-ul ramane responsiv pentru comenzi Serial.

  1. Print la 500ms: evita flickering pe display si flood in Serial Monitor.
  2. Grame negative clampate la 0: evita afisarea de valori negative

din cauza histerezisului.

Demo video

Calibrarea a fost facuta cu Dunhill, a trebuit sa cantaresc si sa modific cateva chestii

Rezultate Obtinute

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:

  • Moneda ~0.92g → afisat corect
  • Plic Nescafe 12.60g → afisat 12.58-12.65g (eroare <2%)
  • Sticla extract rom 32.56g → afisat corect dupa calibrare

Concluzii

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:

  • Placa ATmega328P Xplained Mini a dezvoltat o problema hardware de

programare (semnatura 0x000000) care a necesitat inlocuirea cu Arduino Uno

  • Display-ul 7-segment raw 5461AS a necesitat multiplexare software complexa

si a fost inlocuit cu modulul TM1637 cu driver integrat

  • Calibrarea load cell-ului necesita fixare rigida a ambelor capete pentru

citiri stabile

Download

TODO — link GitHub cu surse, README

pm/prj2026/cezar.zlatea/teodor.pana.1779653410.txt.gz · Last modified: 2026/05/24 23:10 by teodor.pana
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