迷你强 发表于 2012-6-20 12:24:56

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

我们今天要涉及两个新的内容,arduino的串口通讯与模拟口的使用,模拟口之前我们介绍过就是可以测量0-5V的电压,然后对应返回0-1024的数值,今天我们就要利用arduino模拟口这个功能,来制作一个0-5V的电压表

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

需要准备的电子元件清单


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









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



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

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




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

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

*/

float temp;   //创建一个浮点型变量temp作为存储空间准备存放数据
void setup()
{
Serial.begin(9600);   //使用9600的波特率进行串口通讯
}
void loop()
{

int V1 = analogRead(A0);                  
//从A0口读取电压数据存入刚刚创建整数型变量V1,模拟口的电压测量范围为0-5V 返回的值为0-1024
float vol = V1*(5.0 / 1023.0);               
//我们将 V1的值换算成实际电压值存入浮点型变量 vol
if (vol == temp)                           
//这部分的判断是用来过滤重复的数据,只有本次的电压值和上次不一时才进行输出
{
    temp = vol;                               //比较完成后,将这次的值存入比对比用的变量temp
}
else
{
    Serial.print(vol);                     //串口输出电压值,并且不换行
    Serial.println(" V");                  //串口输出字符V,并且换行
    temp = vol;
    delay(1000);                           //输出完成后等待1秒钟,用于控制数据的刷新速度。
}
}

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






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

好最后看我们的实验视频

http://player.youku.com/player.php/sid/XNDE2MTQxNDA0/v.swf

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

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

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

wyj1239630590 发表于 2015-6-1 14:50:56

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

顺子 发表于 2014-11-14 12:12:04

乐_乐(顺) 发表于 2012-7-27 17:07 static/image/common/back.gif
小强哥,这个程序我有3个问题哦~~
1】这个公式浮点float vol=A1*(5.0/1023.0),这个公式是什么意思,不明白 ...

我自己认为好像是0-1023,然后有1024个。。。。

意见反馈 发表于 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 static/image/common/back.gif
小强哥,这个程序我有3个问题哦~~
1】这个公式浮点float vol=A1*(5.0/1023.0),这个公式是什么意思,不明白 ...

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

乐_乐(顺) 发表于 2012-7-30 09:52:40

迷你强 发表于 2012-7-30 08:53 static/image/common/back.gif
1arduino的最大值只能返回1023.。。。原理貌似计算机原理中有,我忘记了
2 Serial,print就是串口输出 ...

括号里的换行,不换行,是用“”表示吗?

迷你强 发表于 2012-7-30 15:54:57

乐_乐(顺) 发表于 2012-7-30 09:52 static/image/common/back.gif
括号里的换行,不换行,是用“”表示吗?

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

乐_乐(顺) 发表于 2012-7-31 19:58:22

迷你强 发表于 2012-7-30 15:54 static/image/common/back.gif
括号里基本不用。。基本上都是些print 与println 无非是多写一行的事情。。。貌似用C语言的转义字符是可以 ...

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

迷你强 发表于 2012-7-31 20:17:54

乐_乐(顺) 发表于 2012-7-31 19:58 static/image/common/back.gif
这里的float temp必须放在viod setup()之前吗?为什么呢?这方面WIKI里面没有找到。。

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

乐_乐(顺) 发表于 2012-8-1 14:12:09

迷你强 发表于 2012-7-31 20:17 static/image/common/back.gif
具体为啥请参阅c语言,这个变量创建的位置,一个大括号表示一个域,在括号内的为局部变量,到括号外就无效 ...

谢谢啊,看来得学点C语言。。。

939670129 发表于 2012-9-19 19:39:59

好东西,顶

939670129 发表于 2012-9-19 20:11:18

好东西,顶~

darkorigin 发表于 2012-10-17 11:10:47

乐_乐(顺) 发表于 2012-7-27 17:07 static/image/common/back.gif
小强哥,这个程序我有3个问题哦~~
1】这个公式浮点float vol=A1*(5.0/1023.0),这个公式是什么意思,不明白 ...

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

darkorigin 发表于 2012-10-17 11:15:31

乐_乐(顺) 发表于 2012-8-1 14:12 static/image/common/back.gif
谢谢啊,看来得学点C语言。。。

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

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

darkorigin 发表于 2012-10-17 11:18:14

我请教个问题,上文档中提到不要测量2节以上的电池,以及不要测量锂电池之类,个人理解只要不超过5V应该不会对AD转换器造成不可逆的损坏吧?(ADRUNIO的模拟脚貌似可以读取0-5V的电压)
还是说还有什么其他缘由?

迷你强 发表于 2012-10-18 08:02:24

darkorigin 发表于 2012-10-17 11:18 static/image/common/back.gif
我请教个问题,上文档中提到不要测量2节以上的电池,以及不要测量锂电池之类,个人理解只要不超过5V应该不会 ...

对。未加任何保护电路和分压电路的情况下,不要往模拟口输入更高电压,否则坏了就麻烦了。。。虽然三节、四节用了一段时间的镍氢充电电池没啥问题,只是谨慎起见(如果是4节碱性电池,新电池的电压约为1.7V,串联测试的话会有6.8V的电压)
页: [1] 2 3 4 5 6 7
查看完整版本: Arduino入门教程--第九课--用Arduino做0-5V量程的电压表