Differences

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

Link to this comparison view

pm:prj2025:iivasciuc:andrei_razvan.stan [2025/05/18 20:43]
andrei_razvan.stan [Video]
pm:prj2025:iivasciuc:andrei_razvan.stan [2025/05/21 20:58] (current)
andrei_razvan.stan
Line 13: Line 13:
   - inmultire   - inmultire
   - impartire   - impartire
-  - ridicare la putere 
-  - extragerea radacinii patrate. 
- 
-Calculatorul va putea anunta utilizatorul (folosind un buzzer si un led) atunci cand se efectueaza o operatie "​ilegala"​ (ex. impartirea la zero). 
  
 Acesta va mai dispune si de un **istoric** al ultimelor rezultate obtinute (folosind **EEPROM-ul** pe care il are placuta Arduino) si de posibilitatea de a afisa ora si data datorita modulului RTC. Acesta va mai dispune si de un **istoric** al ultimelor rezultate obtinute (folosind **EEPROM-ul** pe care il are placuta Arduino) si de posibilitatea de a afisa ora si data datorita modulului RTC.
 +
 +Acesta va respecta si ordinea efectuarii operatiilor.
  
 ===== Schema Bloc ===== ===== Schema Bloc =====
- +{{:​pm:​prj2025:​iivasciuc:​diagrama_block_stan_andrei.png?300|}}
-{{:​pm:​prj2025:​iivasciuc:​schemablock_stan_andrei.png?400|}}+
 ===== Hardware Design ===== ===== Hardware Design =====
  
 **Piese utilizate** **Piese utilizate**
  
-Componenta in jurul careia se invarte proiectul este o placuta de dezvoltare **Arduino ​Nano cu procesor ATmega328P**.+Componenta in jurul careia se invarte proiectul este o placuta de dezvoltare **Arduino ​UNO cu procesor ATmega328P**.
 \\ \\
  
Line 34: Line 31:
   * 1x Ecran LCD 1602 I2C;   * 1x Ecran LCD 1602 I2C;
   * 1x Matrice de butoane 4x4;   * 1x Matrice de butoane 4x4;
-  * 3x Buton simplu;+  * 3x Buton simplu
 +      * Buton CLEAR (sterge expresia) 
 +      * Buton TIME (afisează ora curenta) 
 +      * Buton HISTORY (afisează istoricul calculelor)
   * 3x Rezistenta de 10kΩ;   * 3x Rezistenta de 10kΩ;
   * 1x Switch On/Off;   * 1x Switch On/Off;
Line 103: Line 103:
 \\ \\
  
-====Video====+====Video ​hardware====
 [[https://​www.youtube.com/​shorts/​2AQYtsneuIg|Dovada ca cele trei componente principale functioneaza]] [[https://​www.youtube.com/​shorts/​2AQYtsneuIg|Dovada ca cele trei componente principale functioneaza]]
  
Line 110: Line 110:
  
 [[https://​youtube.com/​shorts/​yR5kRND0xDA|Clip cu proiectul montat pe PCB universal]] [[https://​youtube.com/​shorts/​yR5kRND0xDA|Clip cu proiectul montat pe PCB universal]]
-===== Software ​Design ​===== +===== Software =====
  
 <note tip> <note tip>
-Descrierea codului aplicaţiei (firmware): +Codul pentru acest proiect a fost scris folosind VsCode si Platformio. 
-  * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) + 
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib) +Am folosit limbajul ​de programare specific Arduino unde am inclus diferite librarii externe pentru comunicarea cu perifericele.
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate+
 </​note>​ </​note>​
  
-===== Rezultate Obţinute ​=====+==== Scurta descriere a functionalitatilor ​==== 
 +=== Calculator === 
 +  * Introdu expresii (ex: ''​3+5*2''​) 
 +  * Apasa ''#''​ pentru a calcula (buton colt dreapta-jos de pe matrice) 
 +  * Rezultatul este afisat si salvat automat în EEPROM.
  
-<note tip> +=== Afisare ora === 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +  * Apasa butonul corespunzator (de pe pinul **2**) 
-</​note>​+  * Se afisează ora, minutul si secunda curente folosind modulul RTC.
  
-===== Concluzii =====+=== Istoric calcule ​=== 
 +  * Apasa butonul corespunzator (de pe pinul **3**) pentru a intra în modul istoric 
 +  * Se pot naviga ultimele 10 rezultate salvate 
 +    * Tasta ''​A''​ de pe matrice – urmatorul rezultat 
 +    * Tasta ''​B''​ de pe matrice – rezultatul precedent.
  
-===== Download =====+=== Ștergere expresie ​=== 
 +  * Apasa butonul corespunzator (de pe pinul **12**) pentru a reseta expresia sau a reveni din alta stare in starea de calculator.
  
-<note warning>​ +==== Librarii incluse ====
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+
  
-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**. +^ Librarie ​              ^ Motivul utilizarii ​                                              ^ Link descarcare ​     ^ 
-</note>+| Wire                   | Comunicare I2C, folosita pentru RTC si LCD                 ​| ​                     | 
 +| LiquidCrystal_I2C ​     | Control LCD 16x2 cu interfata I2C                          | [[https://​www.optimusdigital.ro/​ro/​index.php?controller=attachment&​id_attachment=1115|Link]] ​                   | 
 +| Adafruit_Keypad ​       | Gestionare tastatura matriciala 4x4                        | [[https://​github.com/​adafruit/​Adafruit_Keypad|Link]] ​                    | 
 +| uRTCLib ​               | Comunicare cu modulul RTC DS3231 ​            | [[https://​github.com/​Naguissa/​uRTCLib|Link]] ​                   | 
 +| EEPROM ​(builtin)| Citire si scriere date in EEPROM-ul de pe Arduino pentru functia de istoriei ​     | N/A                    | 
 +| Arduino (builtin) ​     | Functii de baza precum `pinMode`, `digitalRead` etc, specifice Arduino | N/A                  |
  
-===== Bibliografie/​Resurse ===== 
  
-<​note>​ +De asemenea am inclus si **myStack** care este o implementare simpla de stiva pe care am scris-o deoarece limbajul Arduino nu dispune de o implementare de stiva precum C++. 
-Listă ​cu documentedatasheet-uri, resurse Internet folositeeventual grupate ​pe **Resurse Software** şi **Resurse Hardware**.+ 
 +==== Detalierea codului ==== 
 + 
 +=== Variabile constante si globale === 
 + 
 +  * **Keypad**: configurat ​cu pini specifici pentru coloane si randuri 
 +  * **LCD și RTC**: initializati cu adrese I2C 
 +  * **EEPROM**:​ 
 +    * Adresa 0 – indexul actual 
 +    * De la adresa 4 – rezultate salvate (max. 10cate 8 bytes/​float) 
 +  * **Moduri**: enumeratie cu 3 stari – calculator, ceas si istoric 
 +  * **Butoane**:​ pinii pentru butoanele de Clear, History si Time 
 +  * **Flag-uri volatile** pentru intreruperi:​ 
 +    * **timeButtonPressed** 
 +    * **historyButtonPressed** 
 +===Cum se realizeaza evaluarea unei expresii=== 
 +Calculul expresiei introduse de utilizator prin tastatura se face manualfara a folosi o biblioteca de evaluare matematica. In schimbam ales sa folosesc un **algoritm clasic bazat pe doua stive** – una pentru numere si una pentru operatori – pentru a respecta ​**ordinea efectuarii operatiilor**
 + 
 +Practic, functia ​**evaluateExpression** primeste un sir de caractere pe care le parcurge rand pe rand, in urmatorul mod: 
 +  - Se definesc doua stive: 
 +     * ''​values''​ – stiva pentru numere (''​float''​) 
 +     * ''​ops''​ – stiva pentru operatori (''​char''​) 
 +  - Cat timp intalnim un numar sau un '​.'​ acesta este adaugat in buffer-ul num 
 +  - Cand se intalneste un operator, buffer-ul num este transformat in float si este adaugat pe stiva de valori 
 +  - Se compara valoarea de "​precedenta"​ a operatului curent cu cea a operatorului din varful stivei de operatori 
 +     * daca operatorul din stiva are o **valoare mai mare sau egala** se aplica ultimelor doua valori din stiva de valori 
 +     * se repeta acest proces pana cand stiva de operatori este goala sau operatorul curent are o valoare mai mare 
 +  - Rezultatul final este ultimul element din stiva de valori. 
 + 
 +=== Intreruperi === 
 + 
 +  * ISR-urile sunt folosite pentru: 
 +    * Butonul ''​Time''​ (pin 2) 
 +    * Butonul ''​History''​ (pin 3) 
 +  * Seteaza flag-uri volatile care sunt procesate in ''​loop()''​ 
 + 
 +=== Alte functii importante === 
 + 
 +  * **saveToHistory(result)**:​ 
 +    * Salveaza rezultatul in EEPROM 
 +    * Actualizeaza indexul circular în EEPROM 
 + 
 +  * **loadFromHistory(index)**:​ 
 +    * Recupereaza un rezultat salvat din EEPROM 
 + 
 +  * **printTime()**:​ 
 +    * Afisează ora curenta citită din RTC 
 + 
 +  * **showHistory()**:​ 
 +    * Afiseaza rezultatul curent din istoric, indexat de ''​currentHistoryView''​ 
 + 
 +  * **clearCalculator()**:​ 
 +    * Goleste expresia, curata ecranul si revine în modul calculator 
 + 
 +=== Observatii === 
 + 
 +  * Pentru setarea orei initiale, se poate decomenta linia cu ''​rtc.set(...)''​ din ''​setup()'',​ se incarca codul pe placuta, se comenteaza inapoi linia si se incarca din nou codul (pentru ca RTC-ul are o baterie si va '​incrementa'​ singur timpul). Timpul este calculat folosind macro-ul **__TIME__**,​ care ia ora de pe PC.  
 +  * Sistemul gestionează doar expresii fără paranteze deoarece nu mai aveam destui pini digitali pe Arduino sa mai adaug si butoane pentru paranteze. 
 +  * Istoricul este ciclic – la mai mult de 10 calcule, cele vechi sunt suprascrise 
 + 
 +==== Download cod ==== 
 +{{:​pm:​prj2025:​iivasciuc:​proiect_pm_stan_andrei_razvan.zip|}} 
 +===== Rezultate Obţinute ===== 
 + 
 + 
 +<note tip> 
 +Care au fost rezultatele obţinute în urma realizării proiectului vostru.
 </​note>​ </​note>​
 +
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
  
pm/prj2025/iivasciuc/andrei_razvan.stan.1747590184.txt.gz · Last modified: 2025/05/18 20:43 by andrei_razvan.stan
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