candale icon

RGB Lamp

candale | PRO | 06/18/14 09:45:21 AM UTC | 0 ⭐ | 336 👁️ | Never ⏰ | []
C |

4.46 KB

|

None

|

0 👍

/

0 👎

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

Comments