Grupa: 333CA
Pentru acest proiect am decis sa merg pe o directie bazata mai mult pe software si sa realizez un calculator portabil.
Acesta va putea efectua urmatoarele operatii aritmetice:
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.
Piese utilizate
Componenta in jurul careia se invarte proiectul este o placuta de dezvoltare Arduino UNO cu procesor ATmega328P.
Restul componentelor sunt urmatoarele:
Bill Of Materials
Componenta | Link | Datasheet |
---|---|---|
DS1302 RTC | Optimus Digital | Data Sheet |
Ecran LCD 1602 I2C | Optimus Digital | Data Sheet |
Matrice de butoane | Optimus Digital | N\A |
Arduino UNO cu ATmega328P | ArduShop | Data Sheet |
LED, Rezistente, baterie, etc. | Kit Plusivo | N/A |
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.
Conectarea se realizeaza in felul urmator:
SDA → SDA 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.
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
Matricea de butoane este folosita pentru input.
Conectarea se realizeaza in felul urmator:
Pinii de pe matrice | Pinii de pe arduino |
---|---|
C4 | 7 |
C3 | 6 |
C2 | 5 |
C1 | 4 |
R1 | 11 |
R2 | 10 |
R3 | 9 |
R4 | 8 |
Initital am facut proiectul pe breadboard iar acesta este modul in care am legat componentele pe breadboard:
Pentru proiectul final am lipit componentele pe un PCB universal. Conexiunile s-au schimbat din moment ce am mai adaugat componente:
O alta schimbare este modul in care am conectat matricea de butoane. Am actualizat ulterior tabelul de mai sus cu conexiunile finale.
Dovada ca cele trei componente principale functioneaza
In clipul de mai jos se pot observa toate functinalitatile proiectului si cum opereaza acestea.
Am folosit limbajul de programare specific Arduino unde am inclus diferite librarii externe pentru comunicarea cu perifericele.
3+5*2
)#
pentru a calcula (buton colt dreapta-jos de pe matrice)A
de pe matrice – urmatorul rezultatB
de pe matrice – rezultatul precedent.Librarie | Motivul utilizarii | Link descarcare |
---|---|---|
Wire | Comunicare I2C, folosita pentru RTC si LCD | |
LiquidCrystal_I2C | Control LCD 16×2 cu interfata I2C | Link |
Adafruit_Keypad | Gestionare tastatura matriciala 4×4 | Link |
uRTCLib | Comunicare cu modulul RTC DS3231 | 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 |
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++.
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:
values
– stiva pentru numere (float
)ops
– stiva pentru operatori (char
)Time
(pin 2)History
(pin 3)loop()
currentHistoryView
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.