Stap 5: De Code:
Enkele maanden geleden begon ik met "Spooky projecten" en "BionicArduino" door TodEKurt.
http://todbot.com/blog/spookyarduino/
Mijn code is gewoon een lastige combinatie van zijn projectcode.
"RGBMoodlight", "RGBPotMixer"
en sommige extensies.
Drie analoog-in en.
Digitaal-in als modus-schakelaar (met dank aan Ju. voor de interrupt-routine :).
De LED's zijn verbonden met D9 D10 en D11 ter ondersteuning van PulseWithModulation.
Als je wilt, ik kan de schets te publiceren, maar het is een echt kale combinatie van deze twee geweldige codes.
Hier is mijn oorspronkelijke code van de lamp.
Het ziet er een beetje rommelig zijn, want het was mijn zeer vroeg stadium van de programmering...
Maar als u het kopieert, het zou moeten werken prima.
Er zijn mooie stukken, zoals de "PotColorMixer", de "RGBfadingFunction" en de Interrupt-Routine voor de modus-schakelaar.
/ * nejo June2008
- Code voor mijn "Moodlamp", gebaseerd op "dimmingLEDs" door Clay Shirky < clay.shirky
* nejo Sep2008
- Definitieve code voor de moodlamp met interrupt-modus-schakelaar, analoge-wijzerplaat van de snelheid voor RGB-fading en RGB-kleur wijzigen.
- De dimmer-functie werkt alleen voor de witte kleur
* nejo October2008
- Geluid-extensie voor de moodlamp:
- Een condensator microfoon met een kleine LM368 Amp, een recifier en een RC-low-pass-filter
- met een andere analogInput gebruik ik de RGBPotMixer-functie om de kleur te wijzigen door het verkrijgen van de mic-signaal.
*
*
-Code voor cross-fading 3 LEDs, rood, groen en blauw, of een tri-color LED, met PWM
- Het programma cross-fades langzaam van rood tot groen, groen naar blauw en blauw naar rood
- De debugging code wordt ervan uitgegaan dat Arduino 0004, omdat het gebruik van de new Serial.begin ()-stijl functies
- oorspronkelijk "dimmingLEDs" door Clay Shirky < clay.shirky
*
- AnalogRead is op Pin A0 variëren van de snelheid van de fading RGB ingeschakeld
- AnalogRead is op Pin A2 variëren de kleur van de hueRGB ingeschakeld
*
*
*/
#include < avr/interrupt.h >
Uitgang
int ledPin = 13; controlPin voor foutopsporing
int redPin = 9; Rode LED, aangesloten op digital pin 9
int greenPin = 10; Groene LED, aangesloten op digital pin 10
int bluePin = 11; Blauwe LED, aangesloten op digital pin 11
int dimredPin = 3; Pinnen voor de analoge dimmen waarde, verbonden aan de bestuurder van de transistor
int dimgreenPin = 5;
int dimbluePin = 6;
Input
int switchPin = 2; switch is aangesloten op de pin D2
int val = 0; variabele voor het lezen van de Pinstatus
int buttonState; variabele te houden van de status van de knop
int buttonPresses = 0; 3 persen te gaan!
int potPin0 = 0; Pot voor het aanpassen van de vertraging tussen fading in Moodlamp;
int potPin2 = 2; Potentiometer uitvoer voor het wijzigen van de kleur van de hueRGB
int potVal = 0; Variabele op te slaan van de inbreng van de potentiometer
int maxVal = 0; waarde op te slaan het dimmen factor standaard is 255, als geen Pot is verbonden
int dimPin = 4; Pot aangesloten op A4 dimmen de helderheid
Programma variabelen
int redVal = 255; Variabelen voor het opslaan van de waarden te sturen naar de pinnen
int greenVal = 1; Beginwaarden zijn volle rode, groene en blauwe off
int blueVal = 1;
int i = 0; Lus teller
int wachten; / / = 15; 50 ms (.05 seconde) vertraging; verkorten voor sneller verdwijnt
int k = 0; waarde voor de gecontroleerde in de knipperen-functie
int DEBUG = 0; DEBUG teller; Indien ingesteld op 1, zal schrijf waarden terug via seriële
int LCD = 0; LCD teller; Indien ingesteld op 1, zal schrijf waarden terug via seriële
VOID Setup
{
pinMode (ledPin, OUTPUT);
pinMode (redPin, OUTPUT); Hiermee stelt u de pinnen als uitgang
pinMode (greenPin, OUTPUT);
pinMode (bluePin, OUTPUT);
pinMode(dimredPin,OUTPUT);
pinMode(dimgreenPin,OUTPUT); Hiermee stelt u de pinnen als uitgang
pinMode(dimbluePin,OUTPUT);
pinMode (potPin2, INPUT); //
pinMode (potPin0, INPUT); //
pinMode (dimPin, INPUT); //
pinMode (switchPin, INPUT); De schakeloptie-pincode instellen als input
attachInterrupt(0,isr0,RISING);
Als (DEBUG) {/ / als wij dat de waarden van de pin willen voor foutopsporing...
Serial.begin(9600); .. .set van de seriële uitgang op 0004 stijl
}
}
Hoofdprogramma
void loop
{
Als (buttonPresses == 0) {}
Moodlamp(); roept de functie Moodlight
}
Als (buttonPresses == 1) {}
RGBPotMixer(); de manuel mix functie aanroept
}
Als (buttonPresses == 2) {}
White(); Het is hier allemaal wit
}
Als (buttonPresses == 3) {}
}
Moodlamp();
RGBPotMixer();
White();
Monitor();
Dim();
}
VOID Monitor() {/ / staat naar de monitor verzenden
Als (DEBUG) {/ / als we willen de uitvoer lezen
DEBUG += 1; _ / / Verhogen de DEBUG-teller
Als (DEBUG > 10) {/ / Print elke 10 lussen
DEBUG = 1; De teller instellen
Serial.Print(i); Seriële opdrachten in 0004 stijl
Serial.Print("\t"); Een tabblad Afdrukken
Serial.Print("R:"); Geven dat uitvoer waarde voor rood
Serial.Print(redVal); Afdrukken van waarde voor rood
Serial.Print("\t"); Een tabblad Afdrukken
Serial.Print("G:"); Herhaal deze stappen voor groen en blauw...
Serial.Print(greenVal);
Serial.Print("\t");
Serial.Print("B:");
Serial.Print(blueVal); println, om te eindigen met een harde return
Serial.Print("\t");
Serial.Print("dimValue:");
Serial.Print(maxVal); println, om te eindigen met een harde return
Serial.Print("\t");
Serial.Print("wait:");
Serial.Print(wait); schrijft de waarde van de potPin0 naar de monitor
Serial.Print("\t");
Serial.Print("hueRGBvalue");
Serial.Print(potVal); schrijft de waarde van de potPin0 naar de monitor
Serial.Print("\t");
Serial.Print("buttonState:");
Serial.Print(buttonState); schrijft de waarde van de potPin0 naar de monitor
Serial.Print("\t");
Serial.Print("buttonPresses:");
Serial.println(buttonPresses); schrijft de waarde van de buttonPresses naar de monitor
}
}
}
VOID dim() / / functie voor het dimmen van wit / / misschien later voor alle modi
{
maxVal = analogRead(dimPin);
maxVal / = 4; Analoge variëren van 0..1024--> teveel voor het dimmen van de 0..255-waarde
analogWrite(dimredPin,maxVal);
analogWrite(dimgreenPin,maxVal);
analogWrite(dimbluePin,maxVal);
}
VOID Moodlamp()
{
wachten = analogRead(potPin0); Zoek de waarde van de potPin0;
Als geen Pot is verbonden: wacht 255
Ik += 1; Increment teller
Ik = i - maxVal;
Als (ik < 255) / / eerste fase van verdwijnt
{
redVal-= 1; Red omlaag
greenVal += 1; Groen omhoog
blueVal = 1; Blauwe lage
}
anders als (ik < 509) / / tweede fase van verdwijnt
{
redVal = 1; Rode lage
greenVal-= 1; Groen neer
blueVal += 1; Blauwe omhoog
}
anders als (ik < 763) / / derde fase van de verdwijnt
{
redVal += 1; Rode omhoog
greenVal = 1; Groene lo2
blueVal-= 1; Blauwe down
}
anders / / re-set op de teller, en de verdwijnt opnieuw te beginnen
{
Ik = 1;
}
We doen "255-redVal" in plaats van gewoon "redVal", omdat de
LEDs zijn aangesloten op + 5V in plaats van de Gnd
analogWrite (redPin, 255 - redVal); Huidige waarden schrijven naar LED pinnen
analogWrite (greenPin, 255 - greenVal);
analogWrite (bluePin, 255 - blueVal);
/ * dimredVal = min (redVal - maxVal, 255); dimmen
dimredVal = max (redVal - maxVal, 0);
dimgreenVal = min (greenVal - maxVal, 255);
dimgreenVal = max (greenVal - maxVal, 0);
dimblueVal = min (blueVal - maxVal, 255);
dimblueVal = max (blueVal - maxVal, 0);
analogWrite (redPin, 255 - dimredVal); Huidige waarden schrijven naar LED pinnen
analogWrite (greenPin, 255 - dimgreenVal);
analogWrite (bluePin, 255 - dimblueVal);
*/
wachten / = 4;
delay(wait); Wacht 'geduld' milliseconden voor hervatting van de lus
}
VOID RGBPotMixer()
{
potVal = analogRead(potPin2); luiden naar de waarde van de potentiometer op de invoer pin
potVal = potVal / 4; omzetten 0-255 0-1023
hue_to_rgb (potVal); behandelen van potVal als tint en omzetten in RGB-vals
"255-" is omdat wij gemeenschappelijke-anode LEDs, niet gemeenschappelijke-kathode hebben
analogWrite (redPin, 255-redVal); Schrijf de waarden naar LED pinnen
analogWrite (greenPin, 255-greenVal);
analogWrite (bluePin, 255-blueVal);
}
VOID White() {}
analogWrite (redPin, maxVal); Schrijf de waarden naar LED pinnen
analogWrite (greenPin, maxVal);
analogWrite (bluePin, maxVal);
}
/*
- Gegeven een variabele tint 'h', dat van 0-252 varieert,
- RGB-kleurwaarde correct ingesteld.
- MaxValimum neemt verzadiging & maximale waarde (helderheid)
- Hiermee voert u zuiver integer wiskunde, geen zwevende punt.
*/
VOID hue_to_rgb(byte hue)
{
Als tint (kleurtoon > 252) = 252; stetback tot en met 252!! nejo
byte hd = kleurtoon / 42; 36 == 252/7, 252 == H_MAX
byte hi = hd % 6; geeft 0-5
byte f = kleurtoon % 42;
byte fs = f * 6;
schakelen (hi) {}
Case 0:
redVal = 252; greenVal = fs; blueVal = 0;
breken;
Case 1:
redVal = 252-fs; greenVal = 252; blueVal = 0;
breken;
Case 2:
redVal = 0; greenVal = 252; blueVal = fs;
breken;
Case 3:
redVal = 0; greenVal = 252-fs; blueVal = 252;
breken;
Case 4:
redVal = fs; greenVal = 0; blueVal = 252;
breken;
Case 5:
redVal = 252; greenVal = 0; blueVal = 252-fs;
breken;
}
}
ongeldig isr0() {}
Serial.println ("\n \n inerrupt \n");
buttonState = digitalRead(switchPin); Lees de begintoestand
delayMicroseconds(100000);
Als (val! = buttonState) {/ / de status van de knop veranderd!
Als (buttonState == HIGH) {/ / controleren als de knop wordt nu gedrukt
buttonPresses ++;
// }
Val = buttonState; de nieuwe staat in onze variabele opslaan
Als (buttonPresses == 3) {/ / zur cksetzen
buttonPresses = 0;
}
}
// }
Volgende fase werden de transistor-stuurprogramma's. Ik gebruikte 3 PNP transistors met een maximale stroom van 3 Ampere. Nadat vooruit-stroom en spanning werden geregeld, werkte de LEDemitter prima met volledige intensiteit.