Differences

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

Link to this comparison view

pm:prj2023:vstoica:maria_ana.draghici [2023/05/27 14:33]
maria_ana.draghici [Software Design]
pm:prj2023:vstoica:maria_ana.draghici [2023/05/28 15:12] (current)
maria_ana.draghici [Download]
Line 1: Line 1:
-====== Lampă Inteligentă ======+====== Lampă Inteligentă ​- Maria-Ana Drăghici======
 ===== Introducere ===== ===== Introducere =====
  
Line 9: Line 9:
   * jos = creativ, fericit - lumină galbenă   * jos = creativ, fericit - lumină galbenă
   * sus = optimist - lumină mov   * sus = optimist - lumină mov
-Lampa se va opri automat după o perioadă de 60 de secunde. Apăsând pe buton, utilizatorul va putea opri/porni lampa.+Lampa se va opri automat după o perioadă de 40 de secunde ​de la ultima schimbare a culorii luminii. Apăsând pe buton, utilizatorul va putea opri/porni lampa.
 De asemenea, utilizatorul va putea seta și intensitatea luminii cu ajutorul unui potențiometru. De asemenea, utilizatorul va putea seta și intensitatea luminii cu ajutorul unui potențiometru.
  
Line 28: Line 28:
 ===== Software Design ===== ===== Software Design =====
  
 +Mediul de dezvoltare pentru acest proiect a fost Arduino IDE. 
  
-<note tip> 
-Descrierea codului aplicaţiei (firmware): 
-  * 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>​ 
-Mediul de dezvoltare pentru acest proiect a fost Arduino IDE. 
 Biblioteci utilizate: Biblioteci utilizate:
-  * SparkFun_APDS9960 - pentru ​sezorul ​de gesturi.+  * SparkFun_APDS9960 - pentru ​senzorul ​de gesturi.
  
 Implementare:​ Implementare:​
-  * Variabila counter este folosită pentru a ști când lampa este pornită și când este oprită. Această variabilă contorizează numărul de apăsări de buton. Counter inițial ​este 0, deci: când counter este număr par, lampa va fi oprită (toate LED-urile sunt oprite), iar când counter este număr impar, înseamnă că lampa este pronită. +  ​* Întreruperile,​ citirea valorii potentiometrului și timerul au fost implementate cu ajutorul regiștrilor. 
-  * Pentru fecare intrerupere generată de buton, counter va crește +  ​* Variabila counter este folosită pentru a ști când lampa este pornită și când este oprită. Această variabilă contorizează numărul de apăsări de buton. Counter ​este inițial 0, deci: când counter este număr par, lampa va fi oprită (toate LED-urile sunt oprite), iar când counter este număr impar, înseamnă că lampa este pronită. 
-  * După verificarea de pornire/​oprire a lămpii, se va mai verifica si variabila timer, care ține evidența secundelor trecute de la setarea ​luminii.+  * După verificarea de pornire/​oprire a lămpii, se va mai verifica si variabila timer, care ține evidența secundelor trecute de la ultima setare a culorii. Dacă au trecut 40 de secunde de la ultima schimbare a culorii ​luminii ​lămpii, aceasta se va stinge. 
 +  * Pentru o funcțonare corectă există următoarele cazuri: 
 +  - Dacă lampa se oprește din apăsarea butonului, atunci counter va fi incrementat și seconds va fi setat pe 0 
 +  - Dacă lampa se stinge automat (au trecut 40 de secunde), atunci counter va fi setat pe valoare pară (pentru a ști ca lampa este închisă). 
 +  - Când lampa este pornită, atunci când este înregistrat un gest (deci se schimbă culoarea luminii), seconds va fi resetat la 0.
 <​code>​ <​code>​
 #define BUTTON PD4 #define BUTTON PD4
