找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7736|回复: 1
打印 上一主题 下一主题
收起左侧

Arduino教程-数值校准

[复制链接]
跳转到指定楼层
楼主
Hi,大家好!上一次,我们给大家介绍了一位新成员,代号叫Arduino Mega2560,在这里跟大家提个醒儿,在以后的学习中,只要Arduino UNO能完成的实验,用Mega2560也一定能完成。好,就酱!下面继续我们今天新的内容。
在实际使用中,我们很有可能会遇到一种情况,将模拟信号接口获取到的数值进行重新校准,以方便我们在项目中接下来的实际操作中,使用起来更加便捷。今天我们就来一起看看,关于这个问题,到底是如何解决的。
首先,还是先来看看,我们都需要哪些硬件吧。
硬件方面
图片来源:Arduino电路硬件
具体如下:
  • Arduino UNO(1块)
  • 面包板(1块)
  • 220Ω电阻(1个)
  • 10KΩ电阻(1个)
  • LED神灯(1个)
  • 光敏电阻(1个)
  • 面包线(若干)
嗯,看起来没有陌生的面孔,之前我们都见过的。好,继续。
软件方面Arduino官方提供的IDE
连接电路
图片来源:Arduino电路连接
还好还好,电路连接也不是特别复杂。在之前的学习中,我们已经对光敏电阻学习过,所以对它的电路连接应该也比较熟悉了。如果一切顺利,让我们进行最后一步。
添加几行代码首先,还是新建一个项目窗口。

图片来源:Arduino官方IDE
然后向其中添加几行代码:


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



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

图片来源:Arduino官方IDE的文件编辑菜单选项
点击上图中标有向右指向的箭头图标,将编写完成的代码烧入Arduino电路板。如果一切顺利,LED神灯的亮度会随着光敏电阻的光线强弱进行变化。
总结通过这次学习,我们知道了如何校准数值。这对于主要以模拟信号的传感器而言,有时候是非常必要的,可以过滤掉忽高忽低的数值,并将最终数值强制变换到指定的某个数值范围内,对于数值的稳定起到很关键的作用。在我们做的这个实验中,光敏电阻越亮,产生的数值越大,相应的LED神灯也就越亮。那如果想让光敏电阻越暗,LED神灯变的越亮应该怎么办呢?如果改装一下,就可以变身一款时髦的应急灯喽!可以开动脑筋想一想!
下期预告对于模拟信号的传感器,产生的数值有可能不是非常的稳定,或者说偶尔有可能会产生忽高忽低的数值,那如何让获取到的模拟数值变的连贯平滑呢?好!下一次我们就解决这个问题!


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:239822 发表于 2017-10-23 10:30 | 只看该作者
楼主,你的下一期在哪呢,需要参考你的消抖思路,共享大爱,赞
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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