找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 7391|回复: 4

[代码与实例] 一个简单的超声波测距程序

2

主题

11

帖子

11

积分

贫民

积分
11
yhtjay 发表于 2014-12-27 10:13:44 | 显示全部楼层 |阅读模式
本帖最后由 yhtjay 于 2014-12-27 11:06 编辑

__author__ = 'Aaron'
'''
Mail:yhtjay$126.com
'''
import serial
import binascii

ser = serial.Serial('com3', 9600)       #设置端口号及波特率
def read_distance():
    ser.write(b'\x55')                  #发送测距指令
    read_highlen = binascii.b2a_hex(ser.read(1))        #读取高位数据
    highlen = int(read_highlen.decode('utf-8'), 16)     #16进制转10进制
    #print(highlen)
    read_lowlen = binascii.b2a_hex(ser.read(1))         #读取低位数据
    lowlen = int(read_lowlen.decode('utf-8'), 16)       #16进制转10进制
    #print(lowlen)
    len_mm = highlen*256 + lowlen                       #高低位数据相加
    print(len_mm, 'mm')

def read_temperature():
    ser.write(b'\x50')                              #发送测温指令
    read_tem = binascii.b2a_hex(ser.read(1))        #读取温度数据
    tem = int(read_tem.decode('utf-8'), 16)         #16进制转10进制
    tem -= 45                                       #根据模块数据表计算
    print(tem, '℃')

if __name__ == '__main__':
    while 1:
        read_distance()
        read_temperature()
回复

使用道具 举报

2

主题

11

帖子

11

积分

贫民

积分
11
yhtjay  楼主| 发表于 2014-12-27 10:18:06 | 显示全部楼层
处男帖啊,发了代码不会发文字,只好自己楼下跟帖。代码其实很简单,因为自己是初学者,这个代码主要自己困惑在获取bytes数据后怎么转换成十进制实际数据。
由于python完全是自学,网上各种找资料,最后在本论坛http://bbs.pythontab.com/thread-632-1-11.html帖子中学到使用binascii模块,在此感谢该帖子作者!
回复 支持 反对

使用道具 举报

2

主题

11

帖子

11

积分

贫民

积分
11
yhtjay  楼主| 发表于 2014-12-27 11:02:16 | 显示全部楼层
本帖最后由 yhtjay 于 2014-12-27 11:04 编辑

接下来,我会做一个精确测量,读取10次数据,取其中最大距离,取5次最大距离,再取其平均值,最终结果就是实际测量数据,我称此过程为采样。
这个过程中将使用到:1、列表 2、冒泡 3、循环
回复 支持 反对

使用道具 举报

2

主题

11

帖子

11

积分

贫民

积分
11
yhtjay  楼主| 发表于 2014-12-29 20:35:14 | 显示全部楼层
本帖最后由 yhtjay 于 2014-12-29 20:36 编辑
  1. __author__ = 'Aaron'
  2. import serial
  3. import binascii

  4. ser = serial.Serial('com3', 9600)       #设置端口号及波特率
  5. def read_distance():
  6.     ser.write(b'\x55')                  #发送测距指令
  7.     read_highlen = binascii.b2a_hex(ser.read(1))        #读取高位数据
  8.     highlen = int(read_highlen.decode('utf-8'), 16)     #16进制转10进制
  9.     #print(highlen)
  10.     read_lowlen = binascii.b2a_hex(ser.read(1))         #读取低位数据
  11.     lowlen = int(read_lowlen.decode('utf-8'), 16)       #16进制转10进制
  12.     #print(lowlen)
  13.     len_mm = highlen*256 + lowlen                       #高低位数据相加
  14.     #print(len_mm, 'mm')
  15.     return len_mm

  16. def read_temperature():
  17.     ser.write(b'\x50')                              #发送测温指令
  18.     read_tem = binascii.b2a_hex(ser.read(1))        #读取温度数据
  19.     tem = int(read_tem.decode('utf-8'), 16)         #16进制转10进制
  20.     tem -= 45                                       #根据模块数据表计算
  21.     #print(tem, '℃')
  22.     return tem

  23. if __name__ == '__main__':
  24.     precision = 5
  25.     templist_1 = []
  26.     for i in range(0, precision):                   #精度采样测算
  27.         templist_0 = []
  28.         for x in range(0, precision):
  29.             templist_0.append(read_distance())
  30.             print('每次最大值', templist_0)
  31.         MaxOfList = max(templist_0)
  32.         templist_1.append(MaxOfList)
  33.         print('最终最大值', templist_1)
  34.     final = sum(templist_1)/precision
  35.     print('精确值是:%fmm' % final)
复制代码


本来以为要自己写冒泡,没想到内置函数中有MAX输出,Python真方便!
希望高手给我提提意见,我总觉得我的精度算法有问题,好像测量还是不准确。
回复 支持 反对

使用道具 举报

4

主题

13

帖子

13

积分

贫民

积分
13
loottp 发表于 2015-5-24 19:49:17 | 显示全部楼层
路过
回复

使用道具 举报

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

本版积分规则

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