Autorul poate fi contactat la adresa: Login pentru adresa
In general un cooler are doua moduri de functionare:
Proiectul ales consta in implementarea unui cooler pentru laptop care va putea fi controlat prin intermediul unei aplicatii software. Daca laptopul se afla sub stres ridicat (temperaturi ridicate) atunci ventilatoarele cooler-ului se vor roti cat se poate de repede, iar daca laptopul e in standby ventilatoarele se vor roti la o viteza minima pentru a nu scoate un sunet deranjant.
Aplicatia software va transmite informatii legate de tempraturile interne ale CPU-ului si astfel microcontroller-ul va decide o viteza de rotatie optima a ventilatoarelor.
/* modurile de functionare a cooler-ului */ #define MODE_STOP 0 #define MODE_MANUAL 1 #define MODE_TEMP 2 /* primeste setarile prin seriala */ void receive_settings(); /* initializeaza timer1 pe module FastPWM */ void FastPWM_init(); int main();
/* functie de initializare a controllerului USART */ void USART0_init(); /* functie ce transmite un caracter prin USART */ void USART0_transmit(unsigned char data); /* functie ce primeste un caracter prin USART */ unsigned char USART0_receive();
Aplicatia de desktop am facut-o folosind API-ul de Swing-uri pus la dispozitie de Java pentru GUI, jSensors pentru detectarea temperaturii procesorului si jCommSerial pentru transmiterea comenzilor catre microcontroller.
/* obtinerea efectiva a informatiilor oferite de senzorii sistemului */ static Sensors getSystemInfo(); /* obtinerea numelui procesorului sistemului */ String getCPUName(); /* obtinerea temperaturilor asociate CPU-ului */ List<Temperature> getCPUTemperature();
/* modurile de functionare a cooler-ului */ static final int MODE_STOP = 0b00; static final int MODE_MANUAL = 0b01; static final int MODE_TEMP = 0b10; /* constructorul clasei in care se initializeaza interfata USART (baud rate, biti paritate, stop etc.) */ Serial(); /* trimite modul de functionare si valoarea asociata catre microcontroller */ void send(int mode, byte value); /* receptioneaza modul de functionare si valoarea de la microcontroller (folosita pentru debugging) */ void receive();
/* constructorul interfetei; initializeaza elementele si obiectele folosite */ public UI(JFrame frame); /* un worker care este executat la fiecare secunda si se ocupa de update-ul GUI-ului */ public class SensorsWorker extends SwingWorker<Sensors, Sensors> { /* afla noile temperaturi ale CPU-ului folosind o instanta a clasei Sensors intr-un thread propriu */ protected Sensors doInBackground(); /* updateaza GUI-ul pe baza informatiilor gasite in doInBackground() */ protected void done(); } /* se ocupa de transmiterea setarilor cooler-ului catre microcontroller */ public class SerialRunnable implements Runnable { public void run(); }
La pornirea cooler-ului acesta este in modul STOP si nu se invarte deloc. Se asteapa apasarea butonului Start din cadrul aplicatiei.
Odata apasat butonul de Start se va transmite sub modul de temperatura valori catre microcontroller. Valoarea va fi o medie a valorilor afisate in partea stanga a aplicatiei.
Daca se doreste sa se controleze manual viteza de rotatie (procentual) a cooler-ului se poate bifa casuta “Manual Mode” si se va putea controla procentul prin intermediul slider-ului.
Daca se doreste intreruperea functionarii cooler-ului se poate apasa pe Pause.
A fost un proiect in urma caruia am castigat puina experienta cu sistemele embedded, in special pe partea de hard. Consider ca ideea proiectului este una foarte practica si as dori ca pe viitor sa revin asupra lui si sa aduc anumite imbunatatiri precum: sa folosesc API-ul pus la dispozitie de catre NVIDIA pentru aflarerea temperaturii GPU-ului si sa calculez viteza de rotatie a cooler-ului in functie de aceasta. De asemenea, la inceputul proiectului nu mi-am dat seama ca voi avea nevoie de o sursa de 12V (adica de un fir in plus pe langa USB), astfel ca o alta imbunatatire ar fi folosirea unui modul de bluetooth in locul convertorului USART-USB.