风筝
发表于: 2018-6-8 20:41:30 | 显示全部楼层

“烟花过后,便是整个黑夜!”我们有时会忘记关灯,这样的话就会浪费电力,另外我们也一定还看到过白天路灯开着。在本篇文章中,我们不仅根据光线条件自动实现打开和关闭灯光,还会根据外部光线条件改变灯光的亮度。在这里,我们使用LDR和Arduino的PWM外设来自动降低或增加1瓦功率LED的亮度。PWM是指脉宽调制,通过PWM引脚输出的信号是一个模拟信号,并且Arduino认为是一个数字信号。它使用数字波的占空比来产生信号的模拟值。同时,该信号还用于控制电源LED的亮度。


所需的材料

●    Arduino UNO开发板

●    光敏电阻LDR

●    电阻(510欧和100k欧)

●    电容(0.1uF)

●    晶体管2N2222

●    1瓦功率LED

●    连接电线

●    面包板


电路原理图

使用Arduino实现功率LED自动强度控制的电路图

Circuit-diagram-for-Auto-Intensity-Control-of-Power-LED-using-Arduino.png


代码和说明

在文章的末尾处给出了使用Arduino实现自动LED调光的完整代码。


在下面的代码中,我们定义了PWM引脚和代码中要使用的变量。

  1. int pwmPin = 2; // assigns pin 12 to variable pwm
  2. int LDR = A0; // assigns analog input A0 to variable pot
  3. int c1 = 0;   // declares variable c1
  4. int c2 = 0;   // declares variable c2
复制代码

现在,在loop()函数中,我们首先使用函数“analogRead(LDR)”读取LDR的值,然后将该模拟输入值保存到一个名为“value”的变量中。通过做一些数学计算,我们产生PWM信号。在这里,只有在模拟值小于500的情况下,我们才会使用PWM来控制光的强度,如果超过500,我们会完全熄灭灯光。

  1. int value = analogRead(LDR);
  2.   Serial.println(value);
  3.   c1= value;
  4.   c2= 500-c1;     // subtracts c2 from 1000 ans saves the result in c1

  5.   if (value < 500)
  6.   {
  7.   digitalWrite(pwmPin, HIGH);
  8.   delayMicroseconds(c2);  
  9.   digitalWrite(pwmPin, LOW);
  10.   delayMicroseconds(c1);  
  11.   }

  12.   if (value > 500)
  13.   {
  14.     digitalWrite(2,LOW);
  15.   }
  16. }
复制代码

如何实现自动控制灯光亮度

根据电路图,我们使用LDR和100k电阻制作了一个分压电路。分压电路的输出连接到Arduino的模拟引脚。模拟引脚检测电压并将该模拟值传递给Arduino开发板。模拟值根据LDR的电阻而变化。因此,如果在LDR上变暗,其电阻会增加,因此电压值(模拟值)会减小。因此,模拟值改变PWM输出或占空比,并且占空比进一步与功率LED的光强度成比例。所以LDR上的光线会自动控制Power LED的强度。下面的流程图展示了它是如何工作的,向上的箭头符号表示“增加”,向下的箭头符号表示“减少”。

光强(在LDR上)↓ - 电阻↑ - 模拟引脚电压↓ - 占空比(PWM)↑电源LED亮度↑

如果外部非常亮(当模拟值增加到超过500)时,电源LED熄灭。

Auto-Intensity-Control-of-Power-LED-using-Arduino.jpg


代码

本篇文章使用的完整代码如下所示:

  1. int pwmPin = 2; // assigns pin 12 to variable pwm
  2. int pot = A0; // assigns analog input A0 to variable pot
  3. int c1 = 0;   // declares variable c1
  4. int c2 = 0;   // declares variable c2

  5. void setup()  // setup loop
  6. {
  7.   pinMode(pwmPin, OUTPUT);
  8.   pinMode(pot, INPUT);  
  9.   Serial.begin(9600);
  10. }

  11. void loop()
  12. {

  13.   int value = analogRead(pot);
  14.   Serial.println(value);
  15.   c1= value;
  16.   c2= 500-c1;         // subtracts c2 from 1000 ans saves the result in c1
  17.   
  18.   if (value < 500)
  19.   {
  20.   digitalWrite(pwmPin, HIGH);
  21.   delayMicroseconds(c2);   
  22.   digitalWrite(pwmPin, LOW);  
  23.   delayMicroseconds(c1);   
  24.   }

  25.   if (value > 500)
  26.   {
  27.     digitalWrite(2,LOW);
  28.   }
  29.   
  30. }
复制代码
跳转到指定楼层
AAA
发表于: 2019-5-12 17:12:39 | 显示全部楼层

大佬 请问这个面包板该怎么看呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-25 19:29 , Processed in 0.065235 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表