极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 188987|回复: 91

Arduino入门教程--第九课--用Arduino做0-5V量程的电压表

  [复制链接]
发表于 2012-6-20 12:24:56 | 显示全部楼层 |阅读模式
我们今天要涉及两个新的内容,arduino的串口通讯与模拟口的使用,模拟口之前我们介绍过就是可以测量0-5V的电压,然后对应返回0-1024的数值,今天我们就要利用arduino模拟口这个功能,来制作一个0-5V的电压表

注意:本实验电路设计没有相对复杂的保护电路,所以,千万别使用超过两节以上的AA电池,并且不要用来测量锂电池或者其他电源!!


需要准备的电子元件清单

ocrobot mango控制板(Arduino兼容)  一块  
面包板  一块  
面包板专用跳线  一盒  
1KΩ电阻  一枚  
USB连接线  一根  









下面我们来看设计的电路连接图



图上使用1K电阻的目的是在测量端悬空的情况下,将GND的基准电平引导到测量口,避免接口悬空受到干扰,

我们按照电路连接图搭建对应的实物电路





然后就去下载我们的程序,程序源代码如下,会涉及到一些串口的语句和模拟口的语句,具体语法请参考arduino语法手册

  1. /*
  2. 作者:极客工坊-迷你强
  3. 时间:2012年6月19日
  4. IDE版本号:1.0.1
  5. 发布地址:[url=http://www.geek-workshop.com]www.geek-workshop.com[/url]
  6. 作用:介绍使用arduino模拟口测量电压,作为0-5V电压表使用实验

  7. */

  8. float temp;   //创建一个浮点型变量temp作为存储空间准备存放数据
  9. void setup()
  10. {
  11.   Serial.begin(9600);     //使用9600的波特率进行串口通讯
  12. }
  13. void loop()
  14. {
  15.   
  16.   int V1 = analogRead(A0);                    
  17. //从A0口读取电压数据存入刚刚创建整数型变量V1,模拟口的电压测量范围为0-5V 返回的值为0-1024
  18.   float vol = V1*(5.0 / 1023.0);               
  19. //我们将 V1的值换算成实际电压值存入浮点型变量 vol
  20.   if (vol == temp)                             
  21. //这部分的判断是用来过滤重复的数据,只有本次的电压值和上次不一时才进行输出
  22.   {
  23.     temp = vol;                               //比较完成后,将这次的值存入比对比用的变量temp
  24.   }
  25.   else
  26.   {
  27.     Serial.print(vol);                       //串口输出电压值,并且不换行  
  28.     Serial.println(" V");                    //串口输出字符V,并且换行
  29.     temp = vol;
  30.     delay(1000);                           //输出完成后等待1秒钟,用于控制数据的刷新速度。
  31.   }
  32. }
复制代码


与以前不同的是,这次我们要用电脑来接收arduino传回的数据,所以我们不能像以前那样下载完程序就把编译器给关了,而是如下图,点击打开串口监视器







然后用红色的线测量电池正极,黑色的线测量电池负极串口监视器里就会以1秒一次的速度刷新电压值,2次的电压值有波动是正常的,因为我们毕竟是低精度的测试。

好最后看我们的实验视频




如果无法看清,请点击全屏

==========分割线 下面为扩展阅读==========

本次实验所用到的语法请点击关键字进入极客工坊WIKI查看,词条内容在WIKI中不定期更新。
void
setup()
loop()
float
int
Serial.begin()
Serial.print()
Serial.println()
analogRead()
if...else

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-6-1 14:50:56 | 显示全部楼层
我把楼上的评论全部看完了,还是没有我想要知道的答案,此帖已经这么多年过去了,不知道楼主是否会依旧耐心回答问题,其实我只是想知道楼主这句话:"图上使用1K电阻的目的是在测量端悬空的情况下,将GND的基准电平引导到测量口,避免接口悬空受到干扰"     的详细解释,因为我发现如我没有并联发那个电阻,那么悬空时电压显示会非常奇怪,我想知道这是为什么 ?
回复 支持 1 反对 0

使用道具 举报

发表于 2014-11-14 12:12:04 | 显示全部楼层
乐_乐(顺) 发表于 2012-7-27 17:07
小强哥,这个程序我有3个问题哦~~
1】这个公式浮点float vol=A1*(5.0/1023.0),这个公式是什么意思,不明白 ...

我自己认为好像是0-1023,然后有1024个。。。。
回复 支持 1 反对 0

使用道具 举报

发表于 2012-6-20 22:21:55 | 显示全部楼层
学习了,谢谢
回复 支持 反对

使用道具 举报

发表于 2012-7-27 17:07:30 | 显示全部楼层
小强哥,这个程序我有3个问题哦~~
1】这个公式浮点float vol=A1*(5.0/1023.0),这个公式是什么意思,不明白。为什么除1023,而不是1024?
2】Serial,pint是不是意思是输出VOL?
3】println(“V”)这个WIKI里面没解释,不知道是啥意思,简单的看就是输出一个单位?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-30 08:53:53 | 显示全部楼层
乐_乐(顺) 发表于 2012-7-27 17:07
小强哥,这个程序我有3个问题哦~~
1】这个公式浮点float vol=A1*(5.0/1023.0),这个公式是什么意思,不明白 ...


