Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2025:fstancu:stefania.fintina [2025/05/27 17:25]
stefania.fintina [Software Design]
pm:prj2025:fstancu:stefania.fintina [2025/05/30 01:33] (current)
stefania.fintina [Software Design]
Line 63: Line 63:
 4. **Modul microSD (SPI)** 4. **Modul microSD (SPI)**
    ​Legături:​    ​Legături:​
-     * CS → GPIO 15, pin digital liber utilizat ca chip select+     * CS → GPIO 5, pin digital liber utilizat ca chip select
      * MOSI → GPIO 23, pin SPI hardware standard      * MOSI → GPIO 23, pin SPI hardware standard
      * MISO → GPIO 19, pin SPI hardware standard      * MISO → GPIO 19, pin SPI hardware standard
Line 85: Line 85:
       * Un capăt → GND       * Un capăt → GND
       * Celălalt → GPIO 33, pin digital cu INPUT_PULLUP,​ stabil în această configurație       * Celălalt → GPIO 33, pin digital cu INPUT_PULLUP,​ stabil în această configurație
 +   Buton log:
 +      * Un capăt → GND
 +      * Celălalt → GPIO 34, pin digital citit direct (nu suportă INPUT_PULLUP),​ verificat cu gpio_get_level()
 8. **LED-uri (indicatori)** 8. **LED-uri (indicatori)**
    ​Verde:​    ​Verde:​
Line 123: Line 126:
 1. Mediul de dezvoltare 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.+Aplicatia este dezvoltata in Arduino IDE , 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.
  
  
Line 138: Line 141:
 | SPI.h               | Comunicare SPI cu modulul microSD ​                           | | SPI.h               | Comunicare SPI cu modulul microSD ​                           |
 | SD.h                | Scriere si citire fisiere pe cardul microSD ​                 | | SD.h                | Scriere si citire fisiere pe cardul microSD ​                 |
-Adafruit\_GFX.h     ​Functii grafice generice ​pentru ​ecrane (folosita de SSD1306) | +driver/gpio.h       ​Acces direct la registrele GPIO pentru ​citire/​scriere eficienta ​|
-| WiFi.h (optional) ​  | Pentru extinderea ulterioara cu server web local             |+
  
 3. Algoritmi si structuri implementate 3. Algoritmi si structuri implementate
  
