SmartScale Checkout este un sistem de casă de marcat self-service controlat de un microcontroler ATmega328P. Utilizatorul scanează produsele cu telefonul (folosind o aplicație de scanare coduri de bare), trimite produsul prin Bluetooth la placuță, îl plasează pe cântar pentru validarea greutății, și la final efectuează o plată prin apropierea unui card RFID. Pe tot parcursul, un display LCD afișează produsele adăugate și totalul, iar un buzzer confirmă fiecare acțiune cu un beep.
Proiectul demonstrează integrarea mai multor module hardware într-un sistem coerent, simulând funcționalitatea unui terminal self-pay întâlnit în supermarketuri moderne.
Punctul de plecare a fost observarea că terminalele self-checkout din magazine sunt, în esență, sisteme embedded cu câteva periferice bine definite. Proiectul și-a propus să reproducă aceeași logică la scară redusă, pe o platformă de dezvoltare accesibilă.
Pentru utilizatori, demonstrează că un sistem complet de casă de marcat poate fi construit cu componente ieftine și un microcontroler de 8 biți. Pentru student, reprezintă o oportunitate de a lucra simultan cu UART, SPI, I2C, PWM și GPIO pe același microcontroler, rezolvând probleme reale de sincronizare și validare a datelor.
Descrierea schemei bloc
Intrări:
MCU + software:
Ieșiri:
| Nr. | Componentă | Cantitate | Detalii |
|---|---|---|---|
| 1 | ATmega328P Xplained Mini | 1 | Placă de dezvoltare principală |
| 2 | Modul Bluetooth HC-06 | 1 | Comunicație UART, 9600 baud |
| 3 | Celulă de sarcină 20 kg | 1 | Tip bare, punte Wheatstone |
| 4 | Modul amplificator HX711 | 1 | ADC 24-bit pentru celula de sarcină |
| 5 | Display LCD 16×2 | 1 | Cu modul I2C (PCF8574) inclus |
| 6 | Modul RFID RC522 | 1 | Include card și tag de test |
| 7 | Buzzer pasiv 5V | 1 | Control prin semnal PWM |
| 8 | LED roșu 5mm | 1 | Indicator eroare validare greutate |
| 9 | Rezistență 100Ω | 4 | Limitare curent pentru LED și pentru pinul RX al HC-06 |
| 10 | Fire jumper | 1 set | Conexiuni |
| 11 | Cablu USB micro | 1 | Alimentare și programare Xplained Mini |
| 12 | Suport pentru cântar | 1 | Structură mecanică celulă de sarcină |
Microcontroler principal al proiectului. Rulează firmware-ul care coordonează toate modulele, procesează datele primite prin Bluetooth, validează greutatea măsurată de cântar, controlează afișajul LCD, generează semnalele de feedback (buzzer, LED) și gestionează plata prin RFID. Operează la 16 MHz și dispune de periferice hardware UART, SPI și I2C utilizate simultan în acest proiect.
Modul de comunicație wireless care permite trimiterea datelor de la smartphone către microcontroler. Utilizatorul scanează codul de bare al unui produs cu telefonul și trimite datele prin Bluetooth. HC-06 operează ca dispozitiv slave și comunică cu ATmega prin protocolul UART la 9600 baud. Alimentat la 5V, cu protecție pe linia RX prin divizor de tensiune (pinul RX al HC-06 este compatibil cu 3.3V, nu cu 5V).
Celula de sarcină este un traductor mecano-electric care convertește forța aplicată (greutatea unui obiect) într-un semnal electric de tensiune foarte mic, prin intermediul unei punți Wheatstone. Semnalul analogic este amplificat și digitizat de modulul HX711, un convertor analog-digital de 24 biți dedicat aplicațiilor de cântărire. ATmega citește datele prin protocol serial sincron pe 2 fire (SCK și DT). Rolul în proiect: validarea greutății produsului scanat față de greutatea așteptată stocată în firmware.
Modul de citire RFID care operează la frecvența de 13.56 MHz (standard ISO 14443A). Detectează cardul sau tag-ul RFID prezentat de utilizator și transmite un identificator unic (UID) către microcontroler prin protocolul SPI. Rolul în proiect: simularea plății — prezentarea cardului finalizează sesiunea de cumpărături. Alimentat obligatoriu la 3.3V (nu 5V).
Afișaj cu cristale lichide cu 2 rânduri a câte 16 caractere fiecare. Modulul I2C PCF8574 reduce numărul de pini necesari de la 8 la 2 (SCL și SDA), comunicând cu ATmega prin protocolul I2C. Afișează: numele produsului scanat, greutatea măsurată, totalul acumulat și mesajele de eroare.
Traductor electroacustic care necesită un semnal de frecvență variabilă pentru a produce sunet (spre deosebire de buzzerul activ care are oscilator intern). Este controlat prin semnal PWM generat pe pinul OC2B (PD3) al ATmega. Produce un beep scurt la fiecare scanare reușită și un ton diferit la eroare de greutate.
Indicator vizual de eroare. Se aprinde când greutatea măsurată nu corespunde cu greutatea așteptată a produsului scanat. Conectat pe pinul PD4 prin rezistență de limitare a curentului de 100Ω.
| Componentă | Pin ATmega328P | Protocol | Justificare |
|---|---|---|---|
| HC-06 TX | PD0 (TX UART) | UART | Pinii PD0/PD1 sunt dedicați hardware pentru UART (USART0), asigurând comunicație serială fiabilă la 9600 baud fără consum de resurse software |
| HC-06 RX | PD1 (RX UART) | UART | Idem, pinul de transmisie hardware UART |
| HX711 SCK | PD7 | GPIO (bit-bang) | HX711 folosește un protocol serial proprietar simplu, implementat prin bit-banging pe GPIO standard; PD7 ales pentru a evita conflicte cu SPI și UART |
| HX711 DT | PD6 | GPIO (bit-bang) | Pinul de date al HX711; PD6 ales alăturat lui PD7 pentru organizare logică |
| RC522 SCK | PB5 | SPI | PB5 este pinul hardware dedicat SCK al interfeței SPI (MSTR) a ATmega328P |
| RC522 MISO | PB4 | SPI | PB4 este pinul hardware dedicat MISO al interfeței SPI |
| RC522 MOSI | PB3 | SPI | PB3 este pinul hardware dedicat MOSI al interfeței SPI |
| RC522 SS (SDA) | PB2 | SPI | PB2 este pinul hardware dedicat SS al interfeței SPI, folosit pentru selectarea RC522 |
| RC522 RST | PD5 | GPIO | Pin GPIO simplu pentru resetarea modulului RC522; ales din pinii disponibili |
| LCD SCL | PC5 | I2C | PC5 este pinul hardware dedicat SCL al interfeței I2C (TWI) a ATmega328P |
| LCD SDA | PC4 | I2C | PC4 este pinul hardware dedicat SDA al interfeței I2C (TWI) a ATmega328P |
| Buzzer | PD3 (OC2B) | PWM | PD3: Ieșire digitală pentru buzzerul pasiv. Frecvența este generată asincron folosind Timer/Counter1 și o rutină de tratare a întreruperilor (ISR) pentru a asigura acuratețea tonurilor. |
| LED roșu | PD4 | GPIO | Pin GPIO simplu pentru controlul LED-ului de eroare; rezistență de 100Ω în serie |
Schema electrică a proiectului grupează componentele în două zone distincte:
Pentru claritatea schemei, firele sunt colorate după funcție și protocol:
| Culoare | Semnificație |
|---|---|
| Roșu | VCC 5V |
| Negru | GND |
| Roz | VCC 3.3V (exclusiv RC522) |
| Portocaliu | UART TX |
| Galben | UART RX |
| Albastru deschis | SPI SCK |
| Verde | SPI MOSI |
| Verde deschis | SPI MISO |
| Violet | SPI SS/NSS și GPIO LED |
| Maro | SPI RST |
| Albastru închis | I2C SCL |
| Cyan | I2C SDA |
| Gri | GPIO Buzzer |
Proiectul folosește două tensiuni de alimentare, ambele furnizate de placa ATmega328P Xplained Mini prin intermediul conectorului USB:
Firmware-ul a fost programat în Visual Studio Code, folosind extensia PlatformIO, care oferă un mediu integrat pentru compilarea codului, gestionarea dependențelor și încărcarea binarului rezultat direct pe microcontroler.
Proiectul nu utilizează biblioteci externe de tip third-party. Toate driverele pentru periferice (LCD, RC522, HX711) și protocoalele de comunicație (UART, SPI, I2C) au fost implementate de la zero peste registrele hardware ale ATmega328P.
Sunt utilizate exclusiv biblioteci standard din setul AVR-GCC:
Elementul de noutate al proiectului constă în integrarea unui mecanism de validare a greutății în fluxul de scanare, inspirat din sistemele self-checkout din supermarketurile moderne.
Spre deosebire de un simplu sistem de scanare și afișare, SmartScale Checkout blochează progresul sesiunii dacă greutatea produsului plasat pe cântar nu corespunde greutății declarate în baza de date (toleranță +-10%). Această validare elimină posibilitatea scanării unui produs și plasării altuia pe cântar. Un alt element distinctiv este mecanismul de supervisor override. Scanarea unui cod special deblochează sesiunea fără validarea greutății, simulând intervenția unui angajat în caz de eroare, funcționalitate prezentă în terminalele self-checkout reale.
Interfața mobilă dezvoltată în MIT App Inventor completează sistemul cu un flux complet: scanare cod de bare prin camera telefonului, transmisie Bluetooth către microcontroler, afișare bon fiscal digital la finalul sesiunii.
Firmware-ul este organizat în module separate, fiecare responsabil de un periferic:
Interacțiunea dintre module urmează un flux unidirecțional. Toate modulele perifericelor sunt apelate în main, cel care coordonează activitatea proiectului, fiind independente unele de celelalte.
Mașina de stări are 5 stări:
Validarea funcționării a fost realizată în două etape:
Proiectul SmartScale Checkout utilizează direct cunoștințele acumulate în cadrul laboratoarelor, atât la nivel teoretic cât și practic.
Configurarea pinilor folosește exact mecanismul prezentat în laboratorul 0, prin registrele DDRn și PORTn:
Comunicația serială cu modulul Bluetooth HC-06 utilizează perifericul USART0 al ATmega328P, configurând registrele prezentate în laboratorul 1:
Buzzerul pasiv necesită un semnal cu frecvență variabilă pentru a produce sunet. Teoria PWM din laboratorul 3 a stat la baza implementării funcției beep(), care generează semnalul pe PD3, alternând starea pinului la un interval calculat din frecvența dorită.
Comunicația cu modulul RFID RC522 utilizează interfața SPI hardware a ATmega328P, configurată prin registrele studiate în laboratorul 5:
RC522 folosește arhitectura Master-Slave descrisă în laborator: ATmega este master, RC522 este slave, selectat prin SS activ LOW.
Display-ul LCD 16×2 cu expander PCF8574 comunică prin protocolul I2C (TWI), implementat folosind registrele prezentate în laboratorul 6:
Adresa expanderului PCF8574 (0x27) este transmisă conform protocolului descris în laborator, cu bitul de scriere (0) pe poziția LSB.
Calibrarea HX711 a presupus determinarea a două valori:
Tara (offset) — valoarea raw returnată de HX711 cu cantarul gol, determinată prin citirea mediei a 5 valori consecutive după stabilizarea mecanică a sistemului:
Tara = 232121 (unități raw)
Factorul de calibrare — numărul de unități raw per gram, determinat prin plasarea unui obiect cu greutate cunoscută pe cântar. S-a folosit un smartphone cu greutatea verificată pe un cântar de bucătărie (266g):
Raw cu greutate = 259448 Diferență = 259448 - 232121 = 27327 unități Factor = 27327 / 266g = 102.7 unități/gram
Formula de conversie implementată în firmware:
greutate(g) = (raw - 232121) / 102.7
Validarea calibrării s-a făcut prin măsurarea aceluiași obiect. Rezultatul returnat de firmware a fost 266g, identic cu valoarea de referință.
Toleranța de validare a fost setată la ±10% față de greutatea declarată în baza de date, justificată de precizia celulei de sarcină de 20kg pe produse mici și de variațiile normale ale ambalajelor.
Memorie Flash — PROGMEM:Baza de date cu cele 7 produse (nume, cod, preț, greutate) este stocată în memoria Flash folosind directiva PROGMEM, nu în SRAM. Pe ATmega328P cu doar 2KB SRAM, stocarea unui array de structuri în RAM ar consuma inutil memorie necesară stack-ului și variabilelor dinamice. Citirea se face prin memcpy_P la momentul accesării. În total, implementarea curentă permite stocarea a aproximativ 500 de produse, luând în calcul că un produs ocupă 33 de bytes de memorie în structura curentă.
Medie a 10 citiri HX711: HX711 produce valori cu zgomot. Citirea unei singure valori raw poate genera erori de validare false. Funcția hx711_read_avg() calculează media aritmetică a 10 citiri consecutive, reducând zgomotul și îmbunătățind stabilitatea măsurătorilor.
Modularizare pe fișiere separate:Împărțirea codului pe module (uart, i2c, lcd, spi, rc522, load_cell, buzzer) permite compilarea separată și recompilarea doar a modulelor modificate, reducând timpul de build. De asemenea, ușurează urmărirea codului și îmbunătățirea lui pe termen lung.
în videoclipul de mai sus se prezintă proiectul în stadiul final, după milestone-ul pentru software. De asemenea, se trece și printr-o rutină de scanare, primele produse fiind validate prin greutate, cel din urmă fiind validat cu ajutorul codului de supervisor.
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.
Imaginea prezintă montajul complet al proiectului pe breadboard, în stadiul de prototipare. Se pot identifica toate componentele care alcătuiesc sistemul dezvoltat. În filmulețul de prezentare, se demonstrează funcționarea individuală a tuturor componentelor și, mai mult, că este posibilă și comunicarea între smartphone și placa de dezvoltare. Testarea s-a făcut individual, în primă instanță, pentru a mă asigura că pot fi folosite ulterior în produsul final.
| Nr. | Componentă | Link |
|---|---|---|
| 1 | ATmega328P Xplained Mini | https://ww1.microchip.com/downloads/en/DeviceDoc/50002659A.pdf |
| 2 | Modul Bluetooth HC-06 | https://components101.com/sites/default/files/component_datasheet/HC06%20Bluetooth%20Module%20Datasheet.pdf |
| 3 | Celulă de sarcină 20 kg | https://www.gotronic.fr/pj-460.pdf?srsltid=AfmBOoqofpsrpgaUuTcD77Wck0RtZxTtGMKEYYsWmxeX4NpY7LXV8xWz |
| 4 | Modul amplificator HX711 | https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://community.infineon.com/gfawx74859/attachments/gfawx74859/CodeExamples/546/7/HX711_v0_0_B.pdf&ved=2ahUKEwjbwJXtxc-UAxXBS_EDHTTIMnUQFnoECB0QAQ&usg=AOvVaw1pjHusoY7T_H1lsxugKvkg |
| 5 | Display LCD 16×2 | https://www.vishay.com/docs/37484/lcd016n002bcfhet.pdf |
| 6 | PCF8574 Remote 8-Bit I/O Expander for I2C Bus | https://www.ti.com/lit/ds/symlink/pcf8574.pdf |
| 7 | Modul RFID RC522 | https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf |