一板网电子技术论坛

风筝
发表于: 2020-4-8 12:13:23 | 显示全部楼层

在本篇文章中,我们主要将向您介绍如何使用LDR和伺服电机制作基于Arduino开发板的太阳能跟踪器。太阳能电池板跟踪器设计为跟随太阳的运动,以使最大的光照强度照射在太阳能电池板上,从而提高了功率效率。


我们设计了单轴太阳能跟踪系统。在此系统中,整个太阳能电池板在一天之内从东向西移动,指向太阳的方向。在能源生产领域中使用太阳能跟踪器电路将提高其效率。该系统还可以成功地在其他基于太阳能的项目中实施,例如热水器和蒸汽轮机。


太阳能跟踪器所需的组件

以下是设计太阳能跟踪器所需的组件列表:

●    Arduino Uno开发板

●    SG90伺服电机

●    轻触开关

●    电阻10K

●    面包板

●    连接线

●    5至12伏电源。


连接电路

下面给出了使用LDR和伺服电机的基于Arduino的太阳能跟踪器的电路图。如下图所示组装电路。

Untitled.jpg


项目设计与实施

1.  将纸板固定在伺服电机顶部,该纸板将面向阳光并旋转:

IMG_20180507_152135.jpg

2.  将两个LDR保持至少5 cm的距离来放置一个障碍物。

IMG_20180507_152050.jpg


太阳能跟踪器的工作过程:

两个LDR(光敏电阻)LDR1和LDR2连接到Arduino的模拟引脚。太阳能板与伺服电机的轴平行安装,两个传感器都固定在太阳能板上,如上图所示。


设计和布置以如下方式完成:太阳的运动是从LDR1到LDR2,如下图所示。

LDR-Sensor-Movement.jpg


有以下三种情况:

情况1:太阳在左侧

LDR1上的光较高,因为屏障的阴影落在LDR2上,因此太阳能板顺时针移动。

情况2:太阳在右边

LDR2上的光较高,因为屏障的阴影落在LDR1上,因此太阳能板会逆时针旋转。

案例3:太阳在中心

两个LDR上的光都相等,因此,太阳能板不会向任何方向旋转。


Arduino源代码

为了使用LDR和伺服电机设计基于Arduino的太阳能跟踪器,您需要对Atmega 328 Arduino微控制器进行编程。以下是将伺服电机和LDR与Arduino进行太阳能跟踪的程序。复制此代码并将其上传到您的Arduino开发板。

  1. #include <EEPROM.h>
  2. #include <Servo.h>

  3. Servo myservo;

  4. int sensor1=A1;
  5. int sensor2=A0 ;
  6. int calswitch=2;

  7. int val1;
  8. int val2;

  9. int pos=0;
  10. int error;
  11. int state;

  12. void setup() {
  13. pinMode(sensor1,INPUT);
  14. pinMode(sensor2,INPUT);
  15. pinMode(calswitch,INPUT);

  16. myservo.attach(10);
  17. }

  18. void loop() {
  19. if(digitalRead(calswitch)==0) {
  20. myservo.detach();

  21. val1=analogRead(sensor1);
  22. val2=analogRead(sensor2);

  23. if (val1>val2) {error=val1-val2; state=0; }
  24. else {error=val2-val1; state=1; }

  25. EEPROM.write(0,error);
  26. EEPROM.write(1,state);

  27. delay(1000);
  28. }

  29. else{
  30. myservo.attach(10);

  31. val1=analogRead(sensor1);
  32. val2=analogRead(sensor2);

  33. state=EEPROM.read(1);
  34. error=EEPROM.read(0);

  35. if(state==0) { val1=val1-error;}
  36. else { val2=val2-error;}

  37. if (val1-val2>4) {myservo.write(pos); pos=pos-1; delay(10);}
  38. else if (val2-val1>4) {myservo.write(pos); pos=pos+1; delay(10);}
  39. else {myservo.write(pos);}

  40. if (pos>90) {pos=90;}
  41. else if (pos<0) {pos=0;}

  42. }
  43. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 561 | 回复: 1099

精彩推荐



手机版|

GMT+8, 2021-6-21 03:17 , Processed in 0.035678 second(s), 31 queries . Powered by Discuz! X3.4

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

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