第 9 课 光敏电阻

介绍

在本课中,你将学习如何使用光敏电阻测量光强度。光敏电阻的电阻值随着入射光强度的变化而变化。如果光照强度变高,阻值减少;如果光强度变暗,阻值就会增加。

所需器件

../_images/megac9.png

原理图

在这个实验中,我们将用8个LED灯来显示光的强度。光强度越高,越多的LED灯会亮起来。当光强度足够高时,所有的LED灯都会亮起来。当没有光,所有的LED灯都会熄灭。

原理图如下所示:

../_images/mega20.png

实验步骤

第 1 步:搭建电路。

../_images/image142.png

第 2 步:打开代码文件 Lesson_9_Photoresistor.ino

第 3 步:选择 开发板端口

第 4 步:点击 上传 按钮来上传代码。

现在,用一些光照在光敏电阻上,你会看到几个LED灯亮起来。照更多的光,你会看到更多的LED灯亮起来。当你把它放在一个黑暗的环境中,所有的LED都会熄灭。

../_images/image143.jpeg

代码

代码分析

设置变量

const int NbrLEDs = 8; // 8 leds
const int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // 8 leds attach to pin 5-12 respectively
const int photocellPin = A0; // photoresistor attach to A0
int sensorValue = 0; // value read from the sensor
int ledLevel = 0; // sensor value converted into LED 'bars'

8个LED被连接到5引脚-12引脚,在这段代码中,使用一个数组来存储这些引脚, ledPins[0] 等于5, ledPins[1] 等于6,以此类推。

设置8个引脚为输出

for (int led = 0; led < NbrLEDs; led++)
{
    pinMode(ledPins[led], OUTPUT); // make all the LED pins outputs
}

使用 for() 语句将8个引脚依次设置为输出。 依次为OUTPUT。

读取光敏电阻的模拟值

sensorValue = analogRead(photocellPin); // read the value of A0

读取 photocellPin (A0引脚)的值并存储到变量 sensorValue 中。

  • analogRead():从指定的模拟引脚读取数值。Arduino板包含一个多通道、10位的模拟数字转换器。这意味着它将映射出0到工作电压(5V或3.3V)之间的输入电压。电压(5V或3.3V)之间的输入电压映射为0至1023之间的整数值。

Serial.print("SensorValue: ");
Serial.println(sensorValue); // Print the analog value of the photoresistor

使用 Serial.print() 函数来打印光敏电阻的模拟值,你将在串口监视器中看到它们。

  • Serial.print():将数据作为人类可读的ASCII文本打印到串口。这个命令可以有多种形式。数字被打印为每个数字的ASCII字符。浮点数同样被打印为ASCII数字,默认为两位小数。字节以单个字符的形式发送。字符和字符串按原样发送。

  • Serial.println():与 Serial.print() 相同,但它后面有一个回车字符(ASCII 13,或'r')和一个换行字符(ASCII 10,或'n')。

将模拟值映射到8个LED上

ledLevel = map(sensorValue, 0, 1023, 0, NbrLEDs); // map to the number of LEDs
Serial.print("ledLevel: ");
Serial.println(ledLevel);

这个 map() 函数是用来将 0-1023 映射到0-NbrLEDs(8)。

(1023-0)/(8-0)=127.875

0-12 7.875

128-2 55.75

2 56-38 3.625

384- 511.5

5 12-63 9.375

640-7 67.25

7 68-89 5.125

896 -1023

0

1

2

3

4

5

6

7

如果 sensorValue 等于560,则 ledLevel 为4.

  • map(value, fromLow, fromHigh, toLow, toHigh) 函数是将数字从一个范围重新映射到另一个范围。也就是说,值fromLow将被映射到了tolow,值fromHigh到toHigh,值之间以值之间,等等。

点亮LED灯

for (int led = 0; led < NbrLEDs; led++)
{
    if (led <= ledLevel ) //When led is smaller than ledLevel, run the following code.
    {
        digitalWrite(ledPins[led], HIGH); // turn on pins less than the level
    }
    else
    {
        digitalWrite(ledPins[led], LOW); // turn off pins higher than
    }
}

点亮相应的LED。例如,当 ledLevel 为4时,点亮 ledPins[0]ledPins[4],熄灭 ledPins[5]ledPins[7]