使用Arduino控制LED的亮度
Controlling the brigthness of LED using Arduino
我写了一个示例代码,通过控制连接到 Arduino 的 LED 的占空比来测量 LED 的亮度。我想获得特定时期内最不亮光到最大亮光的范围。当我设置 desired_brightness = 1 时,LED 以 93 lux 单位发光,这不是最不明亮的光。关于如何获得最不明亮的光线有什么建议吗?
int led = 3; // the pin that the LED is attached to
int brightness =0; // how bright the LED is
int incrementfactor = 10; // how many points to fade the LED by
int desired_brightness = 255 ;
int extra_delay = 1000;
void setup() { // declare pin 9 to be an output:
pinMode(led, OUTPUT);
analogWrite(led, desired_brightness);
}
void loop() {
analogWrite(led, desired_brightness);
brightness=brightness+incrementfactor;
if (brightness==desired_brightness) {
delay(extra_delay);
}
}
我对你的代码做了一些调整。主要问题是您会立即达到最大亮度,并且永远不会降低它。 analogWrite()
只取 0 到 255 之间的值。您从 255 开始并从那里增加,所以它只是保持明亮。试试这个,这是你现在在很多电子设备上看到的 "breathing effect",并且永远循环:
int ledPin = 3; // the pin that the LED is attached to
int brightness =0; // how bright the LED is
int extra_delay = 1000; // the extra delay at max
int super_delay = 5000; // super delay at min
int direction = 1; // the dimmer-brighter direction
void setup() {
pinMode(ledPin, OUTPUT);
analogWrite(ledPin, 0);
}
void loop() {
analogWrite(ledPin, brightness); // light at certain brightness
//delay(5); // wait a bit, stay at this level so we can see the effect!
delay(50); // longer delay means much slower change from bright to dim
if (direction == 1) // determine whether to go brighter or dimmer
brightness += 1;
else
brightness -= 1;
if (brightness == 255) // switch direction for next time
{
direction = -1;
delay(extra_delay); // extra delay at maximum brightness
}
if (brightness == 0) // switch direction, go brighter next time
{
direction = 1;
delay(super_delay); // super long delay at minimum brightness
}
}
这会变得更亮,然后变暗,然后重复。延迟非常重要——您可以减少或延长它,但没有它,变化发生得如此之快,您无法用肉眼看到,只能在示波器上看到。希望对您有所帮助!
编辑:
在最小亮度下添加了一个 "super delay" 用于测量该级别。
要记住的一件事是像这样的脉宽调制仍然会从输出引脚提供全驱动电压。PWM 只是改变引脚的时间比率高与低。在这个 Aduino 上,它仍然是一个在 0V 和 3.3V 之间瞬时且相当快速地摆动的电压。要从该输出获得 true 模拟电压,需要一些电路将 PWM 的高电平和低电平过滤为更平滑的平均直流电压。如果您想要这样做,请搜索 "RC low-pass filter" 或访问网站 like this one.
我写了一个示例代码,通过控制连接到 Arduino 的 LED 的占空比来测量 LED 的亮度。我想获得特定时期内最不亮光到最大亮光的范围。当我设置 desired_brightness = 1 时,LED 以 93 lux 单位发光,这不是最不明亮的光。关于如何获得最不明亮的光线有什么建议吗?
int led = 3; // the pin that the LED is attached to
int brightness =0; // how bright the LED is
int incrementfactor = 10; // how many points to fade the LED by
int desired_brightness = 255 ;
int extra_delay = 1000;
void setup() { // declare pin 9 to be an output:
pinMode(led, OUTPUT);
analogWrite(led, desired_brightness);
}
void loop() {
analogWrite(led, desired_brightness);
brightness=brightness+incrementfactor;
if (brightness==desired_brightness) {
delay(extra_delay);
}
}
我对你的代码做了一些调整。主要问题是您会立即达到最大亮度,并且永远不会降低它。 analogWrite()
只取 0 到 255 之间的值。您从 255 开始并从那里增加,所以它只是保持明亮。试试这个,这是你现在在很多电子设备上看到的 "breathing effect",并且永远循环:
int ledPin = 3; // the pin that the LED is attached to
int brightness =0; // how bright the LED is
int extra_delay = 1000; // the extra delay at max
int super_delay = 5000; // super delay at min
int direction = 1; // the dimmer-brighter direction
void setup() {
pinMode(ledPin, OUTPUT);
analogWrite(ledPin, 0);
}
void loop() {
analogWrite(ledPin, brightness); // light at certain brightness
//delay(5); // wait a bit, stay at this level so we can see the effect!
delay(50); // longer delay means much slower change from bright to dim
if (direction == 1) // determine whether to go brighter or dimmer
brightness += 1;
else
brightness -= 1;
if (brightness == 255) // switch direction for next time
{
direction = -1;
delay(extra_delay); // extra delay at maximum brightness
}
if (brightness == 0) // switch direction, go brighter next time
{
direction = 1;
delay(super_delay); // super long delay at minimum brightness
}
}
这会变得更亮,然后变暗,然后重复。延迟非常重要——您可以减少或延长它,但没有它,变化发生得如此之快,您无法用肉眼看到,只能在示波器上看到。希望对您有所帮助!
编辑:
在最小亮度下添加了一个 "super delay" 用于测量该级别。
要记住的一件事是像这样的脉宽调制仍然会从输出引脚提供全驱动电压。PWM 只是改变引脚的时间比率高与低。在这个 Aduino 上,它仍然是一个在 0V 和 3.3V 之间瞬时且相当快速地摆动的电压。要从该输出获得 true 模拟电压,需要一些电路将 PWM 的高电平和低电平过滤为更平滑的平均直流电压。如果您想要这样做,请搜索 "RC low-pass filter" 或访问网站 like this one.