This shows you the differences between two versions of the page.
pm:prj2024:fstancu:florin.subtirica [2024/05/24 17:28] florin.subtirica [Hardware Design] |
pm:prj2024:fstancu:florin.subtirica [2024/05/24 19:09] (current) florin.subtirica [Bibliografie/Resurse] |
||
---|---|---|---|
Line 68: | Line 68: | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | Codul pentru proiect este scris în **Arduino IDE** și folosește bibliotecile **Adafruit_NeoPixel** și **OneWire** pentru a controla un LED STRIP RGB și pentru a citi datele de la un senzor de temperatură DS18B20. În plus, codul controlează un ventilator în funcție de temperatura citită. | ||
+ | |||
+ | |||
+ | === Biblioteca și definiții === | ||
<note tip> | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | + | **#include <Adafruit_NeoPixel.h>** |
- | * 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> | + | |
- | ===== Rezultate obţinute ===== | + | **#include <OneWire.h>** |
+ | **#define LED_STRIP_PIN 6** | ||
+ | |||
+ | **#define NUM_LEDS 9** | ||
+ | |||
+ | **#define TEMPERATURE_PIN 11** | ||
+ | |||
+ | **#define FAN_PIN 3** | ||
+ | </note> | ||
+ | * Adafruit_NeoPixel.h: Biblioteca pentru controlul LED-urilor NeoPixel. | ||
+ | * OneWire.h: Biblioteca pentru comunicarea cu senzorii OneWire, precum DS18B20. | ||
+ | * LED_STRIP_PIN: Pinul la care este conectat la LED STRIP. | ||
+ | * NUM_LEDS: Numărul de LED-uri din șir. | ||
+ | * TEMPERATURE_PIN: Pinul la care este conectat senzorul de temperatură DS18B20. | ||
+ | * FAN_PIN: Pinul la care este conectat ventilatorul. | ||
+ | === Obiecte globale === | ||
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | **Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_STRIP_PIN, NEO_GRB + NEO_KHZ800);** |
+ | |||
+ | **OneWire ds(TEMPERATURE_PIN);** | ||
</note> | </note> | ||
+ | * strip: Un obiect pentru controlul șirului de LED-uri NeoPixel. | ||
+ | * ds: Un obiect pentru comunicarea cu senzorul de temperatură. | ||
+ | === Funcția setup === | ||
+ | <note tip> | ||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | pinMode(TEMPERATURE_PIN, INPUT); | ||
+ | pinMode(FAN_PIN, OUTPUT); | ||
+ | pinMode(LED_STRIP_PIN, OUTPUT); | ||
+ | analogReference(INTERNAL); | ||
+ | strip.begin(); | ||
+ | strip.show(); | ||
+ | } | ||
+ | </note> | ||
+ | * Serial.begin(9600): Inițializează comunicarea serială la 9600 baud. | ||
+ | * pinMode(TEMPERATURE_PIN, INPUT): Configurează pinul pentru senzorul de temperatură ca intrare. | ||
+ | * pinMode(FAN_PIN, OUTPUT): Configurează pinul pentru ventilator ca ieșire. | ||
+ | * pinMode(LED_STRIP_PIN, OUTPUT): Configurează pinul pentru LED-uri ca ieșire. | ||
+ | * analogReference(INTERNAL): Setează referința analogică internă (1.1V pe majoritatea plăcilor Arduino). | ||
+ | * strip.begin(): Inițializează șirul de LED-uri. | ||
+ | * strip.show(): Resetează LED-urile, setând toate culorile la negru (oprit). | ||
+ | === Funcția loop === | ||
+ | <note tip> | ||
+ | void loop() { | ||
+ | byte i; | ||
+ | byte present = 0; | ||
+ | byte data[12]; | ||
+ | byte addr[8]; | ||
- | ===== Concluzii ===== | + | if ( !ds.search(addr)) { |
+ | ds.reset_search(); | ||
+ | delay(250); | ||
+ | return; | ||
+ | } | ||
- | ===== Download ===== | + | present = ds.reset(); |
+ | ds.select(addr); | ||
+ | ds.write(0x44); // Start temperature conversion | ||
- | <note warning> | + | delay(1000); |
- | 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ă ;-). | + | |
+ | present = ds.reset(); | ||
+ | ds.select(addr); | ||
+ | ds.write(0xBE); // Read Scratchpad | ||
- | 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**. | + | for ( i = 0; i < 9; i++) { // Read 9 bytes |
- | </note> | + | data[i] = ds.read(); |
+ | } | ||
+ | uint16_t val = data[0] | ( (uint16_t) data[1] << 8); | ||
+ | float temperature = val * 0.0625; // Convert ADC value to temperature in Celsius | ||
- | ===== Jurnal ===== | + | Serial.print("\nTemperature: "); |
+ | Serial.print(temperature); | ||
+ | if (temperature < 24) { | ||
+ | analogWrite(FAN_PIN, 255); | ||
+ | setColor(255, 255, 255); // White | ||
+ | } else if (temperature >= 24 && temperature < 26) { | ||
+ | analogWrite(FAN_PIN, 120); // 30% duty cycle | ||
+ | setColor(255, 255, 0); // Yellow | ||
+ | } else if (temperature >= 26 && temperature < 28) { | ||
+ | analogWrite(FAN_PIN, 60); // 60% duty cycle | ||
+ | setColor(255, 165, 0); // Orange | ||
+ | } else { | ||
+ | analogWrite(FAN_PIN, 0); // 100% duty cycle | ||
+ | setColor(255, 0, 0); // Red | ||
+ | } | ||
+ | |||
+ | delay(1000); // Read temperature and update fan speed every second | ||
+ | } | ||
+ | </note> | ||
+ | * Funcția loop este executată continuu și face următoarele: | ||
+ | * Caută un dispozitiv OneWire (senzorul de temperatură) conectat. | ||
+ | * Dacă nu găsește un senzor, resetează căutarea și așteaptă 250 ms. | ||
+ | * Dacă găsește un senzor, inițiază o conversie de temperatură și așteaptă 1 secundă. | ||
+ | * Citește datele de temperatură de la senzor. | ||
+ | * Convertește valoarea citită într-o temperatură în grade Celsius. | ||
+ | * Afișează temperatura pe monitorul serial. | ||
+ | * Controlează ventilatorul și LED-urile în funcție de temperatura citită: | ||
+ | * Sub 24°C: Ventilatorul este pornit la putere maximă, LED-urile sunt albe. | ||
+ | * Între 24°C și 26°C: Ventilatorul funcționează la 30% din putere, LED-urile sunt galbene. | ||
+ | * Între 26°C și 28°C: Ventilatorul funcționează la 60% din putere, LED-urile sunt portocalii. | ||
+ | * Peste 28°C: Ventilatorul este oprit, LED-urile sunt roșii. | ||
+ | * Așteaptă 1 secundă înainte de a repeta ciclul. | ||
+ | === Funcția setColor === | ||
<note tip> | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | void setColor(uint8_t r, uint8_t g, uint8_t b) { |
+ | for (int i = 0; i < NUM_LEDS; i++) { | ||
+ | strip.setPixelColor(i, strip.Color(r, g, b)); | ||
+ | } | ||
+ | strip.show(); | ||
+ | } | ||
</note> | </note> | ||
+ | * Setează culoarea tuturor LED-urilor în funcție de valorile RGB primite ca parametri. | ||
+ | * strip.setPixelColor(i, strip.Color(r, g, b)): Setează culoarea LED-ului i la culoarea specificată. | ||
+ | * strip.show(): Actualizează șirul de LED-uri pentru a reflecta modificările de culoare. | ||
+ | ===== Rezultate obţinute ===== | ||
- | ===== Bibliografie/Resurse ===== | + | {{:pm:prj2024:fstancu:whatsapp_image_2024-05-24_at_18.10.03_042e3b88.jpg?700|}} |
- | <note> | + | <note tip>Video demonstrativ: |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | https://www.youtube.com/shorts/d3L1eB4awSk |
</note> | </note> | ||
- | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | ===== Concluzii ===== |
+ | În concluzie, a fost o adevărată plăcere să lucrez la acest proiect, unde am avut oportunitatea de a combina cunoștințele de hardware cu cele de software și de a fi creativ în găsirea soluțiilor pentru controlul cooler-ului și a led strip-ului rgb. Integrarea senzorului de temperatură și a mosfet-ului a fost amuzantă, mai ales că mi s-au stricat 2 senzori. Sper să mai am oportunitatea să lucrez la astfel de proiecte în viitor, însă poate de data asta nu se mai strică senzorii :))! | ||
+ | ===== Download ===== | ||
+ | |||
+ | {{:pm:prj2024:fstancu:proiect_pm.zip|}} | ||
+ | ===== Bibliografie/Resurse ===== | ||
+ | |||
+ | |||
+ | 1. **Arduino Libraries** | ||
+ | |||
+ | 2. ** Adafruit_NeoPixel Library Documentation ** | ||
+ | |||
+ | 3. ** OneWire Library Documentation ** | ||
+ | |||
+ | 4. ** Datasheet DS18B20** | ||
+ | |||
+ | 5. ** Datasheet MOSFET N-MOS IRF540N ** | ||
+ | 6. ** Datasheet LED Strip RGB WS2812 ** |