一、简介
现实中的太阳能板都是固定的,这对光源的利用有限,可不可以做出一个可以时刻追随光源的呢?假如我们在太阳能板的上下左右各放一个光敏电阻,然后比较光敏电阻的数值,来实现光源的追踪(本文只针对光源部分进行研究)。
二、材料
Arduino nano ×1、5516光敏电阻×4 、10KΩ电阻×4、面包板、杜邦线若干。(2KΩ电阻×4、发光二极管,不必须项,此处只是做显示用)
光敏电阻介绍
工作原理是基于内光电效应。在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻,为了增加灵敏度,两电极常做成梳状。用于制造光敏电阻的材料主要是金属的硫化物、硒化物和碲化物等半导体。通常采用涂敷、喷涂、烧结等方法在绝缘衬底上制作很薄的光敏电阻体及梳状欧姆电极,接出引线,封装在具有透光镜的密封壳体内,以免受潮影响其灵敏度。入射光消失后,由光子激发产生的电子 空穴对将复合,光敏电阻的阻值也就恢复原值。在光敏电阻两端的金属电极加上电压,其中便有电流通过,受到一定波长的光线照射时,电流就会随光强的增大而变大,从而实现光电转换。光敏电阻没有极性,纯粹是一个电阻器件,使用时既可加直流电压,也加交流电压。半导体的导电能力取决于半导体导带内载流子数目的多少。
光敏电阻器是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器。主要用于光的测量、光的控制、和光电转换。光敏电阻器都制成薄片结构,以便能够吸收更多的光能。该类电阻器的特点是入射光越强,电阻值就越小,入射光越弱,电阻值就越大。
建议在同种光源下测试光敏电阻的模拟数值,选出数值近似的四个,便于后于程序编写。
//测试单个光敏电阻模拟数值
#include <Arduino.h>
void setup()
{
Serial.begin(115200);
pinMode(A0, INPUT);
}
void loop()
{
int F1 = analogRead(A0);
Serial.println("++++++");
Serial.println(F1);
delay(2000);
}
三、接线部分
引脚 | 对应nano pin |
10 | 5V |
12 | A7 |
14 | A6 |
16 | A5 |
18 | A4 |
20 | A3 |
22 | A2 |
24 | A1 |
26 | A0 |
四、程序部分
#include <Arduino.h>
int error = 3; //设置容错范围
void setup() {
Serial.begin(115200);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A6, INPUT);
pinMode(A7, INPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
delay(200);
}
void loop() {
//读取模拟值0-1023
int F5 = analogRead(A0);
int F6 = analogRead(A1);
int F7 = analogRead(A6);
int F8 = analogRead(A7);
//0-1023转换为0-255
int F1 = map(F5,0,1023,0,255);
int F2 = map(F6,0,1023,0,255);
int F3 = map(F7,0,1023,0,255);
int F4 = map(F8,0,1023,0,255);
Serial.println("++++++++++++");
Serial.println(F5);
Serial.println(F6);
Serial.println(F7);
Serial.println(F8);
int diff1= abs(F1 - F2);
int diff2= abs(F2 - F3);
int diff3= abs(F3 - F4);
int diff4= abs(F4 - F1);
//把灯关闭(没有加发光二极管可以忽略这四个写底及后面出现的写高)
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A4, LOW);
digitalWrite(A5, LOW);
if((diff1 <= error) && (diff2 <= error) && (diff3 <= error) && (diff4 <= error))
{
Serial.println("DO NOthing");
delay(2000);
}
else
{
if(F2-F1>3||F4-F1>5){
Serial.println("TURN UP");
digitalWrite(A2, HIGH);
delay(3000);
}
if(F1-F2>3||F3-F2>3){
Serial.println("TURN LEFT");
digitalWrite(A3, HIGH);
delay(3000);
}
if(F2-F3>3||F4-F3>3){
Serial.println("TURN DOWN");
digitalWrite(A4, HIGH);
delay(3000);
}
if(F1- F4>3||F3-F4>3){
Serial.println("TURN RIGHT");
digitalWrite(A5, HIGH);
delay(3000);
}
}
五、附
1、程序中用到了map函数把读到的模拟量0-1023转换成0-255,这样可以弥补四个光敏电阻的数值浮动。
2、模拟量的读取:
VCC | 电源5V |
R1 | 光敏电阻阻值 |
R2 | 10KΩ电阻 |