Controllo di una striscia LED RGB con Arduino UNO
Controllo di una striscia LED RGB con Arduino UNO
In questo esempio, controlleremo a distanza una striscia di LED RGB.
strisce di LED possono essere facilmente controllate con qualsiasi microcontrollore. In questo esempio, usiamo la tecnica dimming PWM per controllare la potenza di ogni canale RGB della striscia. Poiché ogni canale di colore può assorbire un sacco di corrente (dell’ordine di pochi ampere, o più), sono richiesti transistori di potenza! Non cercare di collegare i canali del LED della striscia direttamente al vostro microcontrollore.
È possibile utilizzare qualsiasi MOSFET di potenza NPN BJT o MOSFET a canale N, ma assicurarsi che il transistor sia in grado di gestire una corrente superiore a quella richiesta. Ad esempio, se la striscia di LED assorbe 0,2 A/m per canale, se si dispone di una striscia di 5 metri è necessario un transistor che ragga correnti superiori ad 1A. Il formato comune per transistor di potenza è il TO-220.
Per i sistemi di base a basso costo si consiglia di utilizzare MOSFET a canale N come il IRF520N o la ST P55NF06 o TIP120, sono molto popolari e poco costosi. Se non si dispone di quelli precedentemente citati, i transistor NPN sono anche buoni, ma hanno perdite di potenza più elevate rispetto a MOSFET.
Hardware
- Arduino UNO
- Modulo ESP-01 WiFi (con µPanel Firmware)
- Adattatore per Breadboard ADP-01
- Breadboard
- RGB LED Strip
- Power transistors (we used the N-MOS STP55NF06)
Per strisce più lunghe che richiedono più di 1A, alimentare la striscia con una fonte esterna, quindi collegare i cavi di alimentazione e di terra di nuovo al Arduino.
Nel caso in cui si utilizzi un transistor NPN, ricordate di aggiungere una resistenza 100-220 Ohm tra le uscite PWM microcontrollore e il pin di base dei transistor.
Definizione μPanel
Per mostrare la flessibilità della grafica miuPanel, abbiamo ricreato un controllore a infrarossi semplice, di solito in dotazione con la striscia di RGB.
Uso del pannello di simulatore online si può facilmente progettare e controllare il layout del pannello prima di caricarlo su Arduino.
/10*10fb{-5%90,y90r30!FFF,DDD^|/5T#000:RGB LED Controller;/10
{{%45,20r20^!888B1%36,36r80!FFF:+;|B2%36,36r80!FFF:-;}|{%45,20r20^!888B3%36,36r80!F00:Off;|B4%36,36r80!0F0:On;}}_
{%90,y60r20^m!888BA%18,18r80!F00:R;|BB%18,18r80!0F0:G;|BC%18,18r80!00F:B;|BD%18,18r80!FFF:W;_
BE%18,18r80!F60:;|BF%18,18r80!FC0:;|BG%18,18r80!FF0:;|BH%18,18r80!C60:;_
BI%18,18r80!3F9:;|BL%18,18r80!6FF:;|BM%18,18r80!3CC:;|BN%18,18r80!069;_
BO%18,18r80!F0C:;|BP%18,18r80!F6C:;|BQ%18,18r80!F9F:;|BR%18,18r80!906:;}}
Come potete vedere, abbiamo utilizzato 20 pulsanti. Per ciascun pulsante abbiamo utilizzato alcuni stili di specificare la dimensione (stile “%”), la forma (stile “r” per arrotondare gli angoli) e lo sfondo (in stile “!”) Ad eccetera.
Arduino Code
Si prega di notare che per la programmazione di Arduino Uno, la linea RxD (filo blu) deve essere scollegato dal modulo WiFi.
void setup() { #define BLUEPIN 9 #define REDPIN 10 #define GREENPIN 11 // Initialize Serial Port Serial.begin(57600); // Let uPanel start delay(3000); // Discharge old partial messages Serial.println(""); // Send The Panel (split in different messages for convenience, not mandatory) Serial.print ("$P:/10*10fb{-5%90,y90r30!FFF,DDD^|/5T#000:RGB LED Controller;/10{{%45,20r20^!888B1%36,36r80!FFF:+;"); Serial.print ("|B2%36,36r80!FFF:-;}|{%45,20r20^!888B3%36,36r80!F00:Off;|B4%36,36r80!0F0:On;}}_{%90,y60r20^m!888"); Serial.print ("BA%18,18r80!F00:R;|BB%18,18r80!0F0:G;|BC%18,18r80!00F:B;|BD%18,18r80!FFF:W;_"); Serial.print ("BE%18,18r80!F60:;|BF%18,18r80!FC0:;|BG%18,18r80!FF0:;|BH%18,18r80!C60:;_"); Serial.print ("BI%18,18r80!3F9:;|BL%18,18r80!6FF:;|BM%18,18r80!3CC:;|BN%18,18r80!069;_"); Serial.println("BO%18,18r80!F0C:;|BP%18,18r80!F6C:;|BQ%18,18r80!F9F:;|BR%18,18r80!906:;}}"); // Settings I/O pinMode(REDPIN, OUTPUT); pinMode(GREENPIN, OUTPUT); pinMode(BLUEPIN, OUTPUT); } String Msg; unsigned char state = 0; unsigned char brightness; // (0-10) unsigned char red = 0; // red level 0-25 (referred to lowest brightness step) unsigned char green = 0; // green level 0-25 (referred lowest brightness step) unsigned char blue = 0; // blue level 0-25 (referred to lowest brightness step) unsigned char red_b; // red level 0-255 (referred to selected brightness) unsigned char green_b; // green level 0-255 (referred to selected brightness) unsigned char blue_b; // blue level 0-255 (referred to selected brightness) char button_id; void loop() { int c; while ((c = Serial.read()) > '\n') Msg += (char) c; // Read incoming chars, if any, until new line if (c == '\n') // is the message complete? { if (Msg.substring(0,2).equals("#B")){ // a button is pressed button_id = Msg.charAt(2); switch (button_id){ case '1': // Increase brightness if (brightness <10) brightness++; break; case '2': // Decrease brightness if (brightness >1) brightness--; break; case '3': // Switch OFF digitalWrite(8, 0); red = 0; green = 0; blue = 0; state = 10; // switch off requested break; case '4': // Switch ON if(!state){ digitalWrite(8, 1); red = 0; green = 25; blue = 0; brightness = 3; state = 1; } break; case 'A': red = 25; green = 0; blue = 0; break; case 'B': red = 0; green = 25; blue = 0; break; case 'C': red = 0; green = 0; blue = 25; break; case 'D': red = 25; green = 15; blue = 25; break; case 'E': red = 24; green = 10; blue = 0; break; case 'F': red = 24; green = 19; blue = 0; break; case 'G': red = 19; green = 10; blue = 0; break; case 'H': red = 25; green = 5; blue = 5; break; case 'I': red = 5; green = 24; blue = 14; break; case 'L': red = 10; green = 24; blue = 24; break; case 'M': red = 5; green = 19; blue = 19; break; case 'N': red = 0; green = 10; blue = 14; break; case 'O': red = 20; green = 0; blue = 25; break; case 'P': red = 20; green = 5; blue = 20; break; case 'Q': red = 25; green = 10; blue = 25; break; case 'R': red = 20; green = 0; blue = 10; break; } } Msg = ""; //clear string if (state > 0 ){ // Update the outputs red_b = red * brightness; green_b = green *brightness; blue_b = blue * brightness; analogWrite(REDPIN, red_b); analogWrite(GREENPIN, green_b); analogWrite(BLUEPIN, blue_b); if(state == 10) // requested off state = 0; } } }
Guarda il video di questo esempio: