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/14 19:29]
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 Buzzer; 
-  * 1x LED; 
-  * 2x Rezistena 100 Ω; 
   * 1x Soclu baterie;   * 1x Soclu baterie;
   * 1x Baterie 9V.   * 1x Baterie 9V.
  
-__**Scopul componentelor principale**__+**Bill Of Materials** 
 +^Componenta ^ Link ^ Datasheet| 
 +|DS1302 RTC|[[https://​www.optimusdigital.ro/​en/​others/​12402-ds3231-real-time-clock-module.html?​srsltid=AfmBOopmkMZeV4-FZCyDy8_SjUaOQc-1k9WdPGnW-bVqoksD_p16ygJe|Optimus Digital]] | [[https://​www.alldatasheet.com/​datasheet-pdf/​pdf/​112132/​DALLAS/​DS3231.html|Data Sheet]]| 
 +|Ecran LCD 1602 I2C | [[https://​www.optimusdigital.ro/​en/​lcds/​62-1602-lcd-with-i2c-interface-and-yellow-green-backlight.html?​srsltid=AfmBOoqpLOmi6vXZza4BgUSVOYHer_TC6FXUxnAUITclM47NNBkK-NeB|Optimus Digital]] | [[https://​www.optimusdigital.ro/​en/​index.php?​controller=attachment&​id_attachment=29|Data Sheet]] | 
 +|Matrice de butoane | [[https://​www.optimusdigital.ro/​en/​touch-sensors/​2441-tastatura-matriceala-4x4-cu-butoane.html?​srsltid=AfmBOoquXkP9doiDU_P7bBij3wBugFCPLfQxr3qtqdgL_fq6qkeh1jki|Optimus Digital]] | N\A | 
 +|Arduino UNO cu ATmega328P| [[https://​ardushop.ro/​ro/​plci-de-dezvoltare/​2282-placa-de-dezvoltare-uno-r3-compatibil-arduino-6427854027122.html?​gad_source=1&​gad_campaignid=22058879462&​gbraid=0AAAAADlKU-7PEV5lsPU-XVtSXtrR2XUkh&​gclid=CjwKCAjw_pDBBhBMEiwAmY02Ni-fDSNwR94IQXQGGpUgghYYCcKPG_dzoWQeY7nExf-sxDsO9k4sfRoCw6MQAvD_BwE|ArduShop]] | [[https://​ww1.microchip.com/​downloads/​en/​DeviceDoc/​Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|Data Sheet]]| 
 +|LED, Rezistente, baterie, etc. | [[https://​www.optimusdigital.ro/​ro/​kituri/​12333-kit-plusivo-microcontroller-starter.html?​srsltid=AfmBOoqiwDsr5xIPXY8EME5qtBxUZJOhCOpjLQro_o_gNfLl51qCD-aD|Kit Plusivo]] | N/A| 
 + 
 + 
 +====Detalierea componentelor principale====
  
 **Modului de ceas DS1302 RTC** este folosit pentru functionalitatea calculatorului de a arata ora. Folosind unul dintre cele doua butoane se va putea schimba intre modul de calcul si cel de ceas, care afiseaza informatiile de la RTC. Acest modul este conectat la Arduino folosind I2C. **Modului de ceas DS1302 RTC** este folosit pentru functionalitatea calculatorului de a arata ora. Folosind unul dintre cele doua butoane se va putea schimba intre modul de calcul si cel de ceas, care afiseaza informatiile de la RTC. Acest modul este conectat la Arduino folosind I2C.
Line 48: 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 60: 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 | +| C4 | 
-| C3 | +| C3 | 
-| C2 | +| C2 | 
-| C1 | +| C1 | 
-| R1 | +| R1 | 11 
-| R2 | +| R2 | 10 
-| R3 | +| R3 | 
-| R4 | +| R4 | 
  
  
-====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 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.1747240198.txt.gz · Last modified: 2025/05/14 19:29 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