This shows you the differences between two versions of the page.
pm:prj2023:drtranca:cristina.hudisteanu [2023/05/26 21:04] cristina.hudisteanu [Hardware] |
pm:prj2023:drtranca:cristina.hudisteanu [2023/05/30 12:27] (current) cristina.hudisteanu [Download] |
||
---|---|---|---|
Line 9: | Line 9: | ||
* Proiectul presupune un ceas pe display format din 3 matrice de leduri. | * Proiectul presupune un ceas pe display format din 3 matrice de leduri. | ||
* Este util deoarece poate fi programat prin telecomanda de la o distanta rezonabila. | * Este util deoarece poate fi programat prin telecomanda de la o distanta rezonabila. | ||
- | * Oricine are nevoie de un ceas in casa pentru a utiliza diferite alarme inainte de a merge la serviciu/facultate | + | * Oricine are nevoie de un ceas in casa pentru a ajunge la timp la serviciu/facultate |
- | * Fara a ne mai deplasa pana la dispozitiv il putem seta. | + | * Fara a ne mai deplasa pana la dispozitiv ii putem seta ora/data/anul. |
- | * Pentru a nu fi nevoie sa setam ora dupa fiecare oprire a device-ului am adaugat un RTC | + | * Pentru a nu fi nevoie sa setam ora dupa fiecare oprire a device-ului am adaugat un RTC |
</note> | </note> | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
Line 35: | Line 35: | ||
| | ||
{{:pm:prj2023:drtranca:1.png?direct&600 |}} | {{:pm:prj2023:drtranca:1.png?direct&600 |}} | ||
+ | |||
+ | |||
+ | |||
+ | |||
Line 130: | Line 134: | ||
- | <note tip> | + | Pentru crearea unei interfete care sa fie usor utilizata de catre utilizator, am adaugat o telecomanda. Aceasta telecomanda cu un buton de SET |
- | Descrierea codului aplicaţiei (firmware): | + | si unul pentru MODE. |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | |
+ | * SET : cursor pentru cele 4 coloane principale aferente fiecarei cifre pentru outputului care poate lua forma : ora/an/luna-an (Ex. 22 : 30, 2020, 10/11) si ne confera optiunea de a schimba continutul acesteia prin input-ul pe care il oferim din telecomanda. | ||
+ | * MODE : care cicleaza intre tipurile de output de forma : ora/an/luna-an (Ex. 22 : 30, 2020, 10/11) | ||
+ | * [0-9] : cifrele de care ne vom folosi sa cream outputul dorit | ||
+ | |||
+ | Matricele de LED-uri le reprezentam in cod intr-un array 2D cu 24 coloane si 8 linii prin care iteram de la dreapta la stanga pentru a putea face edit usor. | ||
+ | In cadrul proiectului am integrat atat intreruperi cat si SPI. | ||
+ | |||
+ | Pentru afisajul cifrelor am pregatit o serie de constante pentru a simplifica procesul: | ||
+ | |||
+ | const uint8_t NUMBERS[][4] = { | ||
+ | { 0b01111000, 0b10000100, 0b10000100, 0b01111000 }, //0 | ||
+ | { 0b00000100, 0b11111100, 0b01000100, 0b00000000 }, //1 | ||
+ | { 0b01100100, 0b10010100, 0b10010100, 0b01001100 }, //2 | ||
+ | { 0b01011000, 0b10100100, 0b10000100, 0b01001000 }, //3 | ||
+ | { 0b00111100, 0b10010000, 0b01010000, 0b00110000 }, //4 | ||
+ | { 0b10011000, 0b10100100, 0b10100100, 0b11101000 }, //5 | ||
+ | { 0b00011000, 0b10100100, 0b10100100, 0b01111000 }, //6 | ||
+ | { 0b11000000, 0b10100000, 0b10011100, 0b10000000 }, //7 | ||
+ | { 0b01011000, 0b10100100, 0b10100100, 0b01011000 }, //8 | ||
+ | { 0b01111000, 0b10010100, 0b10010100, 0b01100000 }, //9 | ||
+ | }; | ||
+ | |||
+ | |||
+ | #define ZERO 0x822A | ||
+ | #define ONE 0xA0AA | ||
+ | #define TWO 0xA82A | ||
+ | #define THREE 0x8022 | ||
+ | #define FOUR 0xA8AA | ||
+ | #define FIVE 0xA02A | ||
+ | #define SIX 0x8822 | ||
+ | #define SEVEN 0x8AA2 | ||
+ | #define EIGHT 0x8A22 | ||
+ | #define NINE 0x88A2 | ||
+ | |||
+ | Pentru butoane, avem functia de intrerupere care se executa cand apar modificari HIGH to LOW pe pinul D2. Cand se apasa un buton de pe telecomanda se trimite informatie care genereaza modificarile. Decodam informatia: | ||
+ | * un bit 1 este approx 100 ticks de ceas la frecventa 2MHz (frecventa ucontrollerului/ prescaler 8) | ||
+ | * un bit 0 este approx 40 ticks | ||
+ | * la inceputul transmisiei se trimite un semnal de inceput care are lungimea approx 60 ticks | ||
+ | * finalul este marcat de un impuls cu o lungime mai mare de 130 | ||
+ | |||
+ | ISR(INT0_vect) { | ||
+ | if (TCNT2 > 50 && TCNT2 < 70) { | ||
+ | reading = true; | ||
+ | code = 0; | ||
+ | } else if (TCNT2 > 130 && reading) { | ||
+ | handle_ir_code(); | ||
+ | reading = false; | ||
+ | } else if (reading) { | ||
+ | if (TCNT2 < 50) { | ||
+ | code <<= 1; | ||
+ | } else if (TCNT2 >= 50) { | ||
+ | code <<= 1; | ||
+ | code |= 1; | ||
+ | } | ||
+ | } | ||
+ | TCNT2 = 0; | ||
+ | } | ||
+ | |||
+ | Pentru intreruperea de 1 secunda pe timer1 avem functia care se ocupa de actualizarea timpului dupa regulile bine cunoscute | ||
+ | ISR(TIMER1_COMPA_vect) { | ||
+ | dotsOn = !dotsOn; | ||
+ | aux_time_update = update_time(seconds, seconds + 1, 60); | ||
+ | |||
+ | if (aux_time_update) | ||
+ | aux_time_update = update_time(minutes, minutes + aux_time_update, 60); | ||
+ | |||
+ | if (aux_time_update) | ||
+ | aux_time_update = update_time(hours, hours + aux_time_update, 24); | ||
+ | |||
+ | if (aux_time_update) | ||
+ | aux_time_update = update_time(day, day + aux_time_update, get_days_for_month(month)+1); | ||
+ | |||
+ | if (aux_time_update) { | ||
+ | day+=1; | ||
+ | aux_time_update = update_time(month, month + aux_time_update, 13); | ||
+ | } | ||
+ | |||
+ | if (aux_time_update) { | ||
+ | month+=1; | ||
+ | aux_time_update = update_time(yearL, yearL + aux_time_update, 100); | ||
+ | } | ||
+ | if (aux_time_update) | ||
+ | update_time(yearH, yearH + aux_time_update, 100); | ||
+ | } | ||
+ | |||
+ | Pentru a face update la ora si a tine cont de faptul ca o ora are maxim 60 min, un minut maxim 60s, etc. vom folosi urmatoarea functie | ||
+ | |||
+ | uint8_t update_time(volatile int &item, int value, uint8_t max) { | ||
+ | return value % max; | ||
+ | } | ||
+ | |||
+ | |||
+ | Astfel daca ajungem spre exemplu la 61 de secunde pentru un minut noi vom lua de fapt 61 % 60 = 1 | ||
- | ===== 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**. | ||
- | </note> | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 160: | Line 247: | ||
Urmeaza PM Fair. | Urmeaza PM Fair. | ||
</note> | </note> | ||
+ | |||
+ | ===== Concluzii & Montajul rezultat ===== | ||
+ | |||
+ | {{:pm:prj2023:drtranca:2..png?direct&400 |}} | ||
+ | |||
+ | {{:pm:prj2023:drtranca:3.png?direct&400 |}} | ||
+ | |||
+ | {{:pm:prj2023:drtranca:4.png?direct&400 |}} | ||
+ | |||
+ | {{:pm:prj2023:drtranca:5.png?direct&400 |}} | ||
+ | |||
+ | {{:pm:prj2023:drtranca:6.png?direct&300 |}} | ||
+ | |||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
Line 174: | Line 274: | ||
https://ocw.cs.pub.ro/courses/_media/pm/doc8272.pdf | https://ocw.cs.pub.ro/courses/_media/pm/doc8272.pdf | ||
https://arduinogetstarted.com/tutorials/arduino-led-matrix | https://arduinogetstarted.com/tutorials/arduino-led-matrix | ||
- | + | https://www.analog.com/media/en/technical-documentation/data-sheets/max7219-max7221.pdf | |
+ | https://arduinogetstarted.com/tutorials/arduino-rtc | ||
+ | https://simple-circuit.com/arduino-nec-remote-control-decoder/ | ||
</note> | </note> | ||