This shows you the differences between two versions of the page.
pm:prj2024:iotelea:cristina.mitu2512 [2024/05/26 16:58] cristina.mitu2512 [Bibliografie/Resurse] |
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 ===== | ||
+ | |||
+ | 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 |}} | ||
Line 355: | Line 367: | ||
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 ===== | ||
<note tip> | <note tip> | ||
- | Realizarea acestui proiect a fost o experiență extrem de plăcută și interesantă pentru mine. Am avut ocazia să îmbin dragostea mea pentru pisici cu cerințele unei teme academice, ceea ce a dus la crearea unui dispozitiv util și ingenios. Procesul de dezvoltare a fost captivant, deoarece am avut posibilitatea să aplic cunoștințele dobândite la laboratoarele de PM într-un mod practic și relevant. Acest proiect nu este doar o temă de facultate; este un dispozitiv pe care îl voi folosi pentru a-mi hrăni pisica. Faptul că am reușit să creez ceva atât de util și de drag mie îmi aduce o mare bucurie. | + | Realizarea acestui proiect a fost o experiență extrem de plăcută și interesantă pentru mine. Am avut ocazia să îmbin dragostea mea pentru pisici cu cerințele unei teme academice, ceea ce a dus la crearea unui dispozitiv util și ingenios. Procesul de dezvoltare a fost captivant, deoarece am avut posibilitatea să aplic cunoștințele dobândite la laboratoarele de PM într-un mod practic și relevant. Acest proiect nu este doar o temă de facultate; este un dispozitiv pe care îl voi folosi pentru a-mi hrăni pisica. Faptul că am reușit să creez ceva atât de util și de drag mie îmi aduce o mare bucurie. Pe parcursul realizării acestui proiect, m-am confruntat cu câteva probleme legate de designul ușiței dispozitivului. Inițial, am conceput ușița ca fiind un cerc cu un alt cerc decupat în el, prin care mâncarea să iasă. Cu toate acestea, în timpul testelor, am observat că orezul se bloca între decupatură și peretele pâlniei, ceea ce nu era acceptabil. Am testat diferite tipuri de mâncare, precum alune, cereale, orez, ovăz, zahăr și cafea măcinată. Ușița inițială funcționa fără blocări doar cu cafea măcinată, dar nu era textura ideală a mâncării pentru hrănirea pisicii. Pentru a rezolva această problemă, am modificat designul ușiței, transformând-o într-un semicerc. După această modificare, dispozitivul a funcționat fără blocări indiferent de tipul de mâncare utilizat. Această ajustare a fost esențială pentru a asigura funcționarea fiabilă a dispozitivului și pentru a mă asigura că pisica mea primește hrana necesară fără întreruperi. |
</note> | </note> | ||