01自动记录测试数据


在实验台上集成了两组万用表,通过联网可以通过PYTHON语句自动将万用表的读数自动录入CSDN的markdown的编辑器,提高试验记录的效率和准确性。

  • 第一组万用表:使用MEGA8单片机中继通过UART连入计算机
    (1) FLUKE45;(2) FLUKE45;(3) LINT-T; (4)MASTECK
  • 第二组万用表:使用网络连入计算机
    (1) RIGOL DM3068

记录数据的PYTHON命令: meterrec: CMD

▲ 左:指尖鼠标;右:拆开的继电器线圈

为了便于解放出双手来操作测量万用表的表笔,用于触发记录的鼠标左键按动则使用一个指尖鼠标来进行。鼠标的动作利用一个铁丝外加一个继电器线圈来触动动作。

02驱动制作


1.驱动电路

由于电磁铁来自于一个220V驱动的小型继电器,因此控制电路直接采用来自于220V室内交流整流后的电压来驱动。

为了增加动作力量,在鼠标的按动铁丝的底部安装有永磁铁。

▲ 驱动电路图

2.动作效果

采用脚动踏板开关(K)可以驱动指尖鼠标的正常的动作。

▲ 按键动作

3.为什么需要对220VAC进行整流滤波?

  1. 虽然直接施加220V交流电压到继电器的线圈,可以使其吸引铁质(铁丝),但是由于该电磁铁索固定的位置存在一个大型的永磁铁。由于外部的强磁场的偏执,这使得所产生的吸引力出现了较大的抖动(50Hz),而不是100Hz的脉动吸引力了。

  2. 使用半波整流,也是出现了这50Hz脉动吸引力,使得继电器作用在小型磁铁上的力出现较大的抖动。

  3. 只有通过全波整理,并且进行滤波,所产生的作用力才比较平稳。

※ 程序代码


下面是METERREC对应的PYTHON命令:

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# METERREC.PY                     -- by Dr. ZhuoQing 2020-07-06
#
# Note:
#============================================================from headm import *
import os
from tsmodule.tsstm32       import *
from tsmodule.tsvisa        import *#------------------------------------------------------------
csdn_title = '写文章-CSDN博客'#============================================================#------------------------------------------------------------
def val2decimalstring(val, dn=-1):if dn == 0:return '%d '%valelif dn == 1:return '%3.1f '%valelif dn == 2:return '%4.2f '%valelif dn == 3:return '%5.3f '%valelif dn == 4:return '%6.4f '%valelif dn == 5:return '%7.5f '%valelif dn == 6:return '%8.6f '%valelif dn == 7:return '%9.7f '%valelif dn == 8:return '%10.8f '%valelse:return '%f '%val#------------------------------------------------------------
def getchannelval(ch):if ch == 9:input = tspinputline(string='', hint='Input Value', title='Input').strip(' ')if len(input) > 0:return float(input)else: return 0if ch < 4:for i in range(20):meter = meterval()if len(meter) >= 4:val = meter[ch]breakelse: val = 0elif ch == 4:val = dm3068vdc()elif ch == 5:val = dm3068vac()elif ch == 6:val = dm3068res()elif ch == 7:val = dm3068freq()else:val = dm3068vdc()return val#------------------------------------------------------------
def waitclick():tspbeep(1800, 350)while True:key = tspread()if key[2] != 0 or key[3] != 0: breaktime.sleep(.5)while True:key = tspread()if key[2] == 0 or key[3] == 0: breaktime.sleep(.5)#------------------------------------------------------------
def tspclickaction(func1=None, func2=None):global workmodeglobal tablesection, tableidglobal ch1data, ch2data, ch3data, ch4dataglobal ch5data, ch6data, ch7data, ch8data#--------------------------------------------------------def f1():tspmsg('msg \a')def f2():printf('\a')if func1 == None:func1 = f1if func2 == None:func2 = f2#--------------------------------------------------------codeflag = 0if len(tablesection) > 0:printf(' '.join(tablesection))linenum = 0#--------------------------------------------------------while True:if codeflag == 0:time.sleep(.5)else: time.sleep(.5)key = tspread()if key[7] != 0 and codeflag == 0:if key[2] != 0:tspmsgcopy()tspclr()tspbeep(1200, 100)codeflag = 1if len(tablesection) > 0:tspexecutepythoncmd('cdpt')if len(tablesection) > 0:printf(' '.join(tablesection))continueif key[3] != 0:returnif key[2] != 0 and codeflag == 0:codeflag = 1continueif key[3] != 0 and codeflag == 0:codeflag = 2continueif codeflag != 0:if key[2] == 0 and key[3] == 0:if codeflag == 1:func1()linenum = linenum + 1if len(tablesection) > 0:if linenum >= len(tablesection) - tableid:func2()linenum = 0elif codeflag == 2:if len(tablesection) == 0:func2()if workmode == 1:ch1data = []ch2data = []ch3data = []ch4data = []ch5data = []ch6data = []ch7data = []ch8data = []tspclr()printf('Record data %s at %s:'%(datafilename, str(datachannel)))else:tspclr()tspbeep(1200, 200)if len(tablesection) > 0:printf(' '.join(tablesection))linenum = 0codeflag = 0continueif key[2] != 0 and key[3] != 0:if codeflag == 1:printf("\r\n")tspmsgcopy()tspbeep(1200, 100)codeflag = 3if len(tablesection) > 0:tspexecutepythoncmd('cdpt')time.sleep(1.5)tspclr()if len(tablesection) > 0:printf(' '.join(tablesection))tspbeep(1500, 100)continueelif codeflag == 2:return#------------------------------------------------------------
windowtitle = tspgetwindowtitle()
findflag = 0meterfile = r'D:\zhuoqing\window\cb\MyResearch\Test\TestAD5344\M8BL_BAS\M8BL_BAS.exe'for wt in windowtitle:if wt.find('MEGA8 DOWLOAD PROGERAM') >= 0:findflag = 1breakif findflag == 0:os.system(meterfile)time.sleep(.5)tspbeep(1200, 200)#============================================================
#------------------------------------------------------------workmode = 0                    # 0  Record the table data# 1  Record data filemeterid = 0
#decimalnum = -1                 # Decimal number no limited
decimaldim = [-1] * 32datafilename = ''
datachannel = []
waitchannel = []tablesection = []               #
tableid = 0                     ##------------------------------------------------------------
if len(sys.argv) > 1:#--------------------------------------------------------if sys.argv[1][0] == '#':chstr = sys.argv[1][1:]dnum = -1if chstr.find('.') > 0:csc = chstr.split('.')if csc[0].isdigit() and csc[1].isdigit():ch = int(csc[0])dnum = int(csc[1])chval = getchannelval(ch)insertstr = val2decimalstring(chval, dnum)clipboard.copy(insertstr)tspsendwindowkey(csdn_title, 'v', control=1, noreturn=1)clipboard.copy('')tspfocuswindow(csdn_title)exit()elif chstr.isdigit():ch = int(chstr)dnum = -1chval = getchannelval(ch)insertstr = val2decimalstring(chval, dnum)clipboard.copy(insertstr)tspsendwindowkey(csdn_title, 'v', control=1, noreturn=1)clipboard.copy('')tspfocuswindow(csdn_title)exit()elif chstr == 'dt':insertstr = time.strftime('%Y-%m-%d %H:%M:%S')clipboard.copy(insertstr)tspsendwindowkey(csdn_title, 'v', control=1, noreturn=1)clipboard.copy('')tspfocuswindow(csdn_title)exit()elif chstr == 'date' or chstr == 'd':insertstr = time.strftime('%Y-%m-%d')clipboard.copy(insertstr)tspsendwindowkey(csdn_title, 'v', control=1, noreturn=1)clipboard.copy('')tspfocuswindow(csdn_title)exit()elif chstr == 'time' or chstr == 't':insertstr = time.strftime('%H:%M:%S')clipboard.copy(insertstr)tspsendwindowkey(csdn_title, 'v', control=1, noreturn=1)clipboard.copy('')tspfocuswindow(csdn_title)exit()#--------------------------------------------------------if sys.argv[1].isdigit() == False and\sys.argv[1].find('.') < 0:datafilename = sys.argv[1]for s in sys.argv[2:]:if s.isdigit() == False and\s.find('.') < 0:printf("meterrec datafile ch1 ch2 ...")exit()if s.isdigit() == True:if not int(s) in datachannel:datachannel.append(int(s))waitchannel.append(0)else:waitchannel[datachannel.index(int(s))] = 1else:sc = s.split('.')if not int(sc[0]) in datachannel:decimaldim[len(datachannel)] = int(sc[1])datachannel.append(int(sc[0]))waitchannel.append(0)else:waitchannel[datachannel.index(sc[0])] = 1if len(datachannel) == 0:printf("meterrec datafile ch1 ch2 ...")exit()workmode = 1             #else:if sys.argv[1].isdigit():meterid = int(sys.argv[1])elif sys.argv[1].find('.') >= 0:sc = sys.argv[1].split('.')meterid = int(sc[0])decimaldim = [int(sc[1])] * 32if len(sys.argv) > 2:if sys.argv[2].isdigit():
#                decimalnum = int(sys.argv[2])dn = int(sys.argv[2])decimaldim = [dn] * 32tablesection = sys.argv[3:]else:tablesection = sys.argv[2:]for s in tablesection:if s.find('#') >=0:tableid = 1tablesection = [s.strip('#') for s in tablesection]#------------------------------------------------------------
if meterid > 3:dm3068open()
elif len(datachannel) > 0:for c in datachannel:if c > 3:dm3068open()break#------------------------------------------------------------#============================================================
#------------------------------------------------------------
def tspmsgdecimal(val, dn=-1):if dn == 0:tspmsg('%d '%val)elif dn == 1:tspmsg('%3.1f '%val)elif dn == 2:tspmsg('%4.2f '%val)elif dn == 3:tspmsg('%5.3f '%val)elif dn == 4:tspmsg('%6.4f '%val)elif dn == 5:tspmsg('%7.5f '%val)elif dn == 6:tspmsg('%8.6f '%val)elif dn == 7:tspmsg('%9.7f '%val)elif dn == 8:tspmsg('%10.8f '%val)else:tspmsg('%f '%val)#------------------------------------------------------------
def recordchannel():
#    global decimalnumdn = decimaldim[meterid]val = 0val = getchannelval(meterid)tspmsgdecimal(val, dn)tspbeep(2000, 200)#------------------------------------------------------------
ch1data = []
ch2data = []
ch3data = []
ch4data = []
ch5data = []
ch6data = []
ch7data = []
ch8data = []def recorddata():global datafilenameglobal datachannel
#    global decimalnumglobal decimaldimglobal ch1data, ch2data, ch3data, ch4dataglobal ch5data, ch6data, ch7data, ch8datatspbeep(1200, 50)if len(datachannel) == 0:printf('ERROR: Channel number: 0.')exit()if len(datafilename) == 0:printf("ERROR: Data file length is zero.")exit()if len(ch1data) == 0:tspclr()if len(datachannel) >= 1:if waitchannel[0] != 0: waitclick()ch1data.append(getchannelval(datachannel[0]))tspmsgdecimal(ch1data[-1], decimaldim[0])if len(datachannel) >= 2:if waitchannel[1] != 0: waitclick()ch2data.append(getchannelval(datachannel[1]))tspmsgdecimal(ch2data[-1], decimaldim[1])if len(datachannel) >= 3:if waitchannel[2] != 0: waitclick()ch3data.append(getchannelval(datachannel[2]))tspmsgdecimal(ch3data[-1], decimaldim[2])if len(datachannel) >= 4:if waitchannel[3] != 0: waitclick()ch4data.append(getchannelval(datachannel[3]))tspmsgdecimal(ch4data[-1], decimaldim[3])if len(datachannel) >= 5:if waitchannel[4] != 0: waitclick()ch5data.append(getchannelval(datachannel[4]))tspmsgdecimal(ch5data[-1], decimaldim[4])if len(datachannel) >= 6:if waitchannel[5] != 0: waitclick()ch6data.append(getchannelval(datachannel[5]))tspmsgdecimal(ch6data[-1], decimaldim[5])if len(datachannel) >= 7:if waitchannel[6] != 0: waitclick()ch7data.append(getchannelval(datachannel[6]))tspmsgdecimal(ch7data[-1], decimaldim[6])if len(datachannel) >= 8:if waitchannel[7] != 0: waitclick()ch8data.append(getchannelval(datachannel[7]))tspmsgdecimal(ch8data[-1], decimaldim[7])if len(datachannel) == 1:tspsave(datafilename, ch1=ch1data)if len(datachannel) == 2:tspsave(datafilename, ch1=ch1data, ch2=ch2data)if len(datachannel) == 3:tspsave(datafilename, ch1=ch1data, ch2=ch2data, ch3=ch3data)if len(datachannel) == 4:tspsave(datafilename, ch1=ch1data, ch2=ch2data, ch3=ch3data, ch4=ch4data)if len(datachannel) == 5:tspsave(datafilename, ch1=ch1data, ch2=ch2data, ch3=ch3data, ch4=ch4data, ch5=ch5data)if len(datachannel) == 6:tspsave(datafilename, ch1=ch1data, ch2=ch2data, ch3=ch3data, ch4=ch4data, ch5=ch5data, ch6=ch6data)if len(datachannel) == 7:tspsave(datafilename, ch1=ch1data, ch2=ch2data, ch3=ch3data, ch4=ch4data, ch5=ch5data, ch6=ch6data, ch7=ch7data)if len(datachannel) == 8:tspsave(datafilename, ch1=ch1data, ch2=ch2data, ch3=ch3data, ch4=ch4data, ch5=ch5data, ch6=ch6data, ch7=ch7data, ch8=ch8data)printf("\a")#------------------------------------------------------------
time.sleep(.5)
tspbeep(1000, 500)
tspclr()
clipboard.copy('')#------------------------------------------------------------
if workmode == 1:printf('Record data %s at %s:'%(datafilename, str(datachannel)))tspshowcaption('Record data %s at %s:'%(datafilename, str(datachannel)))tspclickaction(recorddata)
else:tspclickaction(recordchannel)#------------------------------------------------------------
tspmsgcopy()
tspbeep(500, 200)#------------------------------------------------------------
#        END OF FILE : METERREC.PY
#============================================================

利用一个继电器来实现脚踏鼠标按钮相关推荐

  1. ESP8266利用Bliker、小爱同学和本地按钮控制4路开关

    ESP8266利用Bliker.小爱同学和本地按钮控制4路开关 Blinker函数说明: Button.color("#FFFF00"); //设置app按键是纯黄色,16进制颜色 ...

  2. python中tkinter鼠标事件_按下鼠标按钮(按住)的Tkinter事件?

    更新:这是一个版本问题.该事件不会在单击Python3.6.1时触发,但可以在我目前测试过的2.7上运行.在 更新:Bryan的回答确实解决了我的事件不能正常工作的问题,但是在我的3.6.1版本的py ...

  3. 多功能按键设计——利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按

    看了一个晚上,结合了马潮老师的书,才搞懂这个程序,确实经典!原文: 题目:多功能按键设计.利用一个I/O口,接一个按键,实现3功能操作:单击 + 双击 + 长按. (amobbs.com 阿莫电子论坛 ...

  4. css 按钮固定在右上交_如何在iPad上交换左右鼠标按钮

    css 按钮固定在右上交 With a mouse, you can "right-click" on your iPad-Apple calls this a "Sec ...

  5. ipad 悬浮按钮 自定_如何在iPad上自定义鼠标按钮

    ipad 悬浮按钮 自定 You can now control your iPad with a mouse, and it does much more than just simulate ta ...

  6. 利用伪元素给图片在鼠标悬停时添加背景图片

    利用伪元素给图片在鼠标悬停的时候添加背景图片,这种效果在电影网站上使用的比较频繁,主要是鼠标悬停的时候显示出播放的图标,点击图片链接后就会进入视频详情页面,而使用伪元素是为了使我们的html代码更加简 ...

  7. 添加鼠标按钮html代码,HTML MouseEvent buttons用法及代码示例

    鼠标事件的按钮属性用于返回数字.该数字表示触发鼠标事件时按下了哪个鼠标按钮.此属性通常与onmousedown事件一起使用.该属性是只读的.由于缺乏浏览器支持,因此您可能需要查看button属性. 用 ...

  8. php onmouse,html在鼠标按钮在元素上按下时触发的事件属性onmousedown

    实例 当在段落上按下鼠标按钮时执行一段 JavaScript: 请点击此文本! 浏览器支持 IE Firefox Chrome Safari Opera 所有主流浏览器都支持 onmousedown ...

  9. 一个小程序:图片代替鼠标移动

    一个小程序:图片代替鼠标移动 程序的运行效果: 当鼠标移动到窗口内,鼠标不见了,取而代之的是图片..... ============================================== ...

最新文章

  1. 传美的投40亿进军卫浴行业
  2. java 正则_认识正则表达式(Java语言基础)
  3. 微信团队放大招!他们为了小程序居然...
  4. CSDN:解决粉丝网友集中问题留言处,把你所有的问题在留言处留言,我会一一回答
  5. 可以对窗口函数之后再加条件_SQL 窗口函数——解决实际问题
  6. java map初始化方式_java中Map和List初始化的两种方法
  7. 【Python数据结构】 抽象数据类型 Python类机制和异常
  8. [蓝桥杯]算法提高 秘密行动(动态规划)
  9. python语言打印菱形_Python打印菱形
  10. 【转载保存】lucene3.0可以对docId、docField、queryParser设置Boost值来影响排序结果
  11. 第1关:HDFS的基本操作
  12. 消除ie上的:为了有利于保护安全性,IE已限制此网页运行可以访问计算机的脚本或 ActiveX 控件...
  13. 1075 - Incorrect table definition;there can be only one auto column and it must be defined as a key
  14. python基础--集合
  15. 内网群PING的shell
  16. 什么是软件质量管理的底层逻辑?
  17. ubuntu dkms报错
  18. JAVA能写大型游戏么?不能?
  19. 圣诞节苹果服务器没有人维护2020,2020圣诞节真的推迟到1月8号吗
  20. 蓝魔i11pro运行linux,蓝魔i11 pro的彪悍 我来给你解释一下

热门文章

  1. Shark0.9.1安装
  2. 艾伟_转载:从ASP.NET的PHP执行速度比较谈起
  3. AIX如何查看文件系统分布在哪个物理磁盘上
  4. 二、Java面向对象(7)_封装思想——this关键字
  5. SVG(H5可缩放的矢量图形)
  6. 基于Gitolite的Git服务架设
  7. 2015浙江财经大学ACM有奖周赛(一) 题解报告
  8. 【SICP练习】38 练习1.43
  9. luanet更名为distri.lua
  10. opengl地球贴纹理_一文看懂材质/纹理 Material, Texture, Shading, Shader 的区别