This is an old revision of the document!


Calculator de buzunar

Introducere

NUME: DEONISE Costin-Alexandru
GRUPA: 332CC

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.

Ideea acestui proiect a pornit de la dorința de a crea un calculator simplu, portabil și ușor de utilizat, care să poată fi construit cu ajutorul componentelor electronice disponibile și accesibile. În plus, proiectul a fost conceput pentru a arăta cum Arduino poate fi utilizat pentru a crea dispozitive utile și practice.

Proiectul este util pentru alții pentru că poate fi folosit ca un instrument educațional pentru a învăța concepte de bază în programare și inginerie electronică. De asemenea, poate fi utilizat ca un dispozitiv portabil pentru efectuarea rapidă a calculelor de bază în diverse situații.

Descriere generală

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.

Componentele hardware utilizate în proiect sunt Arduino Uno, un display LCD I2C și o tastatură numerică 4×4. Arduino Uno acționează ca și creierul proiectului, preluând intrările de la tastatură, efectuând calculele și afișând rezultatul pe display-ul LCD.

Tastatura numerică este conectată la Arduino Uno prin intermediul unor pini digitali, iar display-ul LCD este conectat utilizând protocolul I2C, care permite transferul de date pe mai puține fire de conexiune.

Funcționalitatea calculatorului este implementată în codul Arduino. Codul citeste tastatura numerică și efectuează operațiile corespunzătoare pe numerele introduse. Rezultatul este afișat pe display-ul LCD, iar utilizatorul poate continua să introducă și să efectueze noi operații.

Proiectul combină atât partea de hardware, prin utilizarea tastaturii și a display-ului LCD, cât și partea de software, prin implementarea logicii calculatorului în codul Arduino.

În concluzie, acest proiect oferă o soluție simplă și interactivă pentru efectuarea operațiilor matematice de bază, folosind o tastatură numerică și un display LCD conectate la platforma Arduino. Prin combinarea hardware-ului și software-ului, proiectul “Arduino Calculator” poate efectua operații matematice de bază și poate fi utilizat ca un dispozitiv calculator portabil și practic.

Hardware Design

Proiectul de hardware pentru acest calculator simplu constă în utilizarea următoarelor componente:

1) 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.

2) 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.

3) Tastatură numerică: Se utilizează o tastatură numerică matriceală 4×4, 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.

Software Design

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.

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.

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.

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_KEY) DetectButtons();: 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ă da, se apelează funcția evaluateExpression(inputExpression) pentru 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 și se afișează funcțiile asociate pe LCD. * Se verifică apăsarea numerelor de la 0 la 9. Numă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 și 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ă și 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 și 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 și 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

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

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.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2023/alucaci/calculator-de-buzunar.1684492741.txt.gz · Last modified: 2023/05/19 13:39 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