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

  • Arduino UNO - Unitatea de control principală a sistemului. Primește date de la modulul RTC și de la butoane, procesează logica de control și acționează servomotorul și afișajul LCD.
  • RTC – DS3231 - Modul de ceas în timp real, care comunică prin I²C și oferă ora exactă necesară pentru programarea hrănirii automate.
  • Ecran LCD 1602 - Afișează informații utile utilizatorului, precum ora următoarei hrăniri sau numărul de porții. Este conectat prin interfața I²C.
  • 3 X Butoane de control - Permit setarea manuală a intervalului de hrănire, selectarea numărului de porții și declanșarea manuală a distribuției de hrană.
  • Servomotor MG995 - Execută comenzile primite sub formă de semnal PWM și rotește elicea pentru a distribui hrana. Fiecare rotație eliberează o porție.
  • Sursă de alimentare (USB / 5V DC) - Oferă energia necesară funcționării tuturor componentelor sistemului.
  • 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.
  • Pâlnie de alimentare - Direcționează hrana introdusă manual în rezervorul principal spre mecanismul de distribuție.

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.
  • Timer de hrănire - Modulul software compară ora curentă cu ora ultimei hrăniri și decide când să declanșeze o nouă eliberare a hranei, în funcție de intervalul setat de utilizator.
  • Interfață utilizator - Componenta logică ce gestionează intrările de la butoane și afișarea informațiilor pe ecran. Asigură o interacțiune intuitivă între utilizator și sistem.
  • Control porții - Modul care determină câte rotații trebuie să efectueze servomotorul, în funcție de numărul de porții selectat. Poate fi activat automat (la ora programată) sau manual (prin apăsarea unui buton dedicat).

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

Vedere frontală: rezervor + bol Ansamblu cu pâlnie și elice 3D LCD cu informații despre hrănire LCD în timpul FEEDING

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

  • <Wire.h> - Folosită pentru comunicarea I2C cu modulul RTC DS3231 și LCD-ul 1602. Biblioteca este standard în ecosistemul Arduino și oferă o interfață simplificată pentru protocoalele hardware.
  • <DS3231.h> - Permite interacțiunea facilă cu modulul de ceas în timp real (RTC). Oferă metode de citire și setare a orei cu precizie ridicată.
  • <LiquidCrystal_I2C.h> - Biblioteca utilizată pentru afișarea datelor pe ecranul LCD 1602 cu interfață I2C. Reduce semnificativ numărul de pini folosiți (SDA + SCL în loc de 6).
  • <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

  • Servomotor:

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;  
  }
  
  • RTC (Real Time Clock):

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.
  • Debounce pentru buton manual:

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ă

Codul sursă complet al proiectului este disponibil în repository-ul GitHub: GitHub Repository - Arduino Pet Feeder

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

  • Testare pe parcursul mai multor zile pentru validarea funcționalității automate.
  • Ajustare unghi servo pentru o distribuție optimă a hranei.

Bibliografie/Resurse

Resurse Hardware

Resurse Software

pm/prj2025/ajipa/denisa.badara.txt · Last modified: 2025/05/26 12:53 by denisa.badara
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