This shows you the differences between two versions of the page.
pm:prj2024:fstancu:florin.subtirica [2024/05/19 23:40] florin.subtirica [Hardware Design] |
pm:prj2024:fstancu:florin.subtirica [2024/05/24 19:09] (current) florin.subtirica [Bibliografie/Resurse] |
||
---|---|---|---|
Line 10: | Line 10: | ||
=== Descriere === | === Descriere === | ||
- | Proiectul constă în crearea unui sistem de monitorizare a temperaturii frunții. Când acesta detectează o creștere majoră a temperaturii, atunci ventilatorul atașat va porni și va începe procesul de răcire. Pe lângă funcția de răcire, acesta va mai avea și led-uri atașate. | + | Proiectul constă în crearea unui sistem de monitorizare a temperaturii camerei. Când acesta detectează o creștere majoră a temperaturii, atunci ventilatorul atașat va porni și va începe procesul de răcire. Pe lângă funcția de răcire, acesta va mai avea și led-uri atașate. |
=== Motivație === | === Motivație === | ||
Line 19: | Line 19: | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | <html> | + | {{:pm:prj2024:fstancu:racitorfrunteschemaelectrica.png?700|}} |
- | <head> | + | |
- | <title>Untitled Diagram.drawio.html</title> | + | |
- | <meta charset="utf-8"/> | + | |
- | </head> | + | |
- | <body> | + | |
- | <div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{"highlight":"#0000ff","nav":true,"resize":true,"xml":"<mxfile host=\"app.diagrams.net\" modified=\"2024-05-03T10:57:24.036Z\" agent=\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\" etag=\"XhdDIIl1NqxxCCWhduZc\" version=\"24.3.1\" type=\"device\"><diagram name=\"Page-1\" id=\"r8TUF71wDC9FKBXq__ij\"><mxGraphModel dx=\"975\" dy=\"503\" grid=\"0\" gridSize=\"10\" guides=\"1\" tooltips=\"1\" connect=\"1\" arrows=\"1\" fold=\"1\" page=\"1\" pageScale=\"1\" pageWidth=\"827\" pageHeight=\"1169\" math=\"0\" shadow=\"0\"><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"1PZ3gLvvuo3D2I-1noBh-12\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;\" parent=\"1\" source=\"1PZ3gLvvuo3D2I-1noBh-1\" target=\"1PZ3gLvvuo3D2I-1noBh-4\" edge=\"1\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"1PZ3gLvvuo3D2I-1noBh-13\" value=\"I2C/SPI\" style=\"edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];\" parent=\"1PZ3gLvvuo3D2I-1noBh-12\" vertex=\"1\" connectable=\"0\"><mxGeometry x=\"-0.0876\" y=\"-2\" relative=\"1\" as=\"geometry\"><mxPoint as=\"offset\"/></mxGeometry></mxCell><mxCell id=\"QBFgygmIit_VV6TFWb4a-3\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;\" edge=\"1\" parent=\"1\" source=\"1PZ3gLvvuo3D2I-1noBh-1\" target=\"QBFgygmIit_VV6TFWb4a-1\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"QBFgygmIit_VV6TFWb4a-7\" value=\"PWM\" style=\"edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];\" vertex=\"1\" connectable=\"0\" parent=\"QBFgygmIit_VV6TFWb4a-3\"><mxGeometry x=\"-0.071\" relative=\"1\" as=\"geometry\"><mxPoint as=\"offset\"/></mxGeometry></mxCell><mxCell id=\"1PZ3gLvvuo3D2I-1noBh-1\" value=\"Arduino Uno 16U2\" style=\"rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;\" parent=\"1\" vertex=\"1\"><mxGeometry x=\"139\" y=\"417\" width=\"120\" height=\"60\" as=\"geometry\"/></mxCell><mxCell id=\"1PZ3gLvvuo3D2I-1noBh-10\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;\" parent=\"1\" source=\"1PZ3gLvvuo3D2I-1noBh-2\" target=\"1PZ3gLvvuo3D2I-1noBh-1\" edge=\"1\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"1PZ3gLvvuo3D2I-1noBh-11\" value=\"ADC\" style=\"edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];\" parent=\"1PZ3gLvvuo3D2I-1noBh-10\" vertex=\"1\" connectable=\"0\"><mxGeometry x=\"0.036\" relative=\"1\" as=\"geometry\"><mxPoint as=\"offset\"/></mxGeometry></mxCell><mxCell id=\"1PZ3gLvvuo3D2I-1noBh-2\" value=\"&lt;div&gt;Senzor temperatură&lt;/div&gt;&lt;div&gt;L35, TO92&lt;/div&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;\" parent=\"1\" vertex=\"1\"><mxGeometry x=\"139\" y=\"297\" width=\"120\" height=\"60\" as=\"geometry\"/></mxCell><mxCell id=\"1PZ3gLvvuo3D2I-1noBh-3\" value=\"Ventilator\" style=\"rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;\" parent=\"1\" vertex=\"1\"><mxGeometry x=\"624\" y=\"417\" width=\"120\" height=\"60\" as=\"geometry\"/></mxCell><mxCell id=\"1PZ3gLvvuo3D2I-1noBh-4\" value=\"Bandă LED\" style=\"rounded=1;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;\" parent=\"1\" vertex=\"1\"><mxGeometry x=\"139\" y=\"537\" width=\"120\" height=\"60\" as=\"geometry\"/></mxCell><mxCell id=\"QBFgygmIit_VV6TFWb4a-2\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;\" edge=\"1\" parent=\"1\" source=\"QBFgygmIit_VV6TFWb4a-1\" target=\"1PZ3gLvvuo3D2I-1noBh-3\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"QBFgygmIit_VV6TFWb4a-1\" value=\"MOSFET N-MOS&lt;div&gt;IRF540N&lt;/div&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;\" vertex=\"1\" parent=\"1\"><mxGeometry x=\"393\" y=\"417\" width=\"120\" height=\"60\" as=\"geometry\"/></mxCell></root></mxGraphModel></diagram></mxfile>","toolbar":"pages zoom layers lightbox","page":0}"></div> | + | |
- | <script type="text/javascript" src="https://app.diagrams.net/js/viewer-static.min.js"></script> | + | |
- | </body> | + | |
- | </html> | + | |
- | Senzorul de temperatură transmite prin ADC datele colectate către Arduino, iar Arduino transmite mai departe un semnal PWM către MOSFET, acesta controlând viteza ventilatorului (ex: 0%, 50%, 100%). În același timp, folosind I2C/SPI, Arduino va controla benzile RGB LED, pornind în același timp cu ventilatorul. | + | Senzorul de temperatură transmite prin ADC datele colectate către Arduino, iar Arduino transmite mai departe un semnal PWM către MOSFET, acesta controlând viteza ventilatorului (0%, 30%, 60%, 100%). În același timp, folosind I2C, Arduino va controla banda RGB LED, acesta modificându-i culoarea în funcție de viteza ventilatorului / temperatura indicată de senzor (0% - alb, 30% - galben, 60% - portocaliu, 100% - roșu). |
===== Hardware Design ===== | ===== Hardware Design ===== | ||
Line 38: | Line 29: | ||
1 x Arduino UNO 16U2 \\ | 1 x Arduino UNO 16U2 \\ | ||
- | 1 x Senzor de temperatură LM35, TO92 \\ | + | 1 x Senzor de temperatură DS18B20 \\ |
- | 1 x Ventilator PC 5V \\ | + | 1 x Ventilator PC 12V \\ |
+ | 1 x Rezistență 2.2kΩ \\ | ||
1 x Rezistență 10kΩ \\ | 1 x Rezistență 10kΩ \\ | ||
- | 1 x Rezistență 330Ω \\ | + | 1 x 15 cm bandă LED RGB WS2812 \\ |
- | 2 x Bandă LED RGB \\ | + | |
1 x Breadboard 400 puncte \\ | 1 x Breadboard 400 puncte \\ | ||
1 x Set Jumper breadboard 140 \\ | 1 x Set Jumper breadboard 140 \\ | ||
Line 51: | Line 42: | ||
- | {{:pm:prj2024:fstancu:racitor_frunte.png?900|}} | + | {{:pm:prj2024:fstancu:schemaelectricaracitor.png?750|}} |
- | 1. Conectarea senzorului de temperatură (LM35): \\ | + | 1. Conectarea senzorului de temperatură (DS18B20): \\ |
- +Vs la 5V de pe Arduino. \\ | - +Vs la 5V de pe Arduino. \\ | ||
- GND la GND de pe Arduino. \\ | - GND la GND de pe Arduino. \\ | ||
- | - Vout la un pin analogic (A0) pentru citirea temperaturii. \\ | + | - Vout la un pin digital (D11) pentru citirea temperaturii. \\ |
2. Conectarea ventilatorului: \\ | 2. Conectarea ventilatorului: \\ | ||
Line 71: | Line 62: | ||
4. Rezistențe:\\ | 4. Rezistențe:\\ | ||
- | - O rezistență de pull-down (10kΩ) între gate și GND la MOSFET pentru a asigura că ventilatorul rămâne oprit când pinul de gate nu este activat. \\ | + | - O rezistență de pull-down (2.2kΩ) între Digital OUT și GND \\ |
- | - O rezistență între pinul de date al benzii LED și Arduino (330Ω) pentru a proteja pinul de date.\\ | + | - O rezistență de pull-down (10kΩ) între gate și GND la MOSFET pentru a asigura că ventilatorul rămâne oprit când pinul de gate nu este activat. |
- | == Diverse simulări == | + | ===== 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ă. | ||
- | ===== Software Design ===== | ||
+ | === 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 ** |