1  arduino的最大值只能返回1023.。。。原理貌似计算机原理中有,我忘记了
2 Serial,print就是串口输出vol这个变量,(print没有加ln表示不换行)
3 println(“V”)的意思是串口输出字符V。。。。就是为了给前面输出的变量带一个单位
回复 支持 反对

使用道具 举报

发表于 2012-7-30 09:52:40 | 显示全部楼层
迷你强 发表于 2012-7-30 08:53
1  arduino的最大值只能返回1023.。。。原理貌似计算机原理中有,我忘记了
2 Serial,print就是串口输出 ...

括号里的换行,不换行,是用“”表示吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-30 15:54:57 | 显示全部楼层
乐_乐(顺) 发表于 2012-7-30 09:52
括号里的换行,不换行,是用“”表示吗?

括号里基本不用。。基本上都是些print 与println 无非是多写一行的事情。。。貌似用C语言的转义字符是可以的
回复 支持 反对

使用道具 举报

发表于 2012-7-31 19:58:22 | 显示全部楼层
迷你强 发表于 2012-7-30 15:54
括号里基本不用。。基本上都是些print 与println 无非是多写一行的事情。。。貌似用C语言的转义字符是可以 ...

这里的float temp必须放在viod setup()之前吗?为什么呢?这方面WIKI里面没有找到。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 20:17:54 | 显示全部楼层
乐_乐(顺) 发表于 2012-7-31 19:58
这里的float temp必须放在viod setup()之前吗?为什么呢?这方面WIKI里面没有找到。。

具体为啥请参阅c语言,这个变量创建的位置,一个大括号表示一个域,在括号内的为局部变量,到括号外就无效了。。我这个在所有括号外,叫做全局变量,对整个程序有效,看你的实际情况选择变量创建的位置
回复 支持 反对

使用道具 举报

发表于 2012-8-1 14:12:09 | 显示全部楼层
迷你强 发表于 2012-7-31 20:17
具体为啥请参阅c语言,这个变量创建的位置,一个大括号表示一个域,在括号内的为局部变量,到括号外就无效 ...

谢谢啊,看来得学点C语言。。。
回复 支持 反对

使用道具 举报

发表于 2012-9-19 19:39:59 | 显示全部楼层
好东西,顶
回复 支持 反对

使用道具 举报

发表于 2012-9-19 20:11:18 | 显示全部楼层
好东西,顶~
回复 支持 反对

使用道具 举报

发表于 2012-10-17 11:10:47 | 显示全部楼层
乐_乐(顺) 发表于 2012-7-27 17:07
小强哥,这个程序我有3个问题哦~~
1】这个公式浮点float vol=A1*(5.0/1023.0),这个公式是什么意思,不明白 ...

1024因为10位AD传感器只能反馈 1024级就是从
十六进制的0-3FF
二进制的0-1111111111
因为包含的0.
学过计算机编程的都知道大多数的记数都是0开始而不是1, 数组的开头是 XYZ[0]。。。。XYZ[N] 数组长度是N+1,因为0也是有效的
包括你看BIOS都是IDE0-IDE3不会是IDE1-IDE4
回复 支持 反对

使用道具 举报

发表于 2012-10-17 11:15:31 | 显示全部楼层
乐_乐(顺) 发表于 2012-8-1 14:12
谢谢啊,看来得学点C语言。。。

C语言是玩好ARDUINO的基础,否则只能是复制而不能自己写,甚至读和改都会有困难。

数据定义一般全局变量都是外部的(只要是别的函数需要使用到这个变量的都是全局变量)
定义到某一个函数内,只要这个函数调用结束数据就会被释放(这个再次调用会被再次初始化和赋值,前面结束时的值不会影响到新的调用)
回复 支持 反对

使用道具 举报

发表于 2012-10-17 11:18:14 | 显示全部楼层
我请教个问题,上文档中提到不要测量2节以上的电池,以及不要测量锂电池之类,个人理解只要不超过5V应该不会对AD转换器造成不可逆的损坏吧?(ADRUNIO的模拟脚貌似可以读取0-5V的电压)
还是说还有什么其他缘由?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-18 08:02:24 | 显示全部楼层
darkorigin 发表于 2012-10-17 11:18
我请教个问题,上文档中提到不要测量2节以上的电池,以及不要测量锂电池之类,个人理解只要不超过5V应该不会 ...


对。未加任何保护电路和分压电路的情况下,不要往模拟口输入更高电压,否则坏了就麻烦了。。。虽然三节、四节用了一段时间的镍氢充电电池没啥问题,只是谨慎起见(如果是4节碱性电池,新电池的电压约为1.7V,串联测试的话会有6.8V的电压)
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 01:19 , Processed in 0.066051 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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