Differences

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

Link to this comparison view

pm:prj2024:rpascale:valentin.bobaru [2024/05/04 10:35]
valentin.bobaru
pm:prj2024:rpascale:valentin.bobaru [2024/05/23 13:09] (current)
valentin.bobaru [Software Design]
Line 21: Line 21:
   * 4 butoane   * 4 butoane
  
-Modul în care aceste piese vor fi legate rămâne de văzutÎn principiu, ​LCD-ul ​se va conecta prin I2C, senzorul ​de temperatură și (probabil) buzzerul vor fi conectate ​la ADC.+Schema Hardware: 
 + 
 +{{:​pm:​prj2024:​rpascale:​schema_hardwarerere.png?​800|}} 
 + 
 +Legături între componente:​ 
 +  * LCD-ul ​este conectat la pinii de I2C ai  Arduino Nano 
 +  * Buzzer-ul se conencteaza la pinul D9 
 +  * Senzorul ​de temperatură ​are linia de date conectată la pinul D10 
 +  * Modulul RTC foloseste 3 legături: RST - D2, CLK -D4 și DAT - D3 
 +  * Butoanele sunt legate ​la A[0..3] și folosesc un condensator pentru debouncing și rezistențe de pull-down 
  
 ===== Software Design ===== ===== Software Design =====
  
 +Pentru dezvoltare s-a folosit PlatformIO. Au fost implementate toate functionalitatile descrise anterior, si anume un manager de alarme (cu 5 alarme disponibile),​ temporizator,​ posibilitatea de a configura timpul.
 +
 +Managerul de alarme foloseste un spatiu de 5 alarme disponibile,​ salvand orice modificare a acestor alarme pe memoria EEPROM (pentru a asigura persistenta si in timpul deconectarii de la alimentare). Managerul de alarme va interoga, la orice modificare sau la boot-up, cele 5 alarme si va retine timpul ramas pana la trigger (in secunde). Se foloseste un timer pentru generarea de intreruperi la fiecare secunda (detalii mai jos). Cand timpul trece, este activat buzzerul pentru 6 secunde, urmand a se determina cea mai apropiata alarma.
 +
 +Temporizatorul primeste ca input timpul dorit, urmand ca dupa ce a fost setat sa contorizeze secundele ramase pana la trigger (foloseste acelasi timer pentru contorizarea secundelor). Si acest "​modul"​ foloseste buzzerul cand timpul a expirat.
 +
 +Configurarea timpului asteapta inputul de la utilizator, urmand sa comunice cu modulul RTC pentru setarea timpului.
 +
 +Biblioteci folosite: biblioteca pentru LCD I2C si pentru modululele RTC si de temperatura. Motivatie: nu a fost necesar sa reinventez roata.
 +
 +Optimizari: Am dorit ca acest ceas de birou sa fie cat mai mobil si sa nu depinda de o sursa de alimentare. Astfel am incercat sa diminuez consumul pe cat posibil. O prima decizie pe care am luat-o a fost sa reduc frecventa Nano-ului de la 16 MHz la 8 MHz (prin setarea divizorului de clock al atmega328p la 2). O valoare mai mica de 8MHz rezulta in functionarea anormala a comunicarii cu perifericele. O a doua decizie luata a fost folosirea modului de POWER_DOWN pentru consum redus. Am luat aceasta decizie deoarece ceasul meu nu are nevoie sa faca lucruri in continuu, ci la anumite intervale de timp (spre exemplu, am setat ca ora sa fie actualizata o data la 10 secunde, iar temperatura o data la 1 minut). Astfel, folosesc timerul watchdog pentru a trezi microcontrolerul o data la o secunda. Totodata, trezirea din POWER_DOWN mode se poate face si prin Pin Change Interrupts, ceea ce se preteaza foarte bine pe proiect deoarece pot trezi microcontrolerul si la apasarea butoanelor. Totusi, in urma masuratorilor facute de mine, marele consumator de energie este LCD-ul, si mai exact back-light-ul acestuia, motiv pentru care am folosit si un potentiometru pentru reglarea backlight-ului. Consumul mediu inregistrat cu backlight-ul maxim a fost de 23 mA, fara a lua in considerare timpul cand buzzerul este activat (cand buzzerul este activ, consumul creste pana pe la 70 - 80 mA, dar asta se intampla foarte rar, cateva secunde pe zi).
 +
 +Din cadrul laboratorului,​ am folosit urmatoarele functionalitati:​
 +  * GPIO (buzzer)
 +  * Timere (WDT si pentru buzzer am implementat de mana functionalitatie de tone si noTone din biblioteca Arduino)
 +  * Intreruperi (WDT si butoane)
 +  * UART (debug)
 +  * I2C (nu am folosit eu de mana, ci biblioteca de interfatare a modulului I2C)
  
-<note tip> +[[https://drive.google.com/​file/​d/​1iPm7hH8nvJCB5xy60tpp_rjQNJZpaOOy/view?​usp=drive_link|Demo video]]
-Descrierea codului aplicaţiei (firmware): +
-  * mediu de dezvoltare (if any) (e.gAVR 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>+
  
-Se va folosi PlatformIO pentru dezvoltare. Nu sunt sigur încă ce librării voi folosi dar cu singuranță voi apela la librării pentru modulul RTC (spre exemplu [[https://​github.com/​mikaelpatel/​Arduino-RTC|aceasta]]) dar și pentru modulul LCD. În principiu voi avea nevoie de definirea unui state-machine pentru a putea multiplexa funcționalitățile butoanelor și ceea ce se afișează pe LCD. 
  
  
  
 +   
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
pm/prj2024/rpascale/valentin.bobaru.1714808144.txt.gz · Last modified: 2024/05/04 10:35 by valentin.bobaru
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