-Codul foloseste o structura bazata pe evenimente si verificari ciclice in bucla principala ​(loop), precum si intreruperi hardware+Codul foloseste o structura bazata pe evenimente ​(interuperi hardware) ​si verificari ciclice in bucla principala loop(). 
-Bucla loop() verifica constant ora curenta, starea butoanelor ​si a senzorului ​de vibratii. +Bucla loop() verifica constant
-Hrana este eliberata automat la ore fixe (08:00, 14:00, 20:00pe baza valorii returnate de RTC, corectata cu un offset de +3 ore pentru ora Romaniei+   ​* ​ora curenta ​obtinuta de la RTC (DS3231), 
-Hrana poate fi eliberata si manual, prin apasarea ​unui buton conectat ​la o intrerupere externa ​(attachInterrupt()). +   ​* ​starea butoanelor ​(hranire manuala, reset, afisare log), 
-Evenimentele importante ​(hranire automata/​manuala,​ reset contor, vibratie detectata) ​sunt inregistrate pe cardul ​SD, in fisierul log.txt. +   * semnalul de la senzorul ​de vibratii ​(conectat pe GPIO32). 
-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+Hrana este eliberata automat la orele 08:00, 14:00 si 18:00pe baza valorii returnate de modulul ​RTC.  
-verde: 0–3 hraniri + 
-galben: 4–hraniri +Hrana poate fi eliberata si manual, prin apasarea ​butonului ​conectat ​pe GPIO4. Acesta genereaza ​o intrerupere externa ​configurata cu attachInterrupt(), care seteaza un flag ce este tratat in loop(). 
-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. +Evenimentele importante sunt inregistrate pe cardul ​microSD, in fisierul log.txt. ​Acestea includ: 
-Senzorul de vibratii este verificat ​si, daca detecteaza ​miscari ​(logica ​LOW), se logheaza ​un eveniment corespunzator.+   * hraniri automate si manuale, 
 +   * resetarea contorului de hraniri, 
 +   * detectia vibratiilor (cand pisica interactioneaza cu bolul). 
 + 
 +Display-ul OLED conectat prin I2C afiseaza ora curenta ​sitemporar, mesaje precum "​Contor resetat"​ sau ultimul eveniment logat. 
 + 
 +LED-urile indica nivelul estimativ al rezervorului de mancare: 
 +   * Verde: 0–3 hraniri 
 +   * Galben: 4–hraniri 
 +   * Rosupeste 6 hraniri 
 + 
 +Servo motorul este controlat ​prin PWM pentru a elibera mancarea. Buzzer-ul este controlat prin registre (GPIO.out_w1ts / GPIO.out_w1tc) si emite un sunet scurt la fiecare hranire. 
 + 
 +Senzorul de vibratii este verificat ​periodic. Daca se detecteaza ​vibratii ​(nivel LOW) si a trecut timpul de ignorare (10 secunde dupa hranire), se considera ca pisica a mancat si se logheaza ​evenimentul.
  
  
Line 160: Line 175:
  
 | Functie / Structura ​    | Descriere ​                                                           | | Functie / Structura ​    | Descriere ​                                                           |
-|  ​+| | 
-| `setup()` ​              ​| ​Initializarea componentelor ​hardware si a comunicatiei seriale ​      +| `setup()` ​              ​| ​Initializeaza componentele ​hardware: servo, RTC, SD, OLED, GPIO,     | 
-| `loop()` ​               | Executia ciclica principala; verifica timpulintreruperi, senzori ​  | +|                         | LED-uri, ​si seteaza intreruperile ​                                   ​
-| `getLocalTime()`        Returneaza ora locala prin adaugarea offsetului ​de fus orar          ​+| `loop()` ​               | Executa periodic verificarile:​ ora curentabutoane, senzori, etc.   | 
-| `feed(String source)` ​  ​| ​Executa o secventa completa de hranire (servo, buzzer, ​log, afisare) ​+| `onFeedInterrupt()`     ​Functie ISR pentru tratarea intreruperii ​de la butonul de hranire ​    
-| `resetFeed()` ​          | Reseteaza contorul de hraniri ​si LED-urile ​                          ​+| `feed(String source)` ​  ​| ​Porneste ​servo-ulsuna buzzer-ullogheaza actiunea si actualizeaza | 
-| `updateLEDs()` ​         | Actualizeaza ​LED-ul ​activ in functie de `feedCount                 +|                         | contorul si LED-urile ​                                               ​
-| `logEvent(String ​msg)`  | Scrie un mesaj text in `log.txt` pe cardul SD                        +| `resetFeed()` ​          | Reseteaza contorul de hraniri, actualizeaza ​LED-urile ​si logheaza ​   ​
-| `displayLastFeedTime()` | Afiseaza ora ultimei hraniri ​pe OLED                                 ​+| `updateLEDs()` ​         | Activeaza ​LED-ul ​corespunzator ​in functie de numarul de hraniri ​     | 
-| `displayCurrentTime()`  | Afiseaza ​ora curenta pe OLED, actualizata la fiecare ciclu           | +`displayTime(DateTime)| Afiseaza ora curenta pe OLED sau mesajul temporar de reset           
-`onFeedInterrupt()    | Rutina de tratare a intreruperii pentru butonul de hranire manuala ​  |+| `logSimple(String)` ​    ​| Scrie o intrare ​in `log.txt` ​si verifica scrierea ​pe cardul SD       ​
 +| `showLastLog()`         ​Citeste si afiseaza ultima intrare din `log.txt` ​pe display ​OLED     ​
 +| `printSDLog()`          | Afiseaza ​in consola toate intrarile din `log.txt                   |
  
  
-https://​github.com/​stefaniafintina/​Cat-Feeder/​blob/​main/​cat_feeder/​cat_feeder.ino 
  
  
 +** Notiuni din laborator ** 
  
 +1. **GPIO** (driver/​gpio.h – pentru control pini digitali)
 +
 +<code cpp>​gpio_set_direction((gpio_num_t)BUTTON_FEED,​ GPIO_MODE_INPUT);​
 +gpio_set_pull_mode((gpio_num_t)BUTTON_FEED,​ GPIO_PULLUP_ONLY);​
 +gpio_set_direction((gpio_num_t)BUTTON_RESET,​ GPIO_MODE_INPUT);​
 +gpio_set_pull_mode((gpio_num_t)BUTTON_RESET,​ GPIO_PULLUP_ONLY);​
 +gpio_set_direction((gpio_num_t)BUTTON_LOG,​ GPIO_MODE_INPUT);​
 +
 +gpio_set_direction((gpio_num_t)BUZZER_PIN,​ GPIO_MODE_OUTPUT);​
 +gpio_set_direction((gpio_num_t)VIBRATION_PIN,​ GPIO_MODE_INPUT);​
 +
 +if (!gpio_get_level((gpio_num_t)BUTTON_RESET)) {
 +  resetFeed();​
 +  delay(300);
 +}
 +
 +if (gpio_get_level((gpio_num_t)BUTTON_LOG)) {
 +  showLastLog();​
 +  delay(300);
 +}
 +
 +if (millis() > vibrationIgnoreUntil && !gpio_get_level((gpio_num_t)VIBRATION_PIN)) {
 +  // log event
 +} </​code>​
 +
 +
 +2.  **PWM** (ESP32Servo.h – control servo motor)
 +
 +<code cpp>​servo.setPeriodHertz(50); ​
 +servo.attach(SERVO_PIN,​ 500, 2400); ​
 +servo.write(180); ​
 +delay(500);
 +servo.write(0);</​code>​
 +
 +3. **SPI** (SPI.h + SD.h – pentru cardul microSD)
 +<code cpp>#​include <​SPI.h>​
 +#include <​SD.h>​
 +
 +#define SD_CS 5
 +
 +if (!SD.begin(SD_CS)) Serial.println("​Eroare card SD!");
 +
 +File f = SD.open("/​log.txt",​ FILE_APPEND);​
 +if (f) {
 +  f.println(logEntry);​
 +  f.close();
 +}
 +
 +File fRead = SD.open("/​log.txt"​);​
 +if (fRead) {
 +  while (fRead.available()) {
 +    lastLine = fRead.readStringUntil('​\n'​);​
 +  }
 +  fRead.close();​
 +}
 +</​code>​
 +
 +4.  **I2C** (Wire.h – folosit implicit pentru RTC și OLED)
 +
 +<code cpp>#​include <​Wire.h>​
 +#include <​RTClib.h>​
 +#include <​Adafruit_SSD1306.h>​
 +
 +RTC_DS3231 rtc;
 +Adafruit_SSD1306 display(SCREEN_WIDTH,​ SCREEN_HEIGHT,​ &Wire, OLED_RESET);​
 +
 +if (!rtc.begin()) Serial.println("​Eroare RTC!"​);​
 +if (!display.begin(SSD1306_SWITCHCAPVCC,​ 0x3C)) Serial.println("​Eroare OLED!"​);​
 +
 +DateTime now = rtc.now(); ​
 +display.clearDisplay(); ​  
 +display.setCursor(...); ​  
 +display.println(...); ​    
 +display.display(); ​       ​
 +</​code>​
 +
 +5. **Intreruperi** (hardware interrupt pe butonul de hranire)
 +
 +<code cpp>​volatile bool feedInterrupt = false;
 +
 +void IRAM_ATTR onFeedInterrupt() {
 +  feedInterrupt = true;
 +}
 +
 +attachInterrupt(digitalPinToInterrupt(BUTTON_FEED),​ onFeedInterrupt,​ FALLING);
 +
 +// in loop():
 +noInterrupts();​
 +bool shouldFeed = feedInterrupt;​
 +feedInterrupt = false;
 +interrupts();​
 +
 +if (shouldFeed) {
 +  feed("​manuala"​);​
 +}
 +</​code>​
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +https://​github.com/stefaniafintina/​Cat-Feeder/​blob/​main/​cat_feeder/​cat_feeder.ino
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +
-</note>+
  
-===== Concluzii =====+**Demo**
  
-===== Download ===== 
  
-<note warning> +<html><iframe width="​560"​ height="​315"​ src="​https://www.youtube.com/​embed/​ye6EFscBKPs?​si=YrYVbhwpP93aBfx3"​ title="​YouTube video player"​ frameborder="​0"​ allow="​accelerometerautoplay; clipboard-write; encrypted-media;​ gyroscope; picture-in-picture;​ web-share"​ referrerpolicy="​strict-origin-when-cross-origin"​ allowfullscreen></​iframe></​html>​ 
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectuluisurse, scheme, etcUn fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+===== Concluzii =====
  
-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**. 
-</​note>​ 
  
 ===== Jurnal ===== ===== Jurnal =====
  
-<note tip> +07.05.2025 - Alegerea temei  ​ 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului+ 
-</​note>​+07.05.2025 - Introducere si Descriere generală si Schema Bloc  
 +  
 +15.05.2025 - Completarea secțiunii Hardware Design si Schema electrica  ​ 
 + 
 +18.05.2025 - Scrierea codului
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ +[[https://​www.youtube.com/watch?​v=dqr-AT5HvyM&​list=LL&​index=8]]
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. +
-</note>+
  
-<​html><​a class="media mediafile mf_pdf"​ href="?do=export_pdf">​Export to PDF</​a></​html>​+[[https://​www.youtube.com/​watch?​v=_sKWP6fl-NU&​list=LL&​index=1]]\
  
 +[[https://​www.espressif.com/​sites/​default/​files/​documentation/​esp32-wroom-32_datasheet_en.pdf]]
pm/prj2025/fstancu/stefania.fintina.1748355954.txt.gz · Last modified: 2025/05/27 17:25 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