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 ** | ||