/* 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; } }