This shows you the differences between two versions of the page.
pm:prj2025:iivasciuc:andrei_razvan.stan [2025/05/20 22:19] andrei_razvan.stan |
pm:prj2025:iivasciuc:andrei_razvan.stan [2025/05/21 20:58] (current) andrei_razvan.stan |
||
---|---|---|---|
Line 125: | Line 125: | ||
=== Afisare ora === | === Afisare ora === | ||
- | * Apasa butonul corespunzator | + | * Apasa butonul corespunzator (de pe pinul **2**) |
* Se afisează ora, minutul si secunda curente folosind modulul RTC. | * Se afisează ora, minutul si secunda curente folosind modulul RTC. | ||
=== Istoric calcule === | === Istoric calcule === | ||
- | * Apasa butonul corespunzator pentru a intra în modul istoric | + | * Apasa butonul corespunzator (de pe pinul **3**) pentru a intra în modul istoric |
* Se pot naviga ultimele 10 rezultate salvate | * Se pot naviga ultimele 10 rezultate salvate | ||
* Tasta ''A'' de pe matrice – urmatorul rezultat | * Tasta ''A'' de pe matrice – urmatorul rezultat | ||
Line 135: | Line 135: | ||
=== Ștergere expresie === | === Ștergere expresie === | ||
- | * Apasa butonul ''Clear'' pentru a reseta expresia sau a reveni din alta stare in starea de calculator. | + | * Apasa butonul corespunzator (de pe pinul **12**) pentru a reseta expresia sau a reveni din alta stare in starea de calculator. |
==== Librarii incluse ==== | ==== Librarii incluse ==== | ||
Line 150: | Line 150: | ||
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++. | 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++. | ||
- | ===== Rezultate Obţinute ===== | + | ==== Detalierea codului ==== |
- | <note tip> | + | === Variabile constante si globale === |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | |
- | </note> | + | |
- | ===== Concluzii ===== | + | * **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. 10, cate 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 manual, fara a folosi o biblioteca de evaluare matematica. In schimb, am ales sa folosesc un **algoritm clasic bazat pe doua stive** – una pentru numere si una pentru operatori – pentru a respecta **ordinea efectuarii operatiilor**. | ||
- | ===== Download ===== | + | 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. | ||
- | <note warning> | + | === Intreruperi === |
- | 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**. | + | * ISR-urile sunt folosite pentru: |
- | </note> | + | * Butonul ''Time'' (pin 2) |
+ | * Butonul ''History'' (pin 3) | ||
+ | * Seteaza flag-uri volatile care sunt procesate in ''loop()'' | ||
- | ===== Bibliografie/Resurse ===== | + | === Alte functii importante === |
- | <note> | + | * **saveToHistory(result)**: |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * 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> | ||