実際、異なる色の間でフェードすることは可能です。また、Arduino の書籍や Web 上のコードで私が通常見逃しているのは、Arduino IDE で C++ クラスを記述できることです。したがって、C++ クラスを使用して色をフェードする例を示します。
すべてのピンがパルス幅変調 ( PWM )に対応しているわけではないため、解決すべき問題はどのピンに対して analogWrite を実行するかということです。Arduino デバイスでは、PWM をサポートするピンはチルダ「~」で示されます。Arduino UNO には、~3、~5、~6、~9、~10、~11 のデジタル ピンがあります。また、ほとんどの Arduino はこれらのピンを PWM に使用しますが、デバイスを確認してください。LED を 1 ミリ秒オンにし、1 ミリ秒オンにすることで、通常のデジタル ピンで PWM を作成できます。これにより、LED の 50% の電力が模倣されます。または、3 ミリ秒オンにして 1 ミリ秒オンにすると、75% の電力が模倣されます。
LED をフェードさせるには、PWM 値を増減して少し待つ必要があります。そうしないと、arduino が 1 秒間に何千回も LED をフェード/ディミングしようとし、フェード効果が見られないため、しばらく待つ必要があります。analogWrite( )
したがって、3 つの LED に対して2 番目のパラメータを徐々に減らしたり増やしたりする方法を探しています。より完全な説明については、たとえばArduino Cookbookの第 7 章を参照してください。とにかく、その本はArduinoファンにとっては良い読み物です!
そこで、OP のコードを調整して、多かれ少なかれ赤、緑、青の値の単なるコンテナーである「rgb_color」クラスを含めました。しかし、もっと重要なのはフェーダー クラスです。フェーダーのインスタンスが構築されるとき、適切なピンがそれぞれ赤、緑、青のコンストラクターにある必要があります。フェーダーにはvoid fade( const rgb_color& const rgb_color&)
、インカラーとアウトカラーの間のフェードを行うメンバー関数が含まれています。デフォルトでは、関数は入力カラーから出力カラーまで 10 ミリ秒の 256 ステップを実行します。(整数除算のため、これは実際には各ステップが 1/256 であることを意味するわけではありませんが、知覚的には気付かないことに注意してください)。
/*
* LedBrightness sketch
* controls the brightness of LEDs on "analog" (PWM) output ports.
*/
class rgb_color {
private:
int my_r;
int my_g;
int my_b;
public:
rgb_color (int red, int green, int blue)
:
my_r(red),
my_g(green),
my_b(blue)
{
}
int r() const {return my_r;}
int b() const {return my_b;}
int g() const {return my_g;}
};
/*instances of fader can fade between two colors*/
class fader {
private:
int r_pin;
int g_pin;
int b_pin;
public:
/* construct the fader for the pins to manipulate.
* make sure these are pins that support Pulse
* width modulation (PWM), these are the digital pins
* denoted with a tilde(~) common are ~3, ~5, ~6, ~9, ~10
* and ~11 but check this on your type of arduino.
*/
fader( int red_pin, int green_pin, int blue_pin)
:
r_pin(red_pin),
g_pin(green_pin),
b_pin(blue_pin)
{
}
/*fade from rgb_in to rgb_out*/
void fade( const rgb_color& in,
const rgb_color& out,
unsigned n_steps = 256, //default take 256 steps
unsigned time = 10) //wait 10 ms per step
{
int red_diff = out.r() - in.r();
int green_diff = out.g() - in.g();
int blue_diff = out.b() - in.b();
for ( unsigned i = 0; i < n_steps; ++i){
/* output is the color that is actually written to the pins
* and output nicely fades from in to out.
*/
rgb_color output ( in.r() + i * red_diff / n_steps,
in.g() + i * green_diff / n_steps,
in.b() + i * blue_diff/ n_steps);
/*put the analog pins to the proper output.*/
analogWrite( r_pin, output.r() );
analogWrite( g_pin, output.g() );
analogWrite( b_pin, output.b() );
delay(time);
}
}
};
void setup()
{
//pins driven by analogWrite do not need to be declared as outputs
}
void loop()
{
fader f (3, 5, 6); //note OP uses 9 10 and 11
/*colors*/
rgb_color yellow( 250, 105, 0 );
rgb_color orange( 250, 40, 0 );
rgb_color red ( 255, 0, 0 );
rgb_color blue ( 10, 10, 255 );
rgb_color pink ( 255, 0, 100 );
rgb_color purple( 200, 0, 255 );
rgb_color green ( 0, 255, 0 );
rgb_color white ( 255, 255, 255 );
/*fade colors*/
f.fade( white, yellow);
f.fade( yellow, orange);
f.fade( orange, red);
f.fade( red, blue);
f.fade( blue, pink);
f.fade( pink, purple);
f.fade( purple, green);
f.fade( green, white);
}