Line 128: Line 125:
  
 // ...... // ......
 +</​code>​
 +  * Citirea valorii potențiometrului se face constant în funcția de loop. Valoarea citită este salvată, iar intensitatea luminii setată în funcție de aceasta.
 +<​code>​
 +void loop() {
 +  /* Start conversion */
 +  ADCSRA |= (1 << ADSC);
 +  /* Wait until conversion is complete */
 +  while(!(ADCSRA & ( 1 << ADIF)));
 +  /* Save result */
 +  uint16_t result = ADC;
 +  /* Get brightness */
 +  int brightness = ADC / 4;
 +
 +  // ......
 +}
 +</​code>​
 +  * Pentru senzorul de gesturi a fost folosită biblioteca SparkFun_APDS9960. Acest senzor folosește I2C-ul. Pinul de întrerupere este conectat la pinul digital 2, deci se va folosi întreruperea externă INT0.
 +
 +{{ :​pm:​prj2023:​vstoica:​gesture_senzor.png?​nolink&​500 |}}
 +<​code>​
 +SparkFun_APDS9960 apds = SparkFun_APDS9960();​
 +int isr_flag = 0;
 +// ....
 +
 +voide setup() {
 +  // Other setups
 +  // ....
 +  ​
 +  setup_interrupts();​
 +  ​
 +  // ....
 +
 +  // Initialise gesture sensor
 +  if ( apds.init() ) {
 +    Serial.println(F("​APDS-9960 initialization complete"​));​
 +  } else {
 +    Serial.println(F("​Something went wrong during APDS-9960 init!"​));​
 +  }
 + 
 +  if ( apds.enableGestureSensor(true) ) {
 +    Serial.println(F("​Gesture sensor is now running"​));​
 +  } else {
 +    Serial.println(F("​Something went wrong during gesture sensor init!"​));​
 +  }
 +  ​
 +  // ....
 +}
 +
 +void setup_interrupts() {
 +  // ....
 +  ​
 +  // Extern interrupt
 +  EIMSK |= (1 << INT0);
 +  ​
 +  // ....
 +}
 +
 +void loop() {
 +  // ....
 +  ​
 +  // If lamp on
 +  // ....
 +  if( isr_flag == 1 ) {
 +      lights = handleGesture();​
 +      isr_flag = 0;
 +    }
 +    ​
 +  switch (lights) {
 +        case 1:
 +          // Turn on all LEDs
 +          // ....
 +          break;
 +        case 2:
 +          // Turn on yellow LED
 +          // ....
 +          break;
 +        case 3:
 +          // Turn on blue LED
 +          // ....
 +        case 4:
 +          // Turn on red LED
 +          // ....
 +          break;
 +    }
 +  } else {
 +    // Turn off all LEDs
 +    // ....
 +  }
 +  ​
 +  // ....
 +}
 +int handleGesture() {
 +    if ( apds.isGestureAvailable() ) {
 +      // Return by case of gesture
 +    switch ( apds.readGesture() ) {
 +      case DIR_UP:
 +        // ....
 +        return 1;
 +      case DIR_DOWN:
 +        // ....
 +        return 2;
 +      case DIR_LEFT:
 +        // ....
 +        return 3;
 +      case DIR_RIGHT:
 +        // ....
 +        return 4;
 +      default:
 +        // ....
 +    }
 +  }
 +}
 </​code>​ </​code>​
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip+<html
-Care au fost rezultatele obţinute în urma realizării proiectului vostru+  <​iframe width="​760"​ height="​515"​ src="​https://​www.youtube.com/​embed/​Hz6R-aXUxV0"​ title="​YouTube video player"​ frameborder="​0"​ allow="​accelerometer;​ autoplay; clipboard-write;​ encrypted-media;​ gyroscope; picture-in-picture;​ web-share"​ allowfullscreen></​iframe>​ 
-</note>+</html>
  
 ===== Concluzii ===== ===== Concluzii =====
  
 +Prin intermediul acestei lămpi inteligente,​ utilizatorul poate beneficia de un control mai mare asupra mediului înconjurător și poate experimenta beneficiile unei iluminări personalizate în funcție de starea sa. Căutarea informatiilor despre cum trebuie conectate componentele și crearea circuitului au fost interesante. De asemenea, a fost foarte util datasheet-ul unde am găsit regiștrii ce trebuie modificați pentru fiecare componentă. Macheta pentru proiect a avut o dificultate nu așa de ridicată ca și software-ul și hardware-ul. Mi-a plăcut să lucrez la acest proiect întrucât m-a interesat foarte mult tema aleasă.
 ===== Download ===== ===== 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**. +{{:pm:prj2023:vstoica:draghici_maria_proiect-pm.zip|}}
-</​note>​ +
- +
-===== Jurnal ===== +
- +
-<note tip> +
-Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. +
-</​note>​+
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ +Surse Hardware: 
-Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse ​Software** ​şi **Resurse Hardware**. +  * https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab0-2022 
-</note>+  ​https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab1-2022 
 +  ​https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab2-2023 
 +  * https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab3-2023 
 +  * https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab4-2022 
 +  * https://​how2electronics.com/​interfacing-apds9960-gesture-rgb-color-sensor-with-arduino/​ 
 + 
 +Surse Software
 +  ​https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab0-2022 
 +  ​https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab1-2022 
 +  ​https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab2-2023 
 +  ​https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab3-2023 
 +  ​https://​ocw.cs.pub.ro/​courses/​pm/​lab/​lab4-2022 
 +  ​https://​how2electronics.com/​interfacing-apds9960-gesture-rgb-color-sensor-with-arduino/​ 
 +  * https://​ocw.cs.pub.ro/​courses/​_media/​pm/​atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
  
pm/prj2023/vstoica/maria_ana.draghici.1685187180.txt.gz · Last modified: 2023/05/27 14:33 by maria_ana.draghici
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