Oh!Coder

Coding Life

好玩的Arduino-数值校准

| Comments

Hi,大家好!上一次,我们给大家介绍了一位新成员,代号叫Arduino Mega2560,在这里跟大家提个醒儿,在以后的学习中,只要Arduino UNO能完成的实验,用Mega2560也一定能完成。好,就酱!下面继续我们今天新的内容。

在实际使用中,我们很有可能会遇到一种情况,将模拟信号接口获取到的数值进行重新校准,以方便我们在项目中接下来的实际操作中,使用起来更加便捷。今天我们就来一起看看,关于这个问题,到底是如何解决的。

首先,还是先来看看,我们都需要哪些硬件吧。

硬件方面

arduino-data-calibration-parts

图片来源:Arduino电路硬件

具体如下:

  • Arduino UNO(1块)
  • 面包板(1块)
  • 220Ω电阻(1个)
  • 10KΩ电阻(1个)
  • LED神灯(1个)
  • 光敏电阻(1个)
  • 面包线(若干)

嗯,看起来没有陌生的面孔,之前我们都见过的。好,继续。

软件方面

Arduino官方提供的IDE

连接电路

arduino-data-calibration

图片来源:Arduino电路连接

还好还好,电路连接也不是特别复杂。在之前的学习中,我们已经对光敏电阻学习过,所以对它的电路连接应该也比较熟悉了。如果一切顺利,让我们进行最后一步。

添加几行代码

首先,还是新建一个项目窗口。

arduino-ide-new

图片来源:Arduino官方IDE

然后向其中添加几行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// 定义光敏电阻模拟信号引脚常量
const int sensorPin = A0;
// 定义LED神灯数字信号引脚常量
const int ledPin = 9;
// 定义接收光敏电阻模拟信号数值变量
int sensorValue = 0;
// 定义光敏电阻模拟信号最小数值变量,
// 初始化为最大常见整数值1023。
int sensorMin = 1023;
// 定义光敏电阻模拟信号最大数值变量,
// 初始化为最小常见整数值0。
int sensorMax = 0;
// 对Arduino电路板或相关状态进行初始化方法
void setup() {
  // 定义13号数字引脚为输出类型引脚
  pinMode(13, OUTPUT);
  // 将13号引脚的状态初始化为高电压,
  // 也即将Arduino UNO电路板上自带的
  // 那盏LED神灯点亮。
  // 点亮此LED神灯的目的是为了清晰的指示
  // 接下来要进行的5秒钟操作。
  digitalWrite(13, HIGH);
  // 在最开始的5秒钟,不停地获取光敏电阻的
  // 数值,以此在这5秒钟内得到其中的最大和
  // 最小数值。
  while (millis() < 5000) {
    sensorValue = analogRead(sensorPin);
    // 比较获取到的数值,
    // 如果比sensorMax数值大,
    // 则赋值给sensorMax,以此记录最终得到
    // 的最大值。
    if (sensorValue > sensorMax) {
      sensorMax = sensorValue;
    }
    // 比较获取到的数值,
    // 如果比sensorMin数值小,
    // 则赋值给sensorMin,以此记录最终得到
    // 的最小值。
    if (sensorValue < sensorMin) {
      sensorMin = sensorValue;
    }
  }
  // 5秒钟过后,将13号数字引脚的数值
  // 设置为低电压,以此熄灭Arduino UNO
  // 电路板自带的那盏LED神灯。
  digitalWrite(13, LOW);
}
// 系统调用,无限循环方法
void loop() {
  // 读取光敏电阻的数值
  sensorValue = analogRead(sensorPin);
  // 使用map()方法,将获取到的sensorValue数值,
  // 从sensorMin~sensorMax的数值范围内,
  // 映射到0~255数值范围内的某个数值。
  sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
  // 保证映射完成之后的sensorValue数值在0~255范围内。
  // 第一个参数是输入值,
  // 第二个参数和第三个参数是数值的取值范围。
  // 返回值被限定在0~255之间。
  sensorValue = constrain(sensorValue, 0, 255);
  // 将最终校准后的数值设置给LED神灯
  analogWrite(ledPin, sensorValue);

好!代码一共就这几行,只有一个新面孔,那就是constrain()方法。这个方法的使用也很简单,代码的注释里已经说明了使用方法,这里不再啰嗦。

arduino-menu

图片来源:Arduino官方IDE的文件编辑菜单选项

点击上图中标有向右指向的箭头图标,将编写完成的代码烧入Arduino电路板。如果一切顺利,LED神灯的亮度会随着光敏电阻的光线强弱进行变化。

总结

通过这次学习,我们知道了如何校准数值。这对于主要以模拟信号的传感器而言,有时候是非常必要的,可以过滤掉忽高忽低的数值,并将最终数值强制变换到指定的某个数值范围内,对于数值的稳定起到很关键的作用。在我们做的这个实验中,光敏电阻越亮,产生的数值越大,相应的LED神灯也就越亮。那如果想让光敏电阻越暗,LED神灯变的越亮应该怎么办呢?如果改装一下,就可以变身一款时髦的应急灯喽!可以开动脑筋想一想!

下期预告

对于模拟信号的传感器,产生的数值有可能不是非常的稳定,或者说偶尔有可能会产生忽高忽低的数值,那如何让获取到的模拟数值变的连贯平滑呢?好!下一次我们就解决这个问题!

Comments