Beschrijving
Met een RGB-lichtgevende diode kun je bijna alle kleuren creëren door rood, groen en blauw te mengen met verschillende helderheid. De volgende circuit suggestie laat zien hoe de kleur van een RGB led aan te passen zoals gewenst met behulp van een Arduino en een Rotary encoder. De drukschakelaar van de encoder wordt gebruikt om de kleur te selecteren die moet veranderen. De kleur van de werkelijke kleur wordt weergegeven met de SMD Led. Als u de encoder naar rechts draait, verhoogt u de waarde van de geselecteerde kleur of vermindert deze door naar links te draaien. Het resultaat wordt weergegeven met de RGB Led.
Circuit
Naast de Arduino hebben we drie modules uit de 35in1 Arduino Kit nodig,
roterende encoder, de SMD RGB Led en de normale RGB Led.
De connectoren moeten als volgt op de Arduino worden aangesloten
- Arduino D2 - Rotary Encoder CLK
- Arduino D3 - Rotary Encoder SW
- Arduino D4 - Rotary Encoder DT
- Arduino D6 - SMD Led R
- Arduino D7 - SMD Led G
- Arduino D8 - SMD Led B
- Arduino D9 - RGB Led R
- Arduino D10 - RGB Led G
- Arduino D11 - RGB Led B
Daarnaast moeten de GND-connectoren van alle modules worden aangesloten op de ARDuino's GND en de Rotary encoder+5V-aansluiting op de +5V van de Arduino.
Voor de Rotary Encoder CLK- en Rotary Encoder SW-connectoren moeten 100nF-condensatoren tegen de grond worden geschakeld om interferentie te onderdrukken.
Het afgewerkte circuit ziet er dan zo uit.
Modules:
Rotary Encoder:
De Rotary Encoder is een eenvoudig apparaat. Het bevat een gesegmenteerde conactating disc en twee contacten A en B liggend naast de zijkant door te draaien, afhankelijk van de richting van de rotatie, de conatkt A en vervolgens het contact B via de schijf is aangesloten op contact C.
Op de logic analyzer ziet dit er als volgt uit (kanaal 0 = contact A of verbinding CLK op de module en kanaal 1 = contact B of aansluiting DT op de module).
Rechts aan de dalende rand (rood) kanaal 1 is altijd HOOG:
Naar links draaien bij de vallende rand (rood) kanaal 1 is altijd LAAG:
Als je kijkt naar de dalende rand van kanaal 0, kun je de draairichting bepalen vanaf kanaal 1. (1 voor rechts en 0 voor links). We zullen dit in het programma gebruiken. Het aantal dalende randen geeft aan hoe ver de draaiing was.
SMD-Led
De module bevat een RGB SMD Led met geschikte weerstanden zodat 5V direct op de connectors R(ot), G(rün) en B(lau) geplaatst kan worden.
RGB Led
De module bevat een conventionele RGB Led met geschikte weerstanden, zodat 5V direct op de connectors R(ot), G(rün) en B(lau) geplaatst kan worden. Deze Led heeft betere kleurmengeigenschappen.
Programma:
const byte infoLedGreen = 7;
const byte infoLedBlue = 8;
const byte colorLedRed = 9;
const byte colorLedGreen = 10;
const byte colorLedBlue = 11;
const byte colSwitch = 2;
const byte pulse = 3;
const byte pulseDirection = 4 ;
const byte delta = 16;
sommige globale variabelen definiëren
vluchtige bytecol = 0; huidige kleur rood
vluchtige int roodNiveau = 128; rode volledige helderheid
volatiel int groenNiveau = 128; groen is uit
vluchtige int blueLevel = 128; blauw is uit
nietig instellen()
zet uw setup code hier, om eenmaal uit te voeren:
Serial.begin(115200);
pinmodi definiëren
pinMode(infoLedRed, OUTPUT);
pinMode(infoLedGreen, OUTPUT);
pinMode(infoLedBlue, OUTPUT);
pinMode(colorLedRed, OUTPUT);
pinMode(colorLedGreen, OUTPUT);
pinMode(colorLedBlue, OUTPUT);
invoerpins definiëren
pinMode(colSwitch, INPUT_PULLUP);
pinMode(puls, INPUT_PULLUP);
pinMode(pulseDirection, INPUT_PULLUP);
interrupts definiëren
attachInterrupt(digitalPinToInterrupt(pulse),rotaryPulse, FALLING);
attachInterrupt(digitalPinToInterrupt(colSwitch),changeColor, FALLING);
set info led
showInfo();
Serial.println("Start:");
}
loop()
zet uw hoofdcode hier, om herhaaldelijk uit te voeren:
analogWrite(colorLedRed,redLevel);
analogWrite(colorLedGreen,greenLevel);
analogWrite(colorLedBlue,blueLevel);
}
functie om de informatie led in te stellen;
void showInfo()
digitalWrite(infoLedRed,LOW);
digitalWrite(infoLedGreen,LOW);
digitalWrite(infoLedBlue,LOW);
switch(col)
geval 0: digitalWrite(infoLedRed,HIGH);
breken;
case 1: digitalWrite(infoLedGreen,HIGH);
breken;
case 2: digitalWrite(infoLedBlue,HIGH);
breken;
}
}
service onderbreken voor switch
huidige kleur wijzigen
nietig wijzigenKleur()
col ++;
als (col == 3) col = 0;
showInfo();
Serial.print("Kleur: ");
Serial.println(col);
}
onderbreken voor roterende puls
kleurwaarde wijzigen voor huidige waarde
leegte rotaryPulse()
char msg[50];
byte dir = digitalRead(pulseDirection);
Serial.println(dir); schakelaar (col)
geval 0: redLevel = verandering(redLevel,dir);
breken;
geval 1: groenNiveau = verandering(groenNiveau,dir);
breken;
case 2: blueLevel = change(blueLevel,dir);
breken;
}
sprintf (msg,"Kleur veranderd Rood:%d Blauw:%d Groen:%d",redLevel,blueLevel,greenLevel);
Serial.println(msg);
}
de grenswaarden voor de controle van de verhoging storp- of decrementniveaus 0 en 255
int change(int level, int dir)
als (dir == 0)
niveau -= delta;
als (niveau < 0) niveau = 0;
• anders
niveau += delta;
als (niveau > 255) niveau = 255;
}
terugkeerniveau;
}
Eerst worden de gebruikte verbindingen gedefinieerd. colSwitch en pulse zijn ingesteld op D3 en D2 omdat deze ingangen te onderbreken zijn. De connectors voor de RGB Led zijn ingesteld op D9, D10 en D11, omdat ze op alle Arduino-borden kunnen worden gebruikt voor analoge output (PWM).
Bovendien wordt de waarde delta definier verhoogd of verlaagd door de kleurwaarde per rotatiepuls.
Vervolgens worden globale variabelen gedefinieerd voor de momenteel actieve instellingskleur (col) en voor de ingestelde kleurwaarden (roodNiveau, groenNiveau, blauwNiveau).
In de installatiefunctie worden de poorten voorbereid en toegewezen aan de servicefuncties colSwitch en Pulse Interrupt. We activeren de interrupt to the negative edge.
In de lusfunctie worden de gecodeerde kleurwaarden uitgevoerd naar de LED VAN RGB.
De functie showInfo geeft de momenteel geselecteerde instellingskleur weer via de SMD Led. We gebruiken hier een functie omdat deze twee keer nodig is.
De changeColor-functie wordt aangeroepen wanneer de knop Roterende encoder wordt ingedrukt. De waarde voor de huidige instellingskleur wordt met één verhoogd. Als het groter is dan twee, is het terug gezet naar nul. Vervolgens wordt de huidige waarde voor info weergegeven op de SMD Led en ook output via de seriële interface.
De rotaryPulse-functie wordt altijd sann genoemd wanneer een hellende rand optreedt bij de CLK-uitgang van de roterende encoder. Ten eerste wordt de toestand van de DT-uitgang van de roterende encoder bepaald om de richting te bepalen. Afhankelijk van de huidige instellingskleur en de rotatierichting wordt de respectievelijke kleurwaarde vervolgens gewijzigd. Dit gebeurt in een subprogramma. Ten slotte worden de nieuwe waarden uitgevoerd naar de seriële poort voor controle.
De wijzigingsfunctie wordt gebruikt om een kleurwaarde te verhogen of te verlagen. De parameters zijn de huidige kleurwaarde en -richting. Als de richting = 0, wordt de kleurwaarde anders verhoogd. Als de nieuwe kleurwaarde groter was dan 255, zou deze worden ingesteld op 255. Hetzelfde gebeurt als de nieuwe waarde kleiner is dan 0, dan is deze ingesteld op 0. De waarde voor het verhogen of dalen is ingesteld op 16, maar kan individueel worden gewijzigd.
2 Reacties
Michael
Wie könnte man diese Steuerung für ein ganzes 12v led band erweitern?
Wolfgang
Achtung : Die Pin Belegung im Sketch stimmt nicht mit der Pin Belegung im Tesxt überein !