Differences

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

Link to this comparison view

pm:prj2023:alucaci:calculator-de-buzunar [2023/05/19 13:20]
costin.deonise [Descriere generală]
pm:prj2023:alucaci:calculator-de-buzunar [2023/05/19 16:14] (current)
alexandru.iercosan
Line 5: Line 5:
 GRUPA: 332CC GRUPA: 332CC
 </​code>​ </​code>​
- 
-<note tip> 
  
 Proiectul "​Calculator de buzunar"​ este un dispozitiv calculator construit cu ajutorul platformei de dezvoltare Arduino, care poate efectua operații matematice de bază precum adunarea, scăderea, înmulțirea și împărțirea a două numere. Scopul proiectului este de a arăta cum Arduino poate fi folosit pentru a construi dispozitive electronice utile, precum și pentru a încuraja oamenii să își îmbunătățească abilitățile în domeniul programării și ingineriei. Proiectul "​Calculator de buzunar"​ este un dispozitiv calculator construit cu ajutorul platformei de dezvoltare Arduino, care poate efectua operații matematice de bază precum adunarea, scăderea, înmulțirea și împărțirea a două numere. Scopul proiectului este de a arăta cum Arduino poate fi folosit pentru a construi dispozitive electronice utile, precum și pentru a încuraja oamenii să își îmbunătățească abilitățile în domeniul programării și ingineriei.
Line 15: Line 13:
  
  
-</​note>​+
 ===== Descriere generală ===== ===== Descriere generală =====
  
-<note tip>+
 Proiectul "​Calculator de buzunar"​ este format dintr-un hardware și un software care lucrează împreună pentru a efectua operațiile matematice de bază. Scopul său este de a permite utilizatorului să efectueze operații matematice de bază, cum ar fi adunare, scădere, înmulțire și împărțire,​ folosind o tastatură numerică și un display LCD. Proiectul "​Calculator de buzunar"​ este format dintr-un hardware și un software care lucrează împreună pentru a efectua operațiile matematice de bază. Scopul său este de a permite utilizatorului să efectueze operații matematice de bază, cum ar fi adunare, scădere, înmulțire și împărțire,​ folosind o tastatură numerică și un display LCD.
  
Line 33: Line 31:
 {{:​pm:​prj2023:​alucaci:​schema.jpg?​300|}} {{:​pm:​prj2023:​alucaci:​schema.jpg?​300|}}
  
-</​note>​+
  
 ===== Hardware Design ===== ===== Hardware Design =====
  
-<note tip> +Proiectul ​de hardware pentru acest calculator simplu constă în utilizarea următoarelor componente: 
-Lista de piese necesare+ 
-  ​Arduino ​UNO; +  ​Arduino ​Uno: Este placa de dezvoltare pe care se bazează proiectul. Arduino Uno este echipat cu un microcontroler ATmega328P și oferă numeroase pini de intrare/​ieșire digitali și analogici pentru conectarea și controlul componentelor externe. 
-  ​* ecran LCD; +  ​- Display ​LCD: Se utilizează un display LCD alfanumeric,​ care afișează numerele și rezultatele operațiilor. Acesta este conectat la Arduino Uno utilizând protocolul I2C (Inter-Integrated Circuit), ceea ce permite transferul datelor pe doar două linii de conexiune. 
-  ​* tastatura cu membrana ​4x4.+  ​- Tastatură numerică: Se utilizează o tastatură numerică matriceală ​4x4, care oferă butoane pentru cifrele de la 0 la 9, precum și pentru operațiile matematice (adunare, scădere, înmulțire,​ împărțire sau paranteză rotundă deschisă, paranteză rotundă închisă, sin și cos). Tastatura este conectată la Arduino Uno prin intermediul piniilor digitali. 
 + 
 +Conectori și cabluri: Pentru conectarea componentelor între ele și la Arduino Uno, sunt utilizate fire jumper și conectori adecvați. Acestea asigură conexiunea electrică corectă și stabilă între componentele proiectului. 
 + 
 +În ceea ce privește designul hardware, se poate utiliza o placă de conexiune sau o placă de prototipare pentru a organiza componentele într-o configurație ordonată. Arduino Uno este plasat în centrul designului, cu display-ul LCD montat deasupra sau deasupra lui, pentru a permite utilizatorului să vadă rezultatele afișate. Tastatura numerică poate fi plasată într-o poziție convenabilă pentru a permite introducerea ușoară a numerelor și operațiilor. 
 + 
 +De asemenea, este important să se ia în considerare alimentarea proiectului. Arduino Uno poate fi alimentat fie prin intermediul unui cablu USB conectat la un computer sau printr-un adaptor de alimentare extern. 
 + 
 +În final, designul hardware al acestui calculator simplu implică organizarea componentelor (Arduino Uno, display LCD, tastatură numerică) într-un mod practic și accesibil, astfel încât utilizatorul să poată interacționa ușor cu calculatorul și să vadă rezultatele afișate pe display.
   ​   ​
-</​note>​+
  
 ===== Software Design ===== ===== Software Design =====
  
  
-<note tip> + 
-Descrierea codului aplicaţiei ​(firmware): +Codul este pentru o simplă calculatoare care poate efectua operații de bază precum adunare, scădere, înmulțire,​ împărțire,​ sinus și cosinus. Codul utilizează o tastatură pentru introducerea numerelor și operatorilor și un afișaj LCD pentru a afișa intrarea și rezultatul. 
-  * mediu de dezvoltare ​(if any) (e.gAVR StudioCodeVisionAVR+ 
-  * librării şsurse 3rd-party (e.gProcyon AVRlib+Mediul de dezvoltare specific este Arduino IDE 2.1.0. Se utilizează bibliotecile "​Keypad.h",​ "​LiquidCrystal_I2C.h"​ și "​StackArray.h"​ pentru funcționalitățile cheii, afișajului LCD și stiva de numere. Aceste biblioteci pot fi biblioteci terțe sau pot face parte dintr-un set de biblioteci personalizate. 
-  ​* algoritmi şstructuri pe care plănuiţi să le implementaţ+ 
-  * (etapa 3surse şfuncţii implementate +Algoritmul utilizat pentru evaluarea expresiei este algoritmul Shunting Yard, care se bazează pe o abordare bazată pe stivă. Expresia este evaluată folosind o stivă de numere și o stivă de operatori. În timpul evaluării, se aplică reguli de precedență pentru a determina ordinea corectă a operațiilor. Algoritmul parsează fiecare caracter al expresiei și îl evaluează în funcție de tipul său (număr, operator sau funcție trigonometrică). Rezultatul final este returnat ca rezultatul expresiei evaluate. 
-</note>+ 
 +Codul include, ​de asemenea, funcții auxiliare pentru inițializarea și afișarea rezultatului pe afișajul LCD. 
 + 
 + 
 +**Funcția loop()** este bucla principală a programului și se execută în mod repetat. Aceasta gestionează intrarea și ieșirea calculatorului. 
 + 
 +  - key = kpd.getKey():​ Această instrucțiune primește valoarea tastei apăsate pe tastatură și o stochează în variabila key. 
 +  - if (key != NO_KEYDetectButtons();: Această condiție verifică dacă a fost apăsată o tastă pe tastaturăDacă da, se apelează funcția DetectButtons() pentru a trata apăsarea tastelor. 
 +  - if (result == true) answer = evaluateExpression(inputExpression);:​ Această condiție verifică dacă rezultatul calculului este disponibil. Dacă dase apelează funcția evaluateExpression(inputExpressionpentru a evalua expresia introdusă și se stochează rezultatul în variabila answer. 
 +  ​- DisplayResult():​ Această instrucțiune afișează rezultatul pe ecranul LCD, utilizând funcția DisplayResult(). 
 + 
 +**Funcția DetectButtons()** detectează și gestionează apăsările tastelor în program. Iată o descriere mai concisă a funcționării
 + 
 +  - Se șterge conținutul ecranului LCD. 
 +  - Se verifică apăsarea butonului "​Shift"​. Dacă este apăsat, se schimbă starea butonului șse afișează funcțiile asociate pe LCD. 
 +  ​Se verifică apăsarea numerelor de la 0 la 9Numărul apăsat este adăugat la expresia de intrare. 
 +  - Se verifică apăsarea butonului "#"​ (egal). Se salvează ultimul număr apăsat și se setează un indicator de rezultat. 
 +  ​- Se verifică apăsarea butoanelor A, B, C, D în funcție de starea butonului "​Shift"​. Corespunzător butonului apăsat, se adaugă operatori sau funcții în expresia de intrare. 
 +  - Dacă butonul "#"​ este apăsat de două ori consecutiv, se șterge conținutul ecranului LCD șse resetează expresia și numărul. 
 +  - Numărul curent se resetează la zero după adăugarea sa în expresia de intrare, cu excepția cazului în care este apăsat butonul "#"​. 
 + 
 +**Funcția evaluateExpression()** evaluează o expresie matematică dată șreturnează rezultatul. Iată o descriere concisă a funcționării:​ 
 + 
 +  - Se declară două stive: numberStack pentru a stoca numere și operatorStack pentru a stoca operatori. 
 +  - Se parcurge fiecare caracter din expresie. 
 +  - Dacă caracterul este o cifră sau punctul zecimal, se construiește numărul curent prin multiplicarea numărului anterior cu 10 și adăugarea cifrei curente. 
 +  - Dacă caracterul nu este o cifră, se verifică tipul acestuia. 
 +  - Dacă este '​(',​ se adaugă la stiva operatorStack. 
 +  - Dacă este '​)',​ se evaluează vârful stivelor numberStack și operatorStack până când se întâlnește '​('​ și se elimină '​('​ din stiva operatorStack. 
 +  - Dacă este '​+',​ '​-',​ '​*',​ '/'​ se evaluează vârful stivelor numberStack și operatorStack în funcție de precedența operatorului curent. 
 +  - Dacă este 's' sau '​c',​ se adaugă la stiva operatorStack (pentru funcțiile sin școs). 
 +  ​- Dacă ultimul caracter evaluat este o cifră, se adaugă numărul final la stiva numberStack. 
 +  - Se evaluează restul operatorilor din stiva operatorStack prin apelul funcției evaluateTop(). 
 +  - Dacă stiva numberStack este goală, se returnează 0.0 (expresia era invalidă sau goală). 
 +  - Se returnează rezultatul final, care este vârful stivei numberStack. 
 + 
 +**Funcția evaluateTop()** evaluează vârful stivelor numberStack șoperatorStack și realizează operații aritmetice sau calculează funcțiile trigonometrice. Iată o descriere concisă a funcționării:​ 
 + 
 +  - Se declară o variabilă result pentru a stoca rezultatul evaluării și se extrage operatorul din stiva operatorStack prin apelul funcției pop(). 
 +  - Dacă operatorul este '​+',​ '​-',​ '​*',​ '/' se extrag cele două numere din stiva numberStack și se realizează operația aritmetică corespunzătoare. Rezultatul este stocat în variabila result. 
 +  - Dacă operatorul este '​s',​ se extrage numărul din vârful stivei numberStack și se calculează sinusul acestuia (convertind gradele în radiani). Rezultatul este stocat în variabila result. 
 +  - Dacă operatorul este '​c',​ se extrage numărul din vârful stivei numberStack și se calculează cosinusul acestuia (convertind gradele în radiani). Rezultatul este stocat în variabila result. 
 +  - Rezultatul calculat este adăugat înapoi în stiva numberStack prin apelul funcției push(). 
 + 
 + 
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> + 
-Care au fost rezultatele obţinute în urma realizării proiectului ​vostru+În urma realizării proiectului, s-au obținut următoarele rezultate:​ 
-</​note>​+ 
 +  - S-a implementat un calculator simplu care poate efectua operații de bază precum adunare, scădere, înmulțire,​ împărțire,​ sin și cos. 
 +  - Calculatorul utilizează un keypad pentru introducerea numerelor și operatorilor,​ precum și un ecran LCD pentru afișarea intrării și a rezultatului. 
 +  - Codul este împărțit în trei funcții principale: setup(), loop() și evaluateExpression(). 
 +  - Funcția setup() inițializează keypad-ul și ecranul LCD. 
 +  - Funcția loop() este apelată în mod repetat și se ocupă de intrarea și ieșirea calculatorului. 
 +  - Funcția evaluateExpression() evaluează expresia introdusă și returnează rezultatul. 
 +  - S-au utilizat bibliotecile Keypad, LiquidCrystal_I2C și StackArray pentru funcționalitățile specifice. 
 +  - Calculatorul poate manipula numere întregi și numere cu zecimale. 
 +  - S-a implementat algoritmul shunting-yard și o abordare bazată pe stivă pentru evaluarea expresiilor matematice. 
 +  - Operatorii și funcțiile sunt evaluate în funcție de precedența lor. 
 +  - Expresiile matematice pot include paranteze și funcții trigonometrice. 
 +  - Rezultatul este afișat pe ecranul LCD
  
 ===== Concluzii ===== ===== Concluzii =====
 +
 +Proiectul "​Calculator de buzunar"​ implementează o aplicație simplă de calculator capabilă să efectueze operații de bază precum adunare, scădere, înmulțire,​ împărțire,​ sinus și cosinus. Aceasta utilizează un keypad pentru introducerea numerelor și operatorilor,​ iar rezultatele sunt afișate pe un display LCD.
 +
 +Codul este structurat în trei funcții principale:
 +
 +setup(): Această funcție initializează keypad-ul și display-ul LCD.
 +loop(): Această funcție este apelată în mod repetat și se ocupă de intrarea și ieșirea calculatorului.
 +evaluateExpression():​ Această funcție evaluează expresia introdusă și returnează rezultatul.
 +Proiectul folosește bibliotecile Keypad și LiquidCrystal_I2C pentru gestionarea keypad-ului și a display-ului LCD, respectiv biblioteca StackArray pentru a implementa o stivă de numere.
 +
 +Funcția DetectButtons() se ocupă de gestionarea apăsărilor de butoane de pe keypad, inclusiv operatorii, cifrele și funcțiile trigonometrice. Ea actualizează expresia introdusă și setează flag-uri corespunzătoare pentru evaluarea ulterioară a expresiei și afișarea rezultatului.
 +
 +Funcția evaluateExpression() evaluează expresia introdusă utilizând algoritmul Shunting Yard și o abordare bazată pe stivă. Aceasta descompune expresia în numere și operatori, apoi efectuează operațiile corespunzătoare pe stivă pentru a calcula rezultatul.
 +
 +Funcțiile precedence() și evaluateTop() ajută la evaluarea expresiei și la efectuarea operațiilor matematice sau trigonometrice.
 +
 +Funcția DisplayResult() se ocupă de afișarea rezultatului pe display-ul LCD, inclusiv expresia introdusă și rezultatul calculat.
 +
 +În concluzie, acest proiect implementează un calculator simplu de buzunar care poate efectua operații matematice de bază și funcții trigonometrice. Este o aplicație practică și utilă pentru utilizatorii care doresc să efectueze calcule rapide și ușoare. Cu toate acestea, acest calculator are o funcționalitate limitată și nu suportă operații avansate sau funcții matematice complexe.
  
 ===== Download ===== ===== Download =====
  
-<note warning> 
-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**+{{:pm:prj2023:alucaci:deonise_alex_332cc.zip|}} 
-</​note>​+
  
 ===== Jurnal ===== ===== Jurnal =====
  
-<note tip> + 
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului+{{:​pm:​prj2023:​alucaci:​deonise_1.jpeg?​300|}} 
-</​note>​+{{:​pm:​prj2023:​alucaci:​deonise_2.jpeg?​300|}} 
 +{{:​pm:​prj2023:​alucaci:​deonise_3.jpeg?​300|}} 
 +{{:​pm:​prj2023:​alucaci:​deonise_4.jpeg?​300|}} 
 +{{:​pm:​prj2023:​alucaci:​deonise_5.jpeg?​300|}} 
 +{{:​pm:​prj2023:​alucaci:​deonise_6.jpeg?​300|}} 
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ + 
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** ​şi **Resurse Hardware**. +**Resurse Software** 
-</note>+ 
 +Bibliotecile necesare: 
 +  * Keypad: https://​www.arduino.cc/​reference/​en/​libraries/​keypad/​ 
 +  * LiquidCrystal_I2C:​ https://​www.arduino.cc/​reference/​en/​libraries/​liquidcrystal-i2c/​ 
 +  * StackArray: https://​github.com/​elechouse/​StackArray 
 + 
 +Tutoriale șexemple: https://​circuitdigest.com/​microcontroller-projects/​arduino-calculator-using-4x4-keypad 
 + 
 +**Resurse Hardware** 
 +  * Arduino: https://​cleste.ro/​kit-inva-are-arduino.h 
 +  * Keypad: https://​cleste.ro/​tasta-numerica-4x4.html 
 +  * LCD: https://​www.robofun.ro/​lcd/​modul-afisaj-lcd-lumina-fundal-albastra-i2c.html 
 + 
  
 <​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/prj2023/alucaci/calculator-de-buzunar.1684491602.txt.gz · Last modified: 2023/05/19 13:20 by costin.deonise
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