Nó thực sự có thể mờ dần giữa các màu khác nhau. Những gì tôi cũng thường thiếu trong các cuốn sách và mã Arduino trên web là, có thể viết các lớp C++ trong Arduino IDE. Vì vậy, tôi sẽ hiển thị một ví dụ mờ dần giữa các màu sử dụng các lớp C++.
Một vấn đề cần được giải quyết là trên đó pins analogWrite nên được thực hiện để, bởi vì không phải tất cả các chân có khả năng điều chế độ rộng xung (PWM). Trên một thiết bị Arduino, các chân hỗ trợ PWM được biểu thị bằng dấu ngã '~'. Arduino UNO có chân số ~ 3, ~ 5, ~ 6, ~ 9, ~ 10 và ~ 11. Và hầu hết Arduino sử dụng các chân cho PWM, nhưng hãy kiểm tra thiết bị của bạn để chắc chắn. Bạn có thể tạo PWM trên các chân kỹ thuật số thông thường bằng cách bật đèn LED của bạn trên 1ms và trong 1 mili giây này bắt chước 50% công suất trên đèn LED. Hoặc bật nó trên 3 ms và 1 ms này bắt chước 75% công suất.
Để làm mờ đèn LED, bạn sẽ phải giảm/tăng giá trị PWM và chờ một chút. Youl sẽ phải chờ một chút, bởi vì nếu không arduino sẽ cố gắng mờ dần/mờ dẫn hàng ngàn lần mỗi giây và bạn sẽ không thấy một hiệu ứng mờ dần, mặc dù nó có thể ở đó. Vì vậy, bạn đang tìm kiếm một phương pháp để giảm dần/tăng tham số thứ hai thành analogWrite()
cho ba đèn LED; Để được giải thích kỹ lưỡng hơn, xem ví dụ chương 7 của Arduino Cookbook. Cuốn sách đó là một cuốn sách tốt cho người hâm mộ Arduino!
Vì vậy, tôi đã điều chỉnh mã từ OP để chứa một lớp 'rgb_color' nhiều hơn hoặc ít hơn chỉ là một vùng chứa cho các giá trị màu đỏ, xanh lục và xanh dương. Nhưng quan trọng hơn là lớp fader. Khi một thể hiện của fader được xây dựng, các chốt thích hợp phải có trong hàm tạo đỏ, xanh lá cây và xanh dương tương ứng. So với fader chứa hàm thành viên void fade(const rgb_color& const rgb_color&)
sẽ làm mờ dần giữa màu trong và ngoài. Theo mặc định, chức năng sẽ mất 256 bước 10ms từ màu đầu vào đến màu đầu ra. (lưu ý ở đây do số nguyên phân chia này không thực sự có nghĩa là mỗi bước 1/256 th, nhưng nhận thức bạn sẽ không nhận thấy nó).
/*
* 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);
}
Các đèn LED có được kết nối với cổng AVR bằng cathode của chúng không? Hoặc những gì giải thích '255 - x' trong' AnalogWrite() '? –
Xin chào! Tôi đang sử dụng một cực dương (+) RGB LED, đó là lý do tại sao "255 -" là cần thiết. – KingPolygon
@userXXX OK, tôi hiểu, cảm ơn. –