This shows you the differences between two versions of the page.
pm:prj2025:iivasciuc:andrei_razvan.stan [2025/05/14 19:44] andrei_razvan.stan |
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; | ||
- | * 2x Buton simplu; | + | * 3x Buton simplu: |
+ | * Buton CLEAR (sterge expresia) | ||
+ | * Buton TIME (afisează ora curenta) | ||
+ | * Buton HISTORY (afisează istoricul calculelor) | ||
+ | * 3x Rezistenta de 10kΩ; | ||
* 1x Switch On/Off; | * 1x Switch On/Off; | ||
- | * 1x LED; | ||
- | * 2x Rezistena 100 Ω; | ||
* 1x Soclu baterie; | * 1x Soclu baterie; | ||
* 1x Baterie 9V. | * 1x Baterie 9V. | ||
Line 56: | Line 55: | ||
Conectarea se realizeaza in felul urmator: | Conectarea se realizeaza in felul urmator: | ||
\\ | \\ | ||
- | SDA -> A4 de pe Arduino | + | SDA -> SDA de pe Arduino |
\\ | \\ | ||
- | SCL -> A5 de pe Arduino. | + | SCL -> SCL de pe Arduino. |
**Ecranul LCD** este utilizat in proiect pentru a afisa datele. Este conectat in acelasi mod ca si RTC-ul deoarece si acesta foloseste I2C. | **Ecranul LCD** este utilizat in proiect pentru a afisa datele. Este conectat in acelasi mod ca si RTC-ul deoarece si acesta foloseste I2C. | ||
+ | |||
+ | Din moment ce **I2C** este un bus pentru transmisie de date serială master-slave am putut sa conectez **ambele** componente la **aceeasi pini** de pe Arduino. | ||
+ | |||
+ | Adresele pe care le folosesc componentele acestea sunt: | ||
+ | \\ | ||
+ | **0x27** -> LCD | ||
+ | \\ | ||
+ | **0x68** -> RTC | ||
\\ | \\ | ||
Line 68: | Line 75: | ||
Conectarea se realizeaza in felul urmator: | Conectarea se realizeaza in felul urmator: | ||
^ Pinii de pe matrice ^ Pinii de pe arduino| | ^ Pinii de pe matrice ^ Pinii de pe arduino| | ||
- | | C4 | 9 | | + | | C4 | 7 | |
- | | C3 | 8 | | + | | C3 | 6 | |
- | | C2 | 7 | | + | | C2 | 5 | |
- | | C1 | 6 | | + | | C1 | 4 | |
- | | R1 | 5 | | + | | R1 | 11 | |
- | | R2 | 4 | | + | | R2 | 10 | |
- | | R3 | 3 | | + | | R3 | 9 | |
- | | R4 | 2 | | + | | R4 | 8 | |
- | ====Schematic==== | + | ====Schematic pe breadboard==== |
+ | Initital am facut proiectul pe **breadboard** iar acesta este modul in care am legat componentele pe breadboard: | ||
+ | \\ | ||
{{:pm:prj2025:iivasciuc:schematic.png?500|}} | {{:pm:prj2025:iivasciuc:schematic.png?500|}} | ||
+ | ====Schematic final==== | ||
+ | Pentru proiectul final am lipit componentele pe un PCB universal. Conexiunile s-au schimbat din moment ce am mai adaugat componente: | ||
+ | * O baterie; | ||
+ | * Un switch pentru a porni device-ul; | ||
+ | * Un buton pentru functionalitatea de history pe care am uitat sa il adaug initial. | ||
+ | \\ | ||
+ | O alta schimbare este modul in care am conectat matricea de butoane. Am actualizat ulterior tabelul de mai sus cu conexiunile finale. | ||
+ | |||
+ | {{:pm:prj2025:iivasciuc:schematic_lipituri.png?500|}} | ||
+ | |||
+ | \\ | ||
- | ====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]] | ||
- | ===== Software Design ===== | ||
+ | In clipul de mai jos se pot observa toate functinalitatile proiectului si cum opereaza acestea. | ||
+ | \\ | ||
+ | |||
+ | [[https://youtube.com/shorts/yR5kRND0xDA|Clip cu proiectul montat pe PCB universal]] | ||
+ | ===== 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 documente, datasheet-uri, resurse Internet folosite, eventual 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. 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**. | ||
+ | |||
+ | 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> | ||