Autor: Palade Vlad-Gabriel Grupa: 331CA
Smart Pill Dispenser este un sistem medical automatizat, bazat pe microcontroler-ul ATmega324P, conceput pentru a distribui medicamente la ore prestabilite și a monitoriza condițiile de mediu în care acestea sunt păstrate.
Scopul proiectului este de a oferi o soluție portabilă și inteligentă pentru gestionarea tratamentelor medicale, prevenind uitarea dozelor și asigurând un mediu de stocare optim din punct de vedere termic.
Ideea de pornire a venit din dorința de a găsi o metodă prin care oamenii să poată avea grijă de bătrâni mai ușor. Mulți vârstnici locuiesc singuri și au programe de medicație stricte pe care le pot uita sau încurca frecvent, ceea ce le pune sănătatea în pericol.
De ce este util? Sistemul transformă o simplă cutie de pastile într-un asistent medical activ. Eliminând nevoia ca pacientul să țină minte programul, dispozitivul eliberează fizic doza corectă, confirmă reușita operațiunii și emite o alarmă sonoră persistentă. Această alarmă poate fi oprită doar prin interacțiune fizică, forțând astfel pacientul să conștientizeze momentul administrării.
Arhitectura proiectului este construită în jurul microcontrolerului ATmega324P. Logica de control este implementată sub forma unui automat finit de stări (FSM), care gestionează tranzițiile între: Așteptare (Idle), Eliberare (Dispensing), Alarmă (Reminder) și Alertă Mediu (Warning).
Modulul RTC (DS3231) reprezintă referința temporală a sistemului. Acesta comunică sincron cu microcontrolerul prin protocolul I2C (TWI). Este utilizat pentru a furniza ora exactă cu precizie ridicată, permițând programarea alarmelor de administrare independent de ceasul intern al procesorului.
Senzorul optic (Fotorezistorul LDR și LED-ul) formează o barieră optică internă. LDR-ul este integrat într-un divizor de tensiune, iar microcontrolerul monitorizează constant tensiunea analogică prin modulul ADC. Când o pastilă cade prin tubul de evacuare, aceasta întrerupe raza de lumină a LED-ului, generând o variație bruscă de tensiune. Acest eveniment confirmă eliberarea fizică a dozei, indiferent de condițiile de iluminare din cameră.
Servomotorul (SG90) este elementul responsabil de distribuție. Acesta este controlat prin semnale PWM generate de timerele hardware ale ATmega324P. La ora stabilită, brațul servomotorului se rotește la un unghi precis pentru a permite eliberarea unei singure pastile.
Buzzer-ul Pasiv acționează ca indicator acustic. Deoarece nu are oscilator intern, acesta necesită un semnal PWM extern pentru a produce sunet. Prin modificarea frecvenței semnalului, sistemul generează un ton de alarmă oscilant, similar unei sirene, pentru a asigura receptarea alertei de către pacient.
Butonul fizic asigură controlul stării alarmei. Este configurat să genereze o întrerupere externă hardware (INT). Această abordare garantează un răspuns instantaneu la apăsare, permițând pacientului să oprească alarma sonoră și să confirme administrarea fără a bloca execuția restului programului.
Senzorul de temperatură (DHT11) și LED-ul de stare monitorizează siguranța depozitării. Microcontrolerul interoghează senzorul prin pini digitali (GPIO) folosind un protocol specific. Dacă pragul termic de siguranță este depășit, un LED roșu este activat pentru a avertiza că integritatea medicamentelor poate fi compromisă.
Proiectul a fost dezvoltat folosind mediul PlatformIO, utilizând limbajul C. O caracteristică principală a implementării este controlul tuturor perifericelor (generare semnale PWM, comunicare I2C, conversie Analog-Digitală și Întreruperi Hardware) este realizat exclusiv prin interacțiunea directă cu regiștrii microcontrolerului ATmega328P. Această abordare elimină dependența de biblioteci externe de nivel înalt specifice framework-ului Arduino, asigurând o amprentă minimă de memorie, un control strict al temporizărilor și un timp de răspuns instantaneu al senzorilor.
Logica centrală a dispozitivului este implementată în programul principal printr-o arhitectură de tip loop care verifică și execută secvențial trei blocuri logice independente, utilizând variabile de tip “flag” pentru a reține starea sistemului:
Inițializarea: Sunt configurați pinii GPIO, interfața I2C pentru ceasul RTC, Timerele pentru controlul servomotorului și generarea de milisecunde, modulul ADC pentru fotorezistor și se activează întreruperile globale (sei()).
Blocul 1 - Timp și Eliberare (RTC & Servo): Sistemul citește continuu ora de la modulul RTC. Când ora curentă coincide cu ora programată, se verifică flag-ul pastilaEliberataAzi. Dacă este 0, sistemul comandă servomotorul să execute o rotație precisă pentru a elibera pastila, după care flag-ul devine 1 pentru a preveni eliberări multiple în același minut. Când ora se schimbă, flag-ul este resetat automat.
Blocul 2 - Confirmare și Alarmă (ADC & Buzzer): Sistemul interoghează constant convertorul ADC conectat la bariera optică (LDR). Dacă valoarea scade sub pragul prestabilit, înseamnă că pastila a căzut prin tub, iar flag-ul global alarmActive este setat pe 1. În baza acestui flag, buzzer-ul este activat continuu.
Blocul 3 - Monitorizare Mediu (DHT11): Utilizând logica de temporizare neblocantă (comparând timpul curent cu o citire anterioară), senzorul de temperatură este interogat asincron la fiecare 2 secunde. Dacă temperatura depășește pragul de 26°C, pinul aferent LED-ului de alertă este setat pe HIGH.
Oprirea Alarmei (Hardware Interrupt): Deși procesarea generală este secvențială, oprirea alarmei este realizată asincron printr-o întrerupere hardware (INT0) declanșată de apăsarea butonului fizic. Rutina de tratare a întreruperii (ISR) resetează instantaneu flag-ul alarmActive la 0, forțând blocul 2 să oprească buzzer-ul la următoarea iterație a buclei.
Pentru a asigura o arhitectură curată, funcționalitățile hardware au fost corelate direct cu laboratoarele parcurse în cadrul materiei:
Laboratorul 0: GPIO - Reprezintă fundamentul controlului hardware. Manipularea directă a regiștrilor DDRx și PORTx este folosită pentru a stabili direcția pinilor și pentru a controla LED-ul de alertă și Buzzer-ul. Tot prin GPIO a fost implementat protocolul custom 1-Wire necesar citirii senzorului de temperatură DHT11, manipulând la nivel de microsecundă starea pinilor.
Laboratorul 2: Întreruperi - Pinul asociat butonului de confirmare este configurat să intercepteze apăsările prin intermediul unei întreruperi externe (INT). Registrul de control (EICRA) este setat pe front căzător (Falling Edge), detectând momentul exact în care butonul face contact cu masa (GND). Rutina ISR aferentă modifică instantaneu flag-ul alarmei, acționând independent de fluxul programului principal.
Laboratorul 3: Timere. PWM - Pentru a asigura temporizarea și acționarea mecanică, se utilizează două timere:
Timer 1 (16-bit): Este configurat în modul Fast PWM cu ICR1 ca TOP pentru a genera un semnal exact de 50Hz (20ms) necesar Servomotorului SG90. Prin modificarea dinamică a registrului OCR1A, se controlează milimetric lățimea pulsului (între 1ms și 2ms), dictând unghiul de rotație al brațului mecanic.
Timer 2 (8-bit): Este configurat în modul CTC (Clear Timer on Compare Match) cu întrerupere la prag, generând un “systick” la fiecare milisecundă. Această variabilă globală stă la baza funcțiilor de temporizare neblocantă din sistem.
Laboratorul 4: ADC - Convertorul Analog-Digital este utilizat pentru a citi bariera optică (LDR). Este inițializat folosind referința AVCC și un prescaler optim (128) pentru a garanta o conversie stabilă la frecvența procesorului. Citirea pinului se face prin polling activ pe bitul ADSC, măsurând cu mare acuratețe căderea de tensiune provocată de trecerea pastilei prin tub.
Laboratorul 6: I2C - Comunicația cu modulul RTC DS3231 este realizată integral bare-metal folosind interfața Two-Wire (TWI) a microcontrolerului. Au fost implementate manual funcțiile de START, STOP, WRITE și READ (cu și fără ACK) prin manipularea directă a regiștrilor TWCR, TWSR și TWDR. Logica include configurarea vitezei de transfer (100kHz prin TWBR) și transformarea datelor din format BCD (Binary-Coded Decimal) transmis de ceas în numere întregi zecimale utilizabile de logica programului.