Differences

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

Link to this comparison view

pm:prj2025:fstancu:stefania.fintina [2025/05/29 22:15]
stefania.fintina [Bibliografie/Resurse]
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` ​                   | 
 + 
 + 
 + 
 + 
 +** 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_WIDTHSCREEN_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 =====
  
Line 198: Line 313:
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
 +[[https://​www.youtube.com/​watch?​v=dqr-AT5HvyM&​list=LL&​index=8]]
 +
 +[[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.1748546156.txt.gz · Last modified: 2025/05/29 22:15 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