ディジタル出力は H と L の2種類です。アナログ出力はこの中間の電圧を出力する機能ですが、中間の電圧ではなく、出力する時間を制御する PWM
方式を利用します。
pinMode(端子番号, OUTPUT); analogWrite(端子番号, bright);すると、指定した出力端子には、bright で指定した割合でPWM 出力されます。
// white LED int wled=9; int bright = 0; int fade = 5; //変化量 void setup() { bright=20; pinMode(wled, OUTPUT);//LED.V Serial.begin(9600); } void loop() { analogWrite(wled, bright); bright = bright + fade; // 20以下になったときの処理 if (bright<= 20 ) { fade = -fade ; } // 255以上になったときの処理 if (bright >= 255) { fade = -fade ; } Serial.println(bright); // 100mS待つ delay(100); }
//FullColor LED //色の変化 int h; //int i,vi; //int p1,p2,p3; int r,g,b; float s,v; int rLED=11; int bLED=10; int gLED=9; void setup(){ Serial.begin(9600); h=0; s=1.0; v=1.0; } void loop(){ //hsvからrgbへの変換 hsv2rgb(h,s,v,&r,&g,&b); /* Serial.print(" "); Serial.print(g,HEX); Serial.print(" "); Serial.println(b,HEX); */ analogWrite(rLED,r); analogWrite(gLED,g); analogWrite(bLED,b); //s=s-0.02; //if(s<0.0) s=1.0; h=h+2; if(h>=360) h=0; delay(100); } void hsv2rgb(int h,float s,float v, int *rp, int *gp, int *bp){ int i,r,g,b,vi; int p1,p2,p3; float f; i = (int)(h/60.0); f = h/60.0 -i; p1=(int)(v*(1.0-s)*255.0); p2=(int)(v*(1.0-s*f)*255.0); p3=(int)(v*(1.0-s*(1.0-f))*255.0); vi=(int)(v*255.0); if(i==0) {r = vi ;g = p3 ;b = p1;} if(i==1) {r = p2 ;g = vi ;b = p1;} if(i==2) {r = p1 ;g = vi;b = p3;} if(i==3) {r = p1 ;g = p2 ;b = vi;} if(i==4) {r = p3 ;g = p1 ;b = vi;} if(i==5) {r = vi ;g = p1 ;b = p2;} *rp=r; *gp=g; *bp=b; }
//sinw[]の配列に、sinの値を2度単位に0..255の値の範囲に変換して記録 //R,B,G 3色の値を120度ずつ、ずらしてsinw[]の配列から設定する。 int rLED=11; int bLED=10; int gLED=9; int sinw[180]; int brightR = 0; int brightG = 0; int brightB = 0; int ang; long t1; void setup() { Serial.begin(9600); //2度単位のsinのテーブルを作成 t1=millis(); for(ang=0;ang<180;ang=ang+1){ sinw[ang]=127*(sin(ang * 3.14/90)+1); }//time 30mS //Serial.print("time:"); //Serial.println(millis()-t1); brightR=0; brightG=60; brightB=120; pinMode(6, OUTPUT);//LED 接続 pinMode(5, OUTPUT);// pinMode(3, OUTPUT);// } void loop() { analogWrite(rLED, sinw[brightR]); analogWrite(gLED, sinw[brightG]); analogWrite(bLED, sinw[brightB]); //Serial.print(sinw[brightR]); //Serial.print(","); //Serial.print(sinw[brightG]); //Serial.print(","); //Serial.println(sinw[brightB]); //R,G,,Bの表を参照する番号を更新する brightB = update(brightB); brightG = update(brightG ); brightR = update(brightR) ; delay(100); } //表をひく番号を進める int update(int bright){ bright = bright+1; if(bright>180) bright=0; return bright; }