首先确定代码总体思路:
1.Qt5写出界面
2.写出转速计算逻辑
3.soket连接发送数据
然后补充细节:
界面:
1.创建两个按钮,创建三个文本信息:“转速测量模拟器”“当前转速:”“转速状态”
(转速状态根据转速变化,未开始旋转时不显示)
文字不必特别死板,可以自定义自己喜欢的字体颜色等,文本框默认为空所以不显示。位置也自定义即可
2.转速计算逻辑:
根据题意,单独按下A或B不进行任何计算,必须先按下A再按下B算一个旋转周期,则按下A时使一个变量赋值为1并记录当前时间,按下B时判断该变量是否为1,如果为1则记录当前时间,然后后者时间-前者时间得出两次按钮之间的差值即旋转一圈所用的时间,然后用1除去旋转一圈的时间即转速r/s
import sys
import time
import socket
from PyQt5.QtWidgets import *
from PyQt5 import uic
import threading
# 本次要用到的第三方模块
# 声明转速变量为float
zhuan_s = float()
# 创建Qt类
class MyWindow(QWidget):
def __init__(self):
global zhuan_s
self.a = 0
super().__init__() # 调用父类所有属性
self.qt()
def qt(self):
# 提取ui文件
self.ui = uic.loadUi("./hello.ui")
print(self.ui.__dict__)
# 选择要提取的控件
self.btn1 = self.ui.pushButton
self.btn2 = self.ui.pushButton_2
self.label1 = self.ui.label
self.label4 = self.ui.label_5
# 绑定信号与槽
self.btn1.clicked.connect(self.login) # 按钮A
self.btn2.clicked.connect(self.login2) # 按钮B
def login(self): # 按钮下按钮A,变量a赋值1,time1.time()记录当前时间
self.a = 1
self.time1 = time.time()
return self.a
def login2(self, a): # 按钮下按钮B,time2计时,time2.time()记录当前时间
global zhuan_s # zhuan_s 为全局变量,否则socket无法传输值
if self.a == 1: # 按钮A先按下时才执行
self.time2 = time.time()
self.time_differrence = self.time2 - self.time1 # 计算时间差
zhuan_s = 1/self.time_differrence # 计算转速,1s的时间除时间差
self.label4.setText(f"{zhuan_s}")
if zhuan_s < 1:
self.label1.setText("转速过慢")
elif zhuan_s > 5:
self.label1.setText("转速过快")
else:
self.label1.setText("转速正常")
self.a = 0 # a清零,结束一次旋转周期
3.socket连接到新大陆的云平台
找到TCP的地址,然后在命令提示符ping出ip
在传感器界面找到设备标识,传输密钥,标识名
发送数据必须比请求晚一点,否则会接收不到数据,所以加上了1s的延迟,同时也决定了更新数据的速度
# 创建socket实例对象,创建链接对象
socket_dui = socket.socket()
socket_dui.connect(("121.37.241.174", 8600)) # 到云平台首页找到网址和端口,在命令提示符中ping出ip地址,注意内部是元组
# 发送请求
def fasong(): # 发送请求命令
# 到文件传输协议寻找请求标准,到云平台找设备标识(device)和传输密钥(key),其他为固定值
request1 = '{"t": 1,"device": "1122__33", "key":"d2e24c8b805f4a4ea456e2d12cfb8d4e", "ver":"v1.1"}'
socket_dui.send(request1.encode()) # socket发送请求
# 发送数据
def send():
global zhuan_s
while True:
time.sleep(1)
# t,msgid固定值,datetype和datas自定义,datas中填写设备名和发送的值,都以键值对
request2 = '{"t": 3,"datatype":1,"datas": {"a0403":'+str(zhuan_s)+' },"msgid": 123}'
socket_dui.send(request2.encode())
注意转速在方法中的调用需要global,否则只是局部变量
socket发送的都是json格式,记得encode成utf-8
最后,main函数中创建线程,让发送请求和发送数据在不同线程中进行,否则程序会卡死
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
# 展示窗口
w.ui.show()
# 创建线程
fasong_thread = threading.Thread(target=fasong)
fasong_thread.start()
send_thread = threading.Thread(target=send)
send_thread.start()
# 挂住窗口
app.exec_()
该程序未必完美,如果有误请指出