课程简介
在本课中,您将首先使用串口监视器来显示模拟量读数,然后使用第4课中的8个led来扩展测试项目,这样您就可以通过旋转可变电阻器上的旋钮来控制点亮的led数量。
概念解释
在开始课程之前,我们先来了解一下什么是模拟量。
模拟量是指变量在一定范围连续变化的量;也就是在一定范围(定义域)内可以取任意值(在值域内)。数字量是分立量,而不是连续变化量,只能取几个分立值,如二进制数字变量只能取两个值。如下图所示:
在本课程中,是通过一只可变电阻器分压来改变电压,从而产生连续变化的模拟量。
要学习本课中描述的项目,您需要以下东西。
材料 数量
5mm 红色Led灯 8只
270Ω电阻(红色,紫色,棕色条纹)
74 hc595移位寄存器芯片 1片
10 kΩ可变电阻器 1只
面包板 1块
Arduino Uno 开发板 1块
跳线包 1
第一个实验
在我们继续使用led之前,您可以尝试做一个小实验,只使用可变电阻器(也称为电位计(通常简称为pot))和Arduino串口监视器。
按下图所示在面包板上连线:
将以下程序加载到Arduino开发板上。
/*
Adafruit Arduino - Lesson 8. Analog Inputs
*/
int potPin = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
int reading = analogRead(potPin);
Serial.println(reading);
delay(500);
}
现在打开串口监视器,您将看到出现打印的数字值。
转动可变电阻器上的旋钮,你会看到数字在0到1023之间变化。
串行监视器显示数从A0引脚读到的模拟量数据:
int reading = analogRead(potPin);
A0端口的电压被转换成0到1023之间的数字。
可变电阻(电位器)
由于历史原因,可变电阻器英语通常被称为“pots”,是“potentiometers”的缩写。
在我们使用串行监视器的实验,电位器以某种方式改变A0处的电压,而这个小测试程序将该电压转换为0到1023之间的数字。
你的电位器有圆形的“旋钮”,充当一个电阻,在我们的例程中是10 kΩ电阻器。然而,与电阻的不同之处在于,还有一个中间连接称为“滑块”。当你旋转电位器时,这个滑块就会旋转。所以如果你把电位器的一端连接到5V,另一端连接到GND,那么当你旋转的时候,滑动端上的电压就会在0到5V之间变化。
面包板布局
让我们用这个电位器来做一些更有趣的事情。我们可以用它来控制点亮的led灯的数量。
这个面包板的布局是基于第4课,有一些跳线移动,和电位器和其它的连接到Arduino板。
Arduino代码
将以下程序下载到Arduino开发板上。
/*
Adafruit Arduino - Lesson 8. Analog Inputs - LEDs
*/
int potPin = 0;
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
int leds = 0;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
int reading = analogRead(potPin);
int numLEDSLit = reading / 114; //1023 / 9
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
updateShiftRegister();
}
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
您应该从第4课中了解到这段代码的大部分内容。所以请参考第4课,了解更多关于led如何控制的信息。
代码解读
程序的关键部分,就模拟输入而言,是我们定义的输入引脚,我们将连接到电位器的滑动端到模拟量输入引脚:
int potPin = 0;
请注意,我们不需要在'Setup'设置模拟输入的引脚模式。
在loop函数中,我们这样读取模拟值:
int reading = analogRead(potPin);
但是这个0到1023之间的读数需要转换成控制led灯所需数值,在0到8之间的数字范围,0到8实际上是9个值。所以我们需要把读数乘以1023除以9或者114。
为了点亮正确数量的led灯,我们使用for循环来从0数到LED灯最大数量值,并将该位设置在相应位置。
leds = 0;
for (int i = 0; i < numLEDSLit; i++)
{
bitSet(leds, i);
}
最后,我们更新移位寄存器更新函数:
updateShiftRegister();
其它练习
实际上,点亮一个LED灯来指示旋钮的位置更简单。你可以自己试着修改你的程序来实现到这一点。