This shows you the differences between two versions of the page.
pm:prj2024:iotelea:cristina.mitu2512 [2024/05/26 17:33] cristina.mitu2512 [Rezultate Obţinute] |
pm:prj2024:iotelea:cristina.mitu2512 [2024/05/26 22:48] (current) cristina.mitu2512 [Rezultate Obţinute] |
||
---|---|---|---|
Line 105: | Line 105: | ||
RTC_DS3231 rtc; | RTC_DS3231 rtc; | ||
- | const int buttonPin = A3; // Pinul la care este conectat butonul | + | const int buttonPin = A3; // Pinul la care este conectat butonul |
- | int buttonState = 0; // Variabila pentru a stoca starea butonului (apasat sau nu) | + | int buttonState = 0; // Variabila pentru a stoca starea butonului (apasat sau nu) |
- | bool showMenu = false; | + | bool showMenu = false; // Dacă este true se afișează meniul |
- | boolean feed = false; | + | boolean feed = false; // Dacă a fost ales meniul A true, altfel false |
int feedingHour = -1; | int feedingHour = -1; | ||
int feedingMinute = -1; | int feedingMinute = -1; | ||
int menuSelected = 0; // 0 = Niciun meniu, 1 = Meniu B dieta, 2 = Meniu C normal, 3 = Meniu A | int menuSelected = 0; // 0 = Niciun meniu, 1 = Meniu B dieta, 2 = Meniu C normal, 3 = Meniu A | ||
- | int presetFeedingTimes[3][3]; // Ora și minutul pentru hrănirile prestabilite | + | int presetFeedingTimes[3][3]; // Ora, minut, secundă pentru hrănirile prestabilite |
- | bool butB = false; | + | bool butB = false; // Dacă a fost ales meniul B true, altfel false |
- | bool butC = false; | + | bool butC = false; // Dacă a fost ales meniul C true, altfel false |
</code> | </code> | ||
* **in setup():** Inițializez comunicarea I2C, necesară pentru interacțiunea cu ceasul în timp real (RTC) și display-ul LCD. Apoi, configurez display-ul LCD pentru a afișa informații, iar iluminarea de fundal este activată pentru o vizibilitate mai bună. Atașez servomecanismul la pinul specificat pentru a permite controlul său. De asemenea, stabilesc orele, minutele și secundele pentru hrănirile prestabilite, care sunt stocate într-o matrice. Apoi, verific și inițializez modulul RTC, iar dacă acesta nu poate fi accesat, se afișează un mesaj de eroare pe display. La final, configurez pinul butonului ca intrare, pentru a permite detectarea apăsărilor butonului și interacțiunea cu sistemul în timpul rulării programului. | * **in setup():** Inițializez comunicarea I2C, necesară pentru interacțiunea cu ceasul în timp real (RTC) și display-ul LCD. Apoi, configurez display-ul LCD pentru a afișa informații, iar iluminarea de fundal este activată pentru o vizibilitate mai bună. Atașez servomecanismul la pinul specificat pentru a permite controlul său. De asemenea, stabilesc orele, minutele și secundele pentru hrănirile prestabilite, care sunt stocate într-o matrice. Apoi, verific și inițializez modulul RTC, iar dacă acesta nu poate fi accesat, se afișează un mesaj de eroare pe display. La final, configurez pinul butonului ca intrare, pentru a permite detectarea apăsărilor butonului și interacțiunea cu sistemul în timpul rulării programului. | ||
Line 124: | Line 124: | ||
servo1.attach(servoPin); | servo1.attach(servoPin); | ||
- | presetFeedingTimes[0][0] = 20; // Prima ora de hrănire prestabilită | + | presetFeedingTimes[0][0] = 20; // Prima ora de hrănire prestabilită |
- | presetFeedingTimes[0][1] = 44; // Minutul | + | presetFeedingTimes[0][1] = 44; // Minutul |
- | presetFeedingTimes[0][2] = 0; | + | presetFeedingTimes[0][2] = 0; // Secunda |
- | presetFeedingTimes[1][0] = 20; // A doua ora de hrănire prestabilită | + | presetFeedingTimes[1][0] = 20; // A doua ora de hrănire prestabilită |
- | presetFeedingTimes[1][1] = 44; // Minutul | + | presetFeedingTimes[1][1] = 44; |
presetFeedingTimes[1][2] = 20; | presetFeedingTimes[1][2] = 20; | ||
- | presetFeedingTimes[2][0] = 20; // A treia ora de hrănire prestabilită | + | presetFeedingTimes[2][0] = 20; // A treia ora de hrănire prestabilită |
- | presetFeedingTimes[2][1] = 44; // Minutul | + | presetFeedingTimes[2][1] = 44; |
presetFeedingTimes[2][2] = 35; | presetFeedingTimes[2][2] = 35; | ||
| | ||
Line 252: | Line 252: | ||
lcd.print(now.year()); | lcd.print(now.year()); | ||
- | // Verifică dacă este ora de hrănire setată | + | // Verifică dacă este ora de hrănire setată pentru meniul A |
if (now.hour() == feedingHour && now.minute() == feedingMinute && feed) { | if (now.hour() == feedingHour && now.minute() == feedingMinute && feed) { | ||
servo1.write(-90); | servo1.write(-90); | ||
Line 261: | Line 261: | ||
feed = false; // Dezactivează hrănirea după efectuare | feed = false; // Dezactivează hrănirea după efectuare | ||
} | } | ||
+ | // Dacă a fost ales meniul B | ||
if (butB == true) { | if (butB == true) { | ||
int i; | int i; | ||
Line 277: | Line 278: | ||
} | } | ||
} | } | ||
+ | // Dacă a fost ales meniul C | ||
if (butC == true) { | if (butC == true) { | ||
int i; | int i; | ||
Line 313: | Line 315: | ||
lcd.clear(); | lcd.clear(); | ||
- | lcd.setCursor(0,0); | + | lcd.setCursor(0, 0); |
lcd.print("Set feeding Time"); | lcd.print("Set feeding Time"); | ||
- | lcd.setCursor(0,1); | + | lcd.setCursor(0, 1); |
lcd.print("HH:MM"); | lcd.print("HH:MM"); | ||
- | lcd.setCursor(0,2); | + | lcd.setCursor(0, 2); |
while(1){ | while(1){ | ||
key = keypad.getKey(); | key = keypad.getKey(); | ||
if(key >= '0' && key <= '9'){ // Acceptă doar cifre | if(key >= '0' && key <= '9'){ // Acceptă doar cifre | ||
- | lcd.setCursor(j,2); | + | lcd.setCursor(j, 2); |
lcd.print(key); | lcd.print(key); | ||
r[i] = key - '0'; // Convertește tasta apăsată la valoare numerică | r[i] = key - '0'; // Convertește tasta apăsată la valoare numerică | ||
Line 348: | Line 350: | ||
</code> | </code> | ||
+ | //Funcționalități din laborator// | ||
+ | |||
+ | Proiectul integrează mai multe noțiuni fundamentale învățate în laboratoare, cum ar fi utilizarea ADC, I2C, Keypad, RTC și Servo. | ||
+ | * //Analog Digital Converter (ADC):// Codul utilizează ADC pentru a citi starea butonului conectat la pinul analogic A3, permițând detectarea interacțiunilor utilizatorului. | ||
+ | * //I2C (Inter-Integrated Circuit):// Protocolul I2C este utilizat pentru comunicarea cu afișajul LCD și modulul RTC (Real-Time Clock). Funcțiile Wire.begin(), lcd.begin(), și rtc.begin() permit afișarea informațiilor în timp real despre starea sistemului și timpul actual. | ||
+ | * //Keypad:// Utilizarea bibliotecii Keypad pentru a citi input-ul de la o tastatură matricială. Funcția keypad.getKey() permite citirea tastelor apăsate, esențială pentru interacțiunea utilizatorului cu sistemul. | ||
+ | * //RTC (Real-Time Clock):// Modulul RTC DS3231 este utilizat pentru a menține și afișa data și ora curente. Funcția rtc.now() este folosită pentru a obține timpul actual, esențial pentru funcționalitatea de hrănire la ore prestabilite. | ||
+ | * //Servo:// Biblioteca Servo este utilizată pentru a controla un servo motor. Funcțiile servo1.attach(servoPin) și servo1.write(angle) permit controlul precis al poziției servo-ului, esențial pentru mecanismul de distribuire a hranei. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | Motanul meu, Oscar, este fericit în interior, chiar dacă nu își arată entuziasmul..:-D | + | Cu toate că Oscar, motanul meu, nu pare să fie impresionat de proiect, știu că are o latură entuziasmată pe care o păstrează pentru el.:-D |
{{ :pm:prj2024:iotelea:proiect_oscar.png |}} | {{ :pm:prj2024:iotelea:proiect_oscar.png |}} | ||
<note tip> | <note tip> | ||
https://youtu.be/IaUBfM3O-8s | https://youtu.be/IaUBfM3O-8s | ||
</note> | </note> | ||
+ | **//Rezumat video://** | ||
+ | |||
+ | Inițial, am selectat tasta 'C' pentru a seta meniul normal, cu orele prestabilite la 16:04:00, 16:04:20 și 16:04:35. În timp ce așteptam să se facă orele respective, am vrut să testez și alte funcționalități ale sistemului. Pentru a verifica dacă ecranul afișează mesajele corecte, am selectat un alt meniu la întâmplare. Am vrut să mă asigur că mesajul "Ai introdus deja un meniu!" apare pe ecran atunci când se încearcă setarea unui meniu nou după ce unul este deja activ. Exact așa s-a întâmplat: ecranul a afișat corect mesajul, indicând că nu pot seta un alt meniu până nu îl șterg pe cel actual. Apoi, am ales o tasta la întâmplare, alta decât cele specifice meniului, pentru a testa cum se comportă sistemul. După apăsarea tastei necorespunzătoare, ecranul a afișat mesajul "Tasta invalida!", confirmând că programul recunoaște și gestionează corect inputurile incorecte. La ora 16:04:00, sistemul a început să execute meniul 'C'. Conform specificațiilor, meniul 'C' face două ture pentru fiecare oră prestabilită, rotind servomecanismul cu -90 de grade și apoi înapoi la 90 de grade. Această secvență s-a repetat și la 16:04:20 și 16:04:35, confirmând că funcția a fost implementată corect. După ce aceste ore au trecut și meniul 'C' și-a încheiat ciclul, am introdus meniul 'A'. Pentru acesta, a trebuit să aleg ora de hrănire manual, introducând-o prin keypad. Am setat ora la 16:05, iar sistemul a acceptat și afișat noua oră corect. Ulterior, am ales meniul 'B' și am vrut să testez funcția de ștergere a meniului. Am apăsat tasta 'D', iar ecranul a afișat mesajul "Meniul a fost sters!", indicând că toate meniurile active au fost resetate și sistemul este pregătit pentru o nouă selecție. | ||
===== Concluzii ===== | ===== Concluzii ===== |