|
“烟花过后,便是整个黑夜!”我们有时会忘记关灯,这样的话就会浪费电力,另外我们也一定还看到过白天路灯开着。在本篇文章中,我们不仅根据光线条件自动实现打开和关闭灯光,还会根据外部光线条件改变灯光的亮度。在这里,我们使用LDR和Arduino的PWM外设来自动降低或增加1瓦功率LED的亮度。PWM是指脉宽调制,通过PWM引脚输出的信号是一个模拟信号,并且Arduino认为是一个数字信号。它使用数字波的占空比来产生信号的模拟值。同时,该信号还用于控制电源LED的亮度。
所需的材料 ● Arduino UNO开发板 ● 光敏电阻LDR ● 电阻(510欧和100k欧) ● 电容(0.1uF) ● 晶体管2N2222 ● 1瓦功率LED ● 连接电线 ● 面包板
电路原理图 使用Arduino实现功率LED自动强度控制的电路图
代码和说明 在文章的末尾处给出了使用Arduino实现自动LED调光的完整代码。
在下面的代码中,我们定义了PWM引脚和代码中要使用的变量。 - int pwmPin = 2; // assigns pin 12 to variable pwm
- int LDR = A0; // assigns analog input A0 to variable pot
- int c1 = 0; // declares variable c1
- int c2 = 0; // declares variable c2
复制代码
现在,在loop()函数中,我们首先使用函数“analogRead(LDR)”读取LDR的值,然后将该模拟输入值保存到一个名为“value”的变量中。通过做一些数学计算,我们产生PWM信号。在这里,只有在模拟值小于500的情况下,我们才会使用PWM来控制光的强度,如果超过500,我们会完全熄灭灯光。 - int value = analogRead(LDR);
- Serial.println(value);
- c1= value;
- c2= 500-c1; // subtracts c2 from 1000 ans saves the result in c1
- if (value < 500)
- {
- digitalWrite(pwmPin, HIGH);
- delayMicroseconds(c2);
- digitalWrite(pwmPin, LOW);
- delayMicroseconds(c1);
- }
- if (value > 500)
- {
- digitalWrite(2,LOW);
- }
- }
复制代码
如何实现自动控制灯光亮度 根据电路图,我们使用LDR和100k电阻制作了一个分压电路。分压电路的输出连接到Arduino的模拟引脚。模拟引脚检测电压并将该模拟值传递给Arduino开发板。模拟值根据LDR的电阻而变化。因此,如果在LDR上变暗,其电阻会增加,因此电压值(模拟值)会减小。因此,模拟值改变PWM输出或占空比,并且占空比进一步与功率LED的光强度成比例。所以LDR上的光线会自动控制Power LED的强度。下面的流程图展示了它是如何工作的,向上的箭头符号表示“增加”,向下的箭头符号表示“减少”。 光强(在LDR上)↓ - 电阻↑ - 模拟引脚电压↓ - 占空比(PWM)↑电源LED亮度↑ 如果外部非常亮(当模拟值增加到超过500)时,电源LED熄灭。
代码 本篇文章使用的完整代码如下所示: - int pwmPin = 2; // assigns pin 12 to variable pwm
- int pot = A0; // assigns analog input A0 to variable pot
- int c1 = 0; // declares variable c1
- int c2 = 0; // declares variable c2
- void setup() // setup loop
- {
- pinMode(pwmPin, OUTPUT);
- pinMode(pot, INPUT);
- Serial.begin(9600);
- }
- void loop()
- {
- int value = analogRead(pot);
- Serial.println(value);
- c1= value;
- c2= 500-c1; // subtracts c2 from 1000 ans saves the result in c1
-
- if (value < 500)
- {
- digitalWrite(pwmPin, HIGH);
- delayMicroseconds(c2);
- digitalWrite(pwmPin, LOW);
- delayMicroseconds(c1);
- }
- if (value > 500)
- {
- digitalWrite(2,LOW);
- }
-
- }
复制代码 |