Pet Feeder Automat
Introducere
Proiectul propune o soluție automatizată pentru hrănirea animalelor de companie, care permite distribuirea controlată a hranei la intervale regulate sau la cerere. Sistemul oferă posibilitatea de a seta frecvența și cantitatea porțiilor, asigurând astfel alimentația constantă și echilibrată a animalului, chiar și în absența proprietarului.
Scopul principal este de a automatiza procesul de hrănire, reducând astfel intervențiile manuale și timpul necesar pentru îngrijirea zilnică. Se urmărește totodată asigurarea unei alimentații corecte și prevenirea risipirii sau degradării hranei.
Inițiativa a plecat de la necesitatea de a gestiona eficient alimentația animalelor în situații în care proprietarii nu pot fi prezenți. A fost identificată oportunitatea de a dezvolta o soluție practică, cu aplicabilitate reală, care să îmbunătățească rutina zilnică a posesorilor de animale.
Proiectul este valoros prin faptul că adresează o nevoie comună și oferă beneficii clare: hrănire constantă, control al porțiilor, economie de hrană și liniște pentru proprietar. În plus, dezvoltarea unei astfel de soluții contribuie la aprofundarea cunoștințelor tehnice în domeniul sistemelor automate și al controlului digital.
Descriere generală
Schema bloc
Module hardware
Mecanism de distribuire - Include o elice 3D printată, o tijă M3, un tub de hârtie și o cutie cu compartimente. Acestea ghidează hrana din rezervor spre bol, prevenind blocajele.
Module software
Program de control - Codul scris în Arduino C/C++ implementează logica generală de funcționare a sistemului. Acesta citește valorile de la modulul RTC, gestionează butoanele, controlează motorul și actualizează afișajul LCD.
Interacțiunea dintre module
La pornirea sistemului, utilizatorul poate seta intervalul de hrănire și numărul de porții dorit, folosind butoanele.
Informațiile sunt afișate pe ecranul LCD în timp real.
Modulul RTC trimite constant ora curentă către Arduino.
Când ora curentă coincide cu intervalul programat, microcontrolerul activează modulul de control porții.
Servo motorul este pornit și rotește elicea, eliberând hrana în cantitatea stabilită.
Hrana trece prin tubul din hârtie și compartimentele ghidate, ajungând la animalul de companie.
Toate aceste acțiuni sunt gestionate și coordonate de programul software central din microcontroler.
Hardware Design
Listă de componente
Componentă | Descriere | Interfață / Pini | Link |
Placă Arduino UNO | Microcontroller ATmega328P, 5V, 16MHz | GPIO, I2C, PWM | Link |
Servomotor MG995 | Servo digital, 180°, 4.8–7.2V | PWM: pin 9 (OC1A) | Link |
Modul RTC DS3231 | Ceas de timp real cu baterie CR2032 | I2C: A4 (SDA), A5 (SCL) | Link |
LCD 1602 cu I2C | Ecran 16×2 caractere, 5V, cu backlight | I2C: A4 (SDA), A5 (SCL) | Link |
3 Butoane push | Butoane folosite pentru interacțiune | PD2 (pin 2 – porții), PD3 (pin 3 – interval), PD5 (pin 5 – manual) | Link |
Breadboard | Conectarea tuturor componentelor, pentru a asigura funcționarea sistemului | - | Link |
Fire jumper | Conectarea butoanelor | - | Link |
Fire tată-tată | Conectarea breadboardului cu celelalte componente | - | Link |
Tijă metalică M3 | Conectarea servomotorului la elicea de eliberare a hranei | - | - |
Elice imprimată 3D | Eliberează hrana prin rotire, odată cu acționarea servomotorului | - | - |
Capac și pereți din polistiren | Favorizează căderea boabelor în elice | - | - |
Bureți | Sunt lipiți de pereții marginilor, în jurul tijei și nu permit boabelor să ajungă în locuri nedorite | - | - |
Tub cilindric din hârtie | Evită supraaglomerarea de boabe a orificiului din capac | - | - |
Sticlă tip pâlnie | Are introdus în locul dopului tubul de hârtie, asigurând un număr mare de porții | - | - |
Schema electrică
Diagramă realizată în Cirkit– include: Arduino, servo, RTC, LCD și butoane.
Schemă electrică realizată în Tinkercad.
Pini utilizați și interfețe hardware
Componentă | Pin Arduino | Descriere | Tehnologie utilizată |
Buton porții | D2 (PD2) | Setează numărul de porții | GPIO + Interrupt (INT0) |
Buton interval | D3 (PD3) | Setează intervalul de hrănire | GPIO + Interrupt (INT1) |
Buton manual | D5 (PD5) | Activează hrănirea manual | GPIO (polling) |
Servomotor MG995 | D9 (PB1) | Comandă rotația servomotorului | PWM (Timer1 – OC1A) |
RTC DS3231 | A4, A5 | Comunică ora cu microcontrollerul | I2C (SDA/SCL) |
LCD 1602 (I2C) | A4, A5 | Afișează info pe ecran | I2C (SDA/SCL) |
Stadiul implementării hardware
Proiectul este funcțional și implementat fizic pe breadboard. Sistemul include toate modulele descrise în diagrama bloc, conectate la placa de dezvoltare Arduino UNO.
Componentele esențiale includ:
Servomotor MG995 controlat prin PWM
Modul RTC DS3231 conectat pe magistrala I2C
LCD 1602 cu interfață I2C pentru afișare interactivă
3 butoane pentru controlul porțiilor, intervalului și hrănirii manuale
Mecanism fizic de distribuire al hranei activat de servomotor
Breadboard, fire jumper și sursă 5V DC
Sistemul a fost testat și validat în condiții reale, conform descrierii din documentație.
Imagini și videoclip cu implementarea hardware
Software Design
Stadiul actual al implementării software
Sistemul software al proiectului este complet implementat și funcționează pe baza codului C scris pentru platforma Arduino IDE, varianta 2.3.6, cu acces direct la registrele microcontrolerului ATmega328P. Toate funcțiile critice (gestionare butoane, PWM pentru servo, afișare I2C, RTC, întreruperi externe) sunt testate și validate.
Biblioteci folosite și justificare
<avr/io.h> și <avr/interrupt.h> - Permit accesul direct la registrele microcontrolerului ATmega328P. Sunt utilizate pentru configurarea întreruperilor externe (INT0, INT1), precum și pentru inițializarea porturilor, PWM și Timer1.
Elemente de noutate
Proiectul combină mai multe funcționalități critice pentru un sistem embedded:
Interacțiune cu utilizatorul prin butoane + feedback pe LCD
Hrănire automata în funcție de ora curentă și interval programabil
Servomotor controlat prin semnal PWM generat de Timer1
Salvare a logicii de setare porții și intervalului prin ISR-uri (INT0, INT1)
Structurare clară a codului în module separate
Legătura cu laboratoarele
Proiectul folosește activ toate conceptele predate în laboratoarele următoare:
Laboratorul 0 - GPIO: citirea butoanelor prin porturi, configurarea pinilor ca intrare cu rezistențe de pull-up.
Laboratorul 2 - Întreruperi: folosirea INT0 și INT1 pentru acțiuni imediate în cod (setare porții și interval).
Laboratorul 3 - Timer1/PWM: generarea semnalului pentru servomotor MG995 (50Hz, 1-2ms).
Laboratorul 6 - I2C/RTC: comunicarea cu DS3231 și afișarea datelor pe LCD.
Scheletul software și interacțiuni
Structura proiectului este modulară:
setup() – initializează toate perifericele: LCD, GPIO, PWM, întreruperi, RTC
loop() – verifică ora curentă, actualizează LCD, declanșează hrănirea automat/manual
ISR(INT0_vect) / ISR(INT1_vect) – cresc porțiile sau intervalul de timp
feed_now() – controlează efectiv servomotorul și actualizează afișajul
update_lcd() – arată utilizatorului informațiile curente legate de porții și interval
Validarea s-a făcut prin rulare reală pe breadboard, cu alinierea exactă a orei de hrănire cu DS3231. LCD-ul indică starea, iar servomotorul răspunde precis la comenzi.
Funcții implementate
setup() – inițializează perifericele hardware și comunicarea I2C
loop() – verifică ora curentă, decide dacă trebuie activată hrănirea, actualizează afișajul
feed_now() – generează impulsuri PWM pentru servomotor în funcție de porții
update_lcd() – afișează intervalul și porțiile pe ecran
ISR(INT0_vect) – crește numărul de porții
ISR(INT1_vect) – crește intervalul dintre hrăniri
Algoritmi și structuri utilizate
Algoritmul de funcționare este bazat pe:
Citirea în timp real a ceasului (DS3231)
Compararea cu un orar prestabilit (next_feed_hour/minute/sec)
Verificarea în buclă a condițiilor de hrănire și activarea secvenței de control servo
Gestionarea întreruperilor externe pentru actualizarea parametrilor de funcționare fără delay-uri
Structura codului este modulară, cu funcții dedicate pentru:
inițializări (setup_pwm_servo, setup_interrupts, setup_gpio)
logică de execuție (feed_now, update_lcd)
tratarea întreruperilor (ISR pentru INT0 și INT1)
Calibrare
Unghiurile au fost alese pentru a face o rotație completă (0–180°) per porție distribuită. S-a folosit următorul cod pentru generarea semnalului PWM:
c
void set_servo_angle(int angle) {
uint16_t pulse_us = map(angle, 0, 180, 1000, 2000);
OCR1A = pulse_us * 2;
}
Modulul DS3231 este conectat prin I2C (SDA/SCL) și inițializat în setup():
c
rtc.begin();
Ora curentă este citită periodic în bucla principală:
c
t = rtc.getTime();
Valorile orei, minutului și secundelor sunt apoi comparate cu ora programată pentru a declanșa hrănirea:
c
if (t.hour == next_feed_hour && t.min == next_feed_minute && t.sec == next_feed_seconds) {
feed_active = true;
}
Calibrarea s-a făcut prin setarea manuală inițială a orei modulului, folosind funcția rtc.setTime(...) într-un sketch separat (neinclus în proiectul final), pentru a corespunde cu ora reală a sistemului.
Pentru a evita activări multiple din cauza zgomotului electric, s-a adăugat un delay software:
c
if (!(PIND & (1 << BTN_MANUAL))) {
feed_active = true;
_delay_ms(300); // debounce
}
Optimizări
Timpul de rulare în loop este minimizat (delay de doar 250ms)
Interacțiunea prin ISR evită polling constant și salvează energie
Controlul servo e făcut doar la nevoie (nu în loop permanent)
Rezultate Obţinute
Mai jos este o demonstrație completă a funcționării sistemului Pet Feeder automat:
Demonstrația video a proiectului
Videoclipul prezintă funcționarea sistemului în regim real, ilustrând:
Afișarea pe LCD a numărului de porții și a intervalului de hrănire setat
Modificarea acestor setări cu ajutorul butoanelor PD2 și PD3
Declanșarea manuală a hrănirii prin apăsarea butonului PD5
Răspunsul vizual oferit de LCD în timpul procesului de hrănire („FEEDING”)
Controlul servomotorului prin semnal PWM generat cu Timer1 (OC1A)
Funcționalitățile de bază ale proiectului
În videolicpul de mai sus, sunt prezentate următoarele funcționalități de bază:
Afișarea pe LCD a numărului de porții și a intervalului de hrănire setat
Incrementarea butonului de porții PD2 până la valoarea maximă de 10
Incrementarea butonului de porții PD3 până la valoarea maximă de 24
Activarea modulului RTC la ora prestabilită, în funcție de numărul de porții și interval stabilite
O surpriză la final
Concluzii
Proiectul “Pet Feeder Automat” a demonstrat utilitatea unui sistem de hrănire automată pentru animale de companie. Sistemul oferă o soluție practică pentru proprietarii ocupați, asigurând o alimentație regulată chiar și în absența acestora.
Beneficii obținute
Hrănirea automată contribuie la o rutină sănătoasă pentru animalul de companie.
Flexibilitatea sistemului permite setarea porțiilor și a intervalelor de timp în funcție de nevoile fiecărui animal.
Sistemul reduce stresul proprietarilor legat de programul de hrănire.
Posibile îmbunătățiri
Integrarea unei aplicații mobile pentru control de la distanță.
Adăugarea de senzori pentru monitorizarea nivelului de hrană din recipient.
Implementarea unui sistem de notificări (sunete sau mesaje) pentru avertizarea utilizatorului când recipientul este gol sau în caz de blocaj.
Cod sursă
Jurnal
Etapa 1: Planificare și alegerea componentelor
Alegerea temei: sistem automat de hrănire pentru animale.
Componente selectate: Arduino Uno, motor servo, RTC DS3231, LCD I2C, butoane, container hrană.
Realizarea unei schițe funcționale a sistemului.
Etapa 2: Testarea individuală a componentelor
Testare servo: funcționare corectă în unghiuri diferite.
Testare LCD I2C: afișare cu adresa corectă.
Testare RTC: citirea corectă a timpului.
Etapa 3: Dezvoltarea funcționalității de hrănire programată
Cod pentru verificarea orei curente și activarea servo-ului la ore prestabilite.
Buton pentru hrănire manuală.
Afișarea orei curente pe ecranul LCD.
Etapa 4: Asamblare hardware și integrare finală
Construirea carcasei și montarea containerului.
Organizarea cablajului și alimentării.
Integrarea tuturor componentelor pe placă.
Etapa 5: Testare completă și ajustări
Bibliografie/Resurse
Resurse Hardware
Resurse Software