This is an old revision of the document!
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ă:
Componente de control și interacțiune:
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ță.
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 5, 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
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 |
https://github.com/stefaniafintina/Cat-Feeder/blob/main/cat_feeder.ino
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.