Ceas programabil cu telecomanda

  • Cand un ceas este ceea ce iti lipseste in gospodarie, decizi sa il creezi pe al tau.

Introducere

Prezentarea pe scurt a proiectului:

  • 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.
  • Oricine are nevoie de un ceas in casa pentru a ajunge la timp la serviciu/facultate
  • 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

Descriere generală

Proiectul presupune un ceas pe display format din 3 matrice de leduri 8×8. Matricele au in componenta cipul MAX7219 LED Dot Matrix Module, ceea ce permite controlarea lor cu doar 5 pini.

Pentru a nu fi nevoie sa setam ora dupa fiecare oprire a device-ului am adaugat un RTC care este conectat prin I2C.

Un afișaj cu matrice LED 8 x 8 este utilizat în acest proiect pentru a afișa informațiile. Matricele LED sunt disponibile în diferite stiluri, cum ar fi o singură culoare, două culori, multicolore sau matrice LED RGB. Sunt disponibile și în diferite dimensiuni, cum ar fi 5 x 7, 8 x 8, 16 x 16, 32 x 32 etc.

Schema bloc:

Hardware

Ardunino Nano: Arduino Nano este o placa cu dimensiuni reduse, completă și prietenoasă, bazată pe ATmega328 (Arduino Nano 3.x). Are mai mult sau mai puțin aceeași funcționalitate ca Arduino J UNO, dar într-un pachet compact.

Specificatii tehnice: Microcontroler ATmega328 Arhitectura AVR Tensiune de funcționare 5 V Memorie flash 32 KB din care 2 KB utilizate de bootloader SRAM 2 KB Viteza ceasului 16 MHz Pini analogici IN 8 EEPROM 1 KB Curent DC per pini I/O 40 mA (pini I/O) Tensiune de intrare 7-12V Pini I/O digitale 22 (dintre care 6 sunt PWM) Ieșire PWM 6 Consum de energie 19 mA Dimensiune PCB 18 x 45 mm Greutate 7 g

I2C :

I2C înseamnă Inter-Integrated Circuit. Este un protocol de conexiune cu interfață magistrală încorporat în dispozitivele pentru comunicații seriale. A fost proiectat inițial de Philips Semiconductor în 1982. Recent, este un protocol utilizat pe scară largă pentru comunicarea la distanță scurtă. Este, de asemenea, cunoscut sub numele de interfață cu două fire (TWI). Funcționarea protocolului de comunicare I2C: - Folosește doar 2 linii bidirecționale deschise pentru comunicarea de date, numite SDA și SCL. Ambele linii sunt trase sus. Date seriale (SDA) – Transferul datelor are loc prin acest pin. Serial Clock (SCL) – Transportă semnalul ceasului.

Comunicațiile în timp real (RTC) reprezintă orice mod de telecomunicații în care toți utilizatorii pot face schimb de informații instantaneu sau cu latență neglijabilă sau întârzieri de transmisie. În acest context, termenul în timp real este sinonim cu live.

În RTC, există întotdeauna o cale directă între sursă și destinație. Deși legătura poate conține mai multe noduri intermediare, datele merg de la sursă la destinație fără a fi stocate între ele. În schimb, comunicațiile asincrone sau cu decalaj temporal, cum ar fi e-mailul și mesageria vocală, implică întotdeauna o anumită formă de stocare a datelor între sursă și destinație. În aceste cazuri, există o întârziere anticipată între transmiterea și primirea informațiilor.

Comunicațiile în timp real pot avea loc în moduri half-duplex sau full-duplex:

-RTC half - duplex. Transmiterea datelor poate avea loc în ambele direcții pe un singur purtător sau circuit, dar nu în același timp. -RTC full - duplex. Transmiterea datelor poate avea loc în ambele direcții simultan pe un singur purtător sau circuit.

Un afișaj cu matrice LED 8 x 8 este utilizat în acest proiect pentru a afișa informațiile. Matricele LED sunt disponibile în diferite stiluri, cum ar fi o singură culoare, două culori, multicolore sau matrice LED RGB. Sunt disponibile și în diferite dimensiuni, cum ar fi 5 x 7, 8 x 8, 16 x 16, 32 x 32 etc.

Specificații

Tensiune de funcționare: 5 V Dimensiune: 5 cm x 3,2 cm (latime) x 1,5 cm (inaltime) Patru găuri (3 mm) cu șuruburi pentru o instalare ușoară (pot fi utilizați știfturi M3) 5 x linii DuPont (20 cm)

Proiectul este realizat pe o placa PCB cu conexiuni din fire pe spatele placii pentru un design cat mai curat al prototipului. O placă PCB se referă la placa care asigură o conexiune electrică pentru diferite componente utilizând fire și conductori și oferă suport mecanic și pentru componentele montate pe suprafață și prize.. În mod normal, este realizat din materiale precum fibra de sticla, epoxidic compozit, și alte materiale compozite. Plăcile PCB au o gamă largă de aplicații, variind de la jucării electronice, smartphone-uri, la electrocasnice și automobile. Odată cu apariția noilor tehnologii precum IoT (internetul Lucrurilor), AI și AR, cererea de plăci PCB este din ce în ce mai în creștere. Conform statisticilor, valoarea de piață a plăcilor PCB este de așteptat să atingă 75,72 miliarde USD până la 2025, cu o rată de creștere anuală compusă de 4.12. Poza rezultat proiect:

Software Design

Pentru crearea unei interfete care sa fie usor utilizata de catre utilizator, am adaugat o telecomanda. Aceasta telecomanda cu un buton de SET si unul pentru MODE.

  • 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

Jurnal

Am ales numele proiectului.

Am trimis documentatia sub forma de pdf.

Am creat pagina de wiki.

Urmeaza PM Fair.

Concluzii & Montajul rezultat

Bibliografie/Resurse

pm/prj2023/drtranca/cristina.hudisteanu.txt · Last modified: 2023/05/30 12:27 by cristina.hudisteanu
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