Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- RGB Led Lamp 1.0a
- by Luca Soltoggio
- 15/03/2012
- http://arduinoelettronica.wordpress.com/
- */
- int rpin = 3; // pin RED
- int gpin = 5; // pin GREEN
- int bpin = 6; // pin BLU
- unsigned int r=0, g=0, b=0,bm=0; // valori rgb e coefficiente divisore del blu
- unsigned int valh=0, vals=0, valv=0; // hue, saturation, value
- unsigned int sensorValue; // variabile che memorizza il valore dei potenziometri
- const int analogInPin = A0; // pin dei potenziometri
- const int analogInPin2 = A1;
- const int digitalInPin = 10; // pin del deviatore
- const int digitalInPin2= 11;
- int red[]={255,255,135}; // array con i valori RGB della funzione "Bianco"
- int green[]={157,255,158};
- int blue[]={51,255,255};
- boolean DIG1, DIG2;
- long previousMillis = 0;
- int i=0,j=0;
- int dl=0; // delay
- void setup()
- {
- pinMode(digitalInPin,INPUT);
- pinMode(digitalInPin2,INPUT);
- }
- void loop()
- {
- DIG1=digitalRead(digitalInPin);
- DIG2=digitalRead(digitalInPin2);
- if (DIG1) {
- bm=1.1;
- HSV_Game();
- }
- else if (DIG2) {
- bm=1.9;
- RAINBOW_Game();
- }
- else {
- bm=2.4;
- LIGHT_Game();
- }
- analogWrite(rpin, r/1.09); // ROSSO
- analogWrite(gpin, g/1); // VERDE
- analogWrite(bpin, b/bm); // BLUE
- }
- // funzione di armonizzazione dei valori analogici tramite media aritmetica
- int SensorSmooth (int pin) {
- sensorValue=0;
- for (int i = 0; i<10; i++) { sensorValue+= analogRead(pin); } return int ((float)sensorValue/10+0.5); } // prima funzione: selezione del colore e della luminosità tramite potenziometri void HSV_Game() { valh = SensorSmooth(analogInPin); vals = 255; valv = SensorSmooth(analogInPin2); valh = map(valh,0,1023,0,359); valv = map(valv,0,1023,32,255); hsv2rgb(valh,vals,valv,r,g,b); } // seconda funzione: selezione di bianco caldo, bianco neutro e bianco freddo, oltre alla luminosità void LIGHT_Game() { valv = SensorSmooth(analogInPin2); valv = map(valv,0,1023,16,255); valh = SensorSmooth(analogInPin); if (valh=742) valh=2; if (valh>2) valh=1;
- r=red[valh]*valv/255;
- g=green[valh]*valv/255;
- b=blue[valh]*valv/255;
- }
- // terza funzione: selezione della velocità di rotazione tra tutti i colori e della luminosità
- void RAINBOW_Game() {
- dl = SensorSmooth(analogInPin); // tempo di pausa
- dl = map(dl,0,1023,1,100);
- valv = SensorSmooth(analogInPin2);
- valv = map(valv,0,1023,64,255);
- unsigned long currentMillis = millis();
- switch (j) {
- case 0:
- r=255*valv/255;
- g=i*valv/255;
- b=0*valv/255;
- break;
- case 1:
- r=(255-i)*valv/255;
- g=255*valv/255;
- b=0*valv/255;
- break;
- case 2:
- r=0*valv/255;
- g=255*valv/255;
- b=i*valv/255;
- break;
- case 3:
- r=0*valv/255;
- g=(255-i)*valv/255;
- b=255*valv/255;
- break;
- case 4:
- r=i*valv/255;
- g=0*valv/255;
- b=255*valv/255;
- break;
- case 5:
- r=255*valv/255;
- g=0*valv/255;
- b=(255-i)*valv/255;
- }
- if (currentMillis-previousMillis > (long)(100-dl)) { // usa millis invece che delay
- previousMillis=currentMillis;
- i=i+1;
- if (i==256) {
- i=1;
- j=j+1;
- if (j==6) j=0;
- }
- }
- }
- /* Funzione che trasforma HSV in RGB
- (c) Elco Jacobs, E-atelier Industrial Design TU/e, July 2011
- http://code.google.com/p/shiftpwm/source/browse/trunk/examples/ShiftPWM_Example1/hsv2rgb.cpp?r=3
- */
- void hsv2rgb(int hue, int sat, int val, unsigned int& r, unsigned int& g, unsigned int& b)
- {
- int H_accent = hue/60;
- int bottom = ((255 - sat) * val)>>8;
- int top = val;
- int rising = ((top-bottom) *(hue%60 ) ) / 60 + bottom;
- int falling = ((top-bottom) *(60-hue%60) ) / 60 + bottom;
- switch(H_accent) {
- case 0:
- r = top;
- g = rising;
- b = bottom;
- break;
- case 1:
- r = falling;
- g = top;
- b = bottom;
- break;
- case 2:
- r = bottom;
- g = top;
- b = rising;
- break;
- case 3:
- r = bottom;
- g = falling;
- b = top;
- break;
- case 4:
- r = rising;
- g = bottom;
- b = top;
- break;
- case 5:
- r = top;
- g = bottom;
- b = falling;
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement