This is an old revision of the document!


Cat Feeder - FÎNTÎNĂ Ştefania-Maria

Introducere

  • Acest proiect este un dispenser automat de mancare pentru pisici. El elibereaza mancare la ore prestabilite, dar poate permite si hranirea manuala prin butoane, analizează comportamentul pisicii, daca aceasta mananca, si afiseaza informatii despre comportamentul ei. In plus, indica vizual starea rezervorului de mancare prin LED-uri: verde, portocaliu, rosu (gol).
  • Scopul proiectului este de a automatiza procesul de hranire al unei pisici si de a monitoriza consumul de mancare, oferind informatii clare despre obiceiurile alimentare ale pisicii. Datele colectate (ora, prezenta pisicii) sunt salvate pe un card SD, iar ulterior pot fi accesate si afisate intr-o pagina web locala, pentru o vizualizare usoara si centralizata a istoricului alimentar.
  • Ideea a pornit de la nevoia de a hrani pisica chiar si atunci cand nu este nimeni acasa, dar si de a intelege mai bine daca aceasta mananca regulat sau nu.
  • Este util pentru toti cei care au animale de companie si vor sa se asigure ca acestea sunt hranite corect, mai ales cand nu sunt acasa. Un astfel de dispozitiv ii poate ajuta in situatii in care trebuie sa plece si nu gasesc pe nimeni disponibil sa aiba grija de pisica. Acelasi lucru se aplica si in cazul meu, pentru ca am doua pisici si, de fiecare data cand plec de acasa, trebuie sa le duc la parintii mei.

Descriere generală

Placa de dezvoltare ESP32 acționează ca unitate de control principală. Aceasta gestionează toate componentele periferice, inclusiv servo motorul pentru distribuirea hranei, afișajul OLED, buzzer-ul, LED-urile de stare și butoanele de control. De asemenea, comunică cu un modul RTC (ceas în timp real) pentru programarea automată a hrănirii și poate salva evenimentele pe un card SD pentru jurnalizare.

Comunicarea cu afișajul OLED și modulul RTC se face prin protocolul I²C, utilizând pinii hardware ai ESP32. În plus, un senzor de vibrații este utilizat pentru a detecta eventualele mișcări sau lovituri ale hrănitorului, ca formă de interacțiune sau alertă.

Funcționalitate generală:

  • Scopul principal al sistemului este distribuirea automată a hranei la intervale programate, cu posibilitatea hrănirii manuale la cerere. Hrănirea este realizată prin acționarea unui servo motor SG90, care eliberează o cantitate de hrană prestabilită.

Componente de control și interacțiune:

  • Butonul 1 (Hrănire manuală): La apăsare, declanșează imediat ciclul de hrănire. Este utilizat și pentru testare sau completarea unei mese în afara programului.
  • Butonul 2 (Reset counter): Resetează contorul care numără de câte ori a fost activat servo-ul. Acest contor este folosit pentru estimarea nivelului de hrană rămas.
  • 3 LED-uri (Verde, Galben, Roșu): Indicarea nivelului de hrană pe baza contorului:
    • Verde: recipientul este plin (0–2 hrăniri).
    • Galben: nivel mediu (3–5 hrăniri).
    • Roșu: nivel scăzut (peste 6 hrăniri).
  • Buzzer: Oferă feedback sonor pentru hrănire reușită.
    • Senzor de vibrații (SW-420): Detectează lovituri sau mișcări ale dispozitivului.

Alimentare:

Dispozitivul este alimentat dintr-un modul cu 2 baterii Li-Ion 18650 conectate în paralel, printr-un modul TP4056 pentru încărcare și protecție. Tensiunea este stabilizată la 5V cu ajutorul unui modul step-up/down YL-46, care alimentează ESP32 și restul componentelor.

Funcționare:

La pornire, ESP32 inițializează ceasul RTC. La fiecare interval prestabilit sau la apăsarea butonului de hrănire, servo-ul distribuie hrană. După fiecare activare, contorul se incrementează și LED-urile se actualizează. Feedback-ul este oferit atât vizual (LED), cât și auditiv (buzzer). Afișajul OLED arată starea curentă a sistemului și istoricul recent al hrănirilor.

Totodată, interfața web integrată permite monitorizarea obiceiurilor alimentare ale pisicii, oferind o experiență completă și accesibilă de la distanță.

Hardware Design

1. Servomotor SG90

 Legături:
    * Semnal (portocaliu) → GPIO 26, pin PWM hardware, potrivit pentru controlul unui servo, nu interferează cu alte periferice
    * VCC (roșu) → VIN (5V), servo-ul necesită alimentare de 5V
    * GND (negru/maro) → GND

2. Afișaj OLED 0.96” (I2C)

 Legături:
    * SDA → GPIO 21, pin I2C hardware standard
    * SCL → GPIO 22, pin I2C hardware standard
    * VCC → 3.3V, tensiunea recomandată pentru modulul OLED
    * GND → GND

3. RTC DS3231

 Legături:
    * SDA → GPIO 21, partajat cu OLED, I2C permite mai multe dispozitive pe aceiași pini
    * SCL → GPIO 22
    * VCC → 3.3V, compatibil cu ESP32
    * GND → GND

4. Modul microSD (SPI)

 Legături:
   * CS → GPIO 15, pin digital liber utilizat ca chip select
   * MOSI → GPIO 23, pin SPI hardware standard
   * MISO → GPIO 19, pin SPI hardware standard
   * SCK → GPIO 18, pin SPI hardware standard
   * VCC → 3.3V, unele module SD nu au regulator intern
   * GND → GND

5. Senzor de vibrații SW-420

 Legături:
   * DO → GPIO 32, pin digital liber, bun pentru citiri simple
   * VCC → 3.3V, compatibil cu ESP32
   * GND → GND

6. Buzzer activ

 Legături:
    * + → GPIO 27, pin digital folosit pentru semnal simplu HIGH
    * – → GND

7. Butoane

 Buton hrănire:
    * Un capăt → GND
    * Celălalt → GPIO 4, pin digital liber, configurat cu INPUT_PULLUP
 Buton resetare:
    * Un capăt → GND
    * Celălalt → GPIO 33, pin digital cu INPUT_PULLUP, stabil în această configurație

8. LED-uri (indicatori)

 Verde:
    * Anod → GPIO 12, pin digital simplu
    * Catod → GND prin rezistor
 Galben:
    * Anod → GPIO 13, pin digital simplu
    * Catod → GND prin rezistor
 Roșu:
    * Anod → GPIO 14, pin digital simplu
    * Catod → GND prin rezistor

Software Design

1. Mediul de dezvoltare

Aplicatia este dezvoltata in Arduino IDE , un mediu de dezvoltare compatibil cu platforma ESP32 DevKit v1, utilizata in proiect. Codul este scris in limbajul C++, iar incarcarea pe placa se realizeaza prin port USB. Serial Monitor-ul este folosit pentru debug si afisarea mesajelor in timpul executiei.

2. Librarii si surse third-party utilizate

Biblioteca Scop
Wire.h Comunicare I2C cu RTC si display OLED
ESP32Servo.h Controlul servo motorului prin PWM specific ESP32
RTClib.h Gestionarea modulului RTC DS3231 (ora si data)
Adafruit\_SSD1306.h Afisare text pe display OLED monocrom
SPI.h Comunicare SPI cu modulul microSD
SD.h Scriere si citire fisiere pe cardul microSD
Adafruit\_GFX.h Functii grafice generice pentru ecrane (folosita de SSD1306)
WiFi.h (optional) Pentru extinderea ulterioara cu server web local

3. Algoritmi si structuri implementate

Codul foloseste o structura bazata pe evenimente si verificari ciclice in bucla principala (loop), precum si intreruperi hardware. Bucla loop() verifica constant ora curenta, starea butoanelor si a senzorului de vibratii. Hrana este eliberata automat la ore fixe (08:00, 14:00, 20:00) pe baza valorii returnate de RTC, corectata cu un offset de +3 ore pentru ora Romaniei. Hrana poate fi eliberata si manual, prin apasarea unui buton conectat la o intrerupere externa (attachInterrupt()). Evenimentele importante (hranire automata/manuala, reset contor, vibratie detectata) sunt inregistrate pe cardul SD, in fisierul log.txt. Display-ul OLED afiseaza ora ultimei hraniri si ora curenta, actualizata in fiecare secunda. LED-urile indica nivelul estimativ al rezervorului de mancare in functie de numarul de hraniri: verde: 0–3 hraniri galben: 4–5 hraniri rosu: 6–7 hraniri Servo motorul este controlat pentru a elibera mancarea (deschidere si revenire), iar buzzer-ul emite un semnal sonor la fiecare hranire. Senzorul de vibratii este verificat si, daca detecteaza miscari (logica LOW), se logheaza un eveniment corespunzator.

4. Surse si functii implementate

Functie / Structura Descriere
`setup()` Initializarea componentelor hardware si a comunicatiei seriale
`loop()` Executia ciclica principala; verifica timpul, intreruperi, senzori
`getLocalTime()` Returneaza ora locala prin adaugarea offsetului de fus orar
`feed(String source)` Executa o secventa completa de hranire (servo, buzzer, log, afisare)
`resetFeed()` Reseteaza contorul de hraniri si LED-urile
`updateLEDs()` Actualizeaza LED-ul activ in functie de `feedCount`
`logEvent(String msg)` Scrie un mesaj text in `log.txt` pe cardul SD
`displayLastFeedTime()` Afiseaza ora ultimei hraniri pe OLED
`displayCurrentTime()` Afiseaza ora curenta pe OLED, actualizata la fiecare ciclu
`onFeedInterrupt()` Rutina de tratare a intreruperii pentru butonul de hranire manuala

Rezultate Obţinute

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

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.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2025/fstancu/stefania.fintina.1748545652.txt.gz · Last modified: 2025/05/29 22:07 by stefania.fintina
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