• 基于树莓派的蓄电池控制系统


    总概:

    (1)使用 Raspberry 4B作为主控芯片,通过不同模块采集信息。

    (2)搭建BP神经网络模型并训练,根据采集信息算出蓄电池的补水量。

    (3)使用PyQT编写人机交互界面。

    硬件准备:

    Raspberry Pi 4B

    PT1000温度传感器

    MAX31865放大器

    超声波测距传感器

    模数转换器

    比重检测模块

     

    总体连接图

    环境配置:

    树莓派新板子配置可以看我之前的博客,有详细介绍树莓派开机

    蓝牙配置

    以下是DM35密度仪蓝牙配置及数据传输

     

    Blueman插件

    在树莓派上将所需依赖安装上

    sudo apt update && sudo apt upgrade

    sudo apt install bluetooth pi-bluetooth bluez blueman

     

    之后右上角就出线了蓝牙的图标,可以通过GUI点击蓝牙配对比重仪并且信任该设备,或者通过以下命令行:

    sudo bluetoothctl

    scan on

    pair XX:XX:XX:XX:XX:XX

    connect XX:XX:XX:XX:XX:XX

    exit

    当比重仪点击发送数据后,树莓派就能接受到数据

    发送的是一个Iso8859编码格式的txt文件

    这里使用正则表达式将比重、温度、密度等需要信息提取出来

     

    屏幕驱动

    可以上LCDWIKI找到具体的LCD信号及其驱动文件。

    按照步骤一步一步配置即可,注意的是有些触摸板上是power和touch接口,并不是下图这种双power接口,所以接线时除了HDMI还需要接touch线而不接power线。

     

    软件编写

    写得很烂,完全没有去耦合,能跑就行

    1. #用到的python解释库导入
    2. import re
    3. from PyQt5.QtWidgets import QLabel,QLineEdit
    4. from PyQt5.QtCore import QTimer,QDateTime, QSize, Qt
    5. from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QComboBox
    6. from PyQt5.QtGui import *
    7. import sys
    8. import os
    9. import numpy as np
    10. import pandas as pd
    11. from matplotlib import pyplot as plt
    12. from openpyxl.styles.builtins import output
    13. import time
    14. import board
    15. import digitalio
    16. import adafruit_max31865
    17. import ADS1263.ADS1263 as AD
    18. import RPi.GPIO as GPIO
    19. os.environ["QT_IM_MODULE"] = "qtvirtualkeyboard"
    20. #接下来这部分是BP神经网络的内容
    21. #定义每一层之间用到的传递函数
    22. def sigmoid(x):
    23. # 第一层到第二层的激活函数
    24. return 1 / (1 + np.exp(-x))
    25. def deriv_sigmoid(x):
    26. # 第一层到第二层的激活函数的求导函数
    27. fx = sigmoid(x)
    28. return fx * (1 - fx)
    29. def mse_loss(y_true, y_pred):
    30. # 使用方差作为损失函数
    31. return ((y_true - y_pred) ** 2).mean()
    32. #开始神经网络的建立过程
    33. class OurNeuralNetwork:
    34. def __init__(self):
    35. # 第一层到第二层的权重初始值设置
    36. self.w11 = np.random.normal()
    37. self.w12 = np.random.normal()
    38. self.w13 = np.random.normal()
    39. self.w14 = np.random.normal()
    40. self.w21 = np.random.normal()
    41. self.w22 = np.random.normal()
    42. self.w23 = np.random.normal()
    43. self.w24 = np.random.normal()
    44. # 第二层到第三层的权重初始值设置
    45. self.w1 = np.random.normal()
    46. self.w2 = np.random.normal()
    47. # 每一层截距项的初始值设置,Biases
    48. self.b1 = np.random.normal()
    49. self.b2 = np.random.normal()
    50. self.b3 = np.random.normal()
    51. # 前向传播学习函数
    52. def feedforward(self, x):
    53. h1 = sigmoid(self.w11 * x[0] + self.w12 * x[1] + self.w13 * x[2] + self.w14 * x[3] + self.b1)
    54. h2 = sigmoid(self.w21 * x[0] + self.w22 * x[1] + self.w23 * x[2] + self.w24 * x[3] + self.b1)
    55. o1 = self.w1 * h1 + self.w2 * h2 + self.b3
    56. return o1
    57. #训练函数
    58. def train(self, data, all_y_trues):
    59. learn_rate = 0.001 # 学习率
    60. epochs = 1000 # 训练的次数
    61. # 画图数据
    62. self.loss = np.zeros(100)
    63. self.sum = 0
    64. # 开始训练
    65. for epoch in range(epochs):
    66. for x, y_true in zip(data, all_y_trues):
    67. # 计算h1
    68. h1 = sigmoid(self.w11 * x[0] + self.w12 * x[1] + self.w13 * x[2] + self.w14 * x[3] + self.b1)
    69. # 计算h2
    70. h2 = sigmoid(self.w21 * x[0] + self.w22 * x[1] + self.w23 * x[2] + self.w24 * x[3] + self.b2)
    71. #计算输出节点
    72. y_pred = self.w1 * h1 + self.w2 * h2 + self.b3
    73. # 反向传播计算导数
    74. d_L_d_ypred = -2 * (y_true - y_pred)
    75. d_ypred_d_w1 = h1
    76. d_ypred_d_w2 = h2
    77. d_ypred_d_b3 = 0
    78. d_ypred_d_h1 = self.w1
    79. d_ypred_d_h2 = self.w2
    80. sum_1=self.w11 * x[0] + self.w12 * x[1] + self.w13 * x[2] + self.w14 * x[3] + self.b1
    81. d_h1_d_w11 = x[0] * deriv_sigmoid(sum_1)
    82. d_h1_d_w12 = x[1] * deriv_sigmoid(sum_1)
    83. d_h1_d_w13 = x[2] * deriv_sigmoid(sum_1)
    84. d_h1_d_w14 = x[3] * deriv_sigmoid(sum_1)
    85. d_h1_d_b1 = deriv_sigmoid(sum_1)
    86. sum_2 = self.w21 * x[0] + self.w22 * x[1] + self.w23 * x[2] + self.w24 * x[3] + self.b2
    87. d_h1_d_w21 = x[0] * deriv_sigmoid(sum_2)
    88. d_h1_d_w22 = x[1] * deriv_sigmoid(sum_2)
    89. d_h1_d_w23 = x[2] * deriv_sigmoid(sum_2)
    90. d_h1_d_w24 = x[3] * deriv_sigmoid(sum_2)
    91. d_h1_d_b2 = deriv_sigmoid(sum_2)
    92. # 梯度下降法
    93. self.w11 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w11
    94. self.w12 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w12
    95. self.w13 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w13
    96. self.w14 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w14
    97. self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1
    98. self.w21 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h1_d_w21
    99. self.w22 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h1_d_w22
    100. self.w23 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h1_d_w23
    101. self.w24 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h1_d_w24
    102. self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h1_d_b2
    103. self.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_w1
    104. self.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_w2
    105. self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3
    106. if epoch % 10 == 0:
    107. y_preds = np.apply_along_axis(self.feedforward, 1, data)
    108. loss = mse_loss(all_y_trues, y_preds)
    109. print("Epoch %d loss: %.3f" % (epoch, loss))
    110. self.loss[self.sum] = loss
    111. self.sum = self.sum + 1
    112. # 训练数据文件导入
    113. FILENAME = "/home/pi/Downloads/data.xlsx"
    114. # 禁用科学计数法
    115. pd.set_option('float_format', lambda x: '%.3f' % x)
    116. np.set_printoptions(suppress=True,threshold=sys.maxsize)
    117. # 得到的DataFrame分别为补水量、密度、电压、高度、温度
    118. data = pd.read_excel(FILENAME, header=0, usecols="A,B,C,D,E")
    119. DataArray = data.values
    120. Y = DataArray[:, 0]
    121. X = DataArray[:, 1:5]
    122. X = np.array(X)#转化为array,自变量
    123. Y = np.array(Y)#转化为array,因变量
    124. # 处理数据
    125. data = np.array(X)
    126. data_mean = np.sum(data, axis=0) / np.size(data, 0)
    127. data = (data - data_mean) / np.max(data)
    128. all_y_trues = np.array(Y)
    129. all_y_trues_mean = np.sum(all_y_trues) / np.size(all_y_trues)
    130. all_y_trues = (all_y_trues - all_y_trues_mean) / np.max(all_y_trues)
    131. # 训练数据
    132. network = OurNeuralNetwork()
    133. network.train(data, all_y_trues)
    134. # 输出神经网络参数
    135. print("w11-->%.3f" % network.w11)
    136. print("w12-->%.3f" % network.w12)
    137. print("w13-->%.3f" % network.w13)
    138. print("w14-->%.3f" % network.w14)
    139. print("w21-->%.3f" % network.w21)
    140. print("w22-->%.3f" % network.w22)
    141. print("w23-->%.3f" % network.w23)
    142. print("w24-->%.3f" % network.w24)
    143. print("w1-->%.3f" % network.w1)
    144. print("w2-->%.3f" % network.w2)
    145. print("b1-->%.3f" % network.b1)
    146. print("b2-->%.3f" % network.b2)
    147. print("b3-->%.3f" % network.b3)
    148. #这部分是人机界面的建立过程
    149. class Stats():
    150. def __init__(self):
    151. #主窗口设计参数
    152. self.window = QMainWindow()
    153. self.window.showFullScreen()
    154. self.window.move(0, 0)
    155. self.window.setWindowTitle('测控界面')
    156. self.window.setWindowFlags(Qt.FramelessWindowHint)
    157. self.window.setObjectName("MainWindow")
    158. self.window.setStyleSheet("#MainWindow{border-image:url(bg.jpg)}")
    159. self.state = True
    160. self.wendu = QLabel('温度(°)', self.window) # 温度按钮
    161. self.wendu.setGeometry(80, 200, 150, 60) # (x坐标,y坐标,宽,高)
    162. self.tem = 0
    163. self.Label1 = QLineEdit(f'{self.tem}', self.window) # 单文本框1:温度显示值
    164. self.Label1.setGeometry(250, 200, 150, 60) # (x坐标,y坐标,宽,高)
    165. self.Label1.setAlignment(Qt.AlignCenter) # 设置文本框中内容居中
    166. self.bizhong = QLabel('密度(g/cm3)', self.window) # 比重按钮
    167. self.bizhong.setGeometry(80, 350, 150, 60) # (x坐标,y坐标,宽,高)
    168. self.midu = 0
    169. self.Label4 = QLineEdit(f'{self.midu}', self.window) # 单文本框4:比重显示值
    170. self.Label4.setGeometry(250, 350, 150, 60) # (x坐标,y坐标,宽,高)
    171. self.Label4.setAlignment(Qt.AlignCenter) # 设置文本框中内容居中
    172. self.gaodu = QLabel('高度(cm)', self.window) # 高度按钮
    173. self.gaodu.setGeometry(640, 200, 150, 60) # (x坐标,y坐标,宽,高)
    174. self.hei = 0
    175. self.Label2 = QLineEdit(f'{self.hei}', self.window) # 单文本框2:高度显示值
    176. self.Label2.setGeometry(810, 200, 150, 60) # (x坐标,y坐标,宽,高)
    177. self.Label2.setAlignment(Qt.AlignCenter) # 设置文本框中内容居中
    178. self.bushui = QLabel('水量(ml)', self.window) # 补水量按钮
    179. self.bushui.setGeometry(640, 350, 150, 60) # (x坐标,y坐标,宽,高)
    180. self.shui = 0
    181. self.Label3 = QLineEdit(f'{self.shui}', self.window) # 单文本框3:补水量显示值
    182. self.Label3.setGeometry(810, 350, 150, 60) # (x坐标,y坐标,宽,高)
    183. self.Label3.setAlignment(Qt.AlignCenter) # 设置文本框中内容居中
    184. self.ceshi = QPushButton('刷新', self.window) # 开始按钮,点击来对此时测量量进行显示以及赋值
    185. self.ceshi.setGeometry(100, 100, 60, 30) # (x坐标,y坐标,宽,高)
    186. self.ceshi.clicked.connect(self.handleCalc)
    187. self.caculate_out_label = QLabel('补水量',self.window)
    188. self.caculate_out_label.setGeometry(100, 50, 60, 30) # (x坐标,y坐标,宽,高)
    189. self.caculate_out_label.setAlignment(Qt.AlignCenter)
    190. self.Ncalculate_data=0
    191. self.caculate_outData_label = QLabel(f'{self.Ncalculate_data}',self.window) # 在self.window窗口添加一个标签time_label
    192. self.caculate_outData_label.setGeometry(180, 50, 60, 30) # (x坐标,y坐标,宽,高)
    193. self.caculate_outData_label.setAlignment(Qt.AlignCenter)
    194. self.state_label = QLabel(f'OK',self.window) # 在self.window窗口添加一个标签time_label
    195. self.state_label.setGeometry(250, 50, 60, 30) # (x坐标,y坐标,宽,高)
    196. self.state_label.setAlignment(Qt.AlignCenter)
    197. self.time_label = QLabel(self.window) # 在self.window窗口添加一个标签time_label
    198. self.time_label.setGeometry(700, 0, 300, 200) # (x坐标,y坐标,宽,高)
    199. self.time_label.setAlignment(Qt.AlignCenter) # 函数setAlignment()主要将是消除布局中的空隙,让两个控件紧紧挨在一起
    200. self.Timer = QTimer() # 创建定时器
    201. self.Timer.start(500) # 定时器每500ms工作一次
    202. self.Timer.timeout.connect(self.TimeUpdate) # 500指的是500ms,即每500ms调用一下这个TimeUpdate函数
    203. # 建立定时器连接通道 注意这里调用TimeUpdate方法,不是方法返回的的结果,所以不能带括号, # 写成self.TimeUpdate()是不对的,带括号代表返回值
    204. self.setup = QPushButton('设置', self.window) # 设置按钮:点击进入下一界面
    205. self.setup.setGeometry(300, 100, 60, 30) # (x坐标,y坐标,宽,高)
    206. self.setup.clicked.connect(self.call_dialog)
    207. self.Ncalculate = QPushButton('计算', self.window) # 开始按钮,点击来对此时测量量进行显示以及赋值
    208. self.Ncalculate.setGeometry(200, 100, 60, 30) # (x坐标,y坐标,宽,高)
    209. self.Ncalculate.clicked.connect(self.Ncalculate_handle)
    210. # 电池类型选择:模式一,模式二,模式三分别代表不同的电池组类型
    211. self.moshi = QComboBox(self.window)
    212. self.moshi.setGeometry(400, 100, 110, 30) # (x坐标,y坐标,宽,高)
    213. self.moshi.addItem("模式1")
    214. self.moshi.addItem("模式2")
    215. self.moshi.addItem("模式3")
    216. # 下面是前面用到的函数功能定义总结
    217. # 函数一:用于变量显示
    218. def handleCalc(self): # 开始按钮对应的函数 def handleCalc(self):
    219. # 通过SPI通讯读取MAX31865上面的数据(读取热电偶输出值)
    220. spi = board.SPI()
    221. cs = digitalio.DigitalInOut(board.D5) # Chip select of the MAX31865 board.
    222. sensor = adafruit_max31865.MAX31865(spi, cs, rtd_nominal=1000.0, ref_resistor=4300.0, wires=4)
    223. print("Temperature: {0:0.3f}C".format(sensor.temperature))
    224. print("resistance: {0:0.3f} Ohms".format(sensor.resistance))
    225. self.tem = round(sensor.temperature,2)
    226. self.temperature=sensor.temperature
    227. # 通过SPI通讯分时复用读取ADS1263上面的数据(读取超声波传感器上输出值)
    228. REF = 5.08 # Modify according to actual voltage
    229. try:
    230. ADC = AD.ADS1263()
    231. if (ADC.ADS1263_init_ADC1('ADS1263_7200SPS') == -1):
    232. exit()
    233. ADC.ADS1263_SetMode(0)
    234. self.ADC_Value = ADC.ADS1263_GetAll() # get ADC1 value
    235. self.height = self.ADC_Value[1] * REF / 0x7fffffff
    236. print("ADC1 IN1 = %lf" % self.height) # 32bit
    237. self.hei=round(self.height, 2)
    238. except IOError as e:
    239. print(e)
    240. self.buttonLabel1 = f'{self.tem}'
    241. self.Label1.setText(self.buttonLabel1) # 改变标签1的函数,给标签1赋当前温度值
    242. self.buttonLabel2 = f'{self.hei}'
    243. self.Label2.setText(self.buttonLabel2) # 改变标签1的函数,给标签2赋当前温度值
    244. try:
    245. f = open('./measureLog_export.txt',encoding='iso8859')
    246. except:
    247. self.Density=0
    248. print(f'bluetooth error:not file')
    249. self.state = False
    250. else:
    251. read_data_line=f.readlines()
    252. f.close()
    253. read_data_line_count=len(read_data_line)
    254. os.remove("./measureLog_export.txt")
    255. regex = re.compile("[0-9]+.*[0-9]")
    256. search_data=regex.search(read_data_line[read_data_line_count-6])
    257. SampleID=str(search_data.group())
    258. print(f'SampleID is {SampleID}')
    259. regex = re.compile("[0-9]+.*[0-9]")
    260. search_data=regex.search(read_data_line[read_data_line_count-5])
    261. self.Density=float(search_data.group())
    262. print(f'Density is {self.Density}')
    263. regex = re.compile("[0-9]+.*[0-9]")
    264. search_data=regex.search(read_data_line[read_data_line_count-3])
    265. SG=float(search_data.group())
    266. print(f'SG is {SG}')
    267. self.state = True
    268. self.midu=round(self.Density, 2)
    269. self.buttonLabel4 = f'{self.midu}'
    270. self.Label4.setText(self.buttonLabel4)
    271. info = self.moshi.currentText() # 提取模式多组合选择里面的文本出来,此时文本包括字符串以及数字
    272. salary = re.sub("\D", "", info) # 提取info里面的数字出来
    273. if int(salary) == 1: # 根据模式不同,赋给按钮6补水量的值也有所不同
    274. self.shui = 10
    275. self.buttonLabel3 = f'{self.shui}'
    276. self.Label3.setText(self.buttonLabel3) # 改变按钮6标签的函数
    277. if int(salary) == 2:
    278. self.shui = 20
    279. self.buttonLabel3 = f'{self.shui}'
    280. self.Label3.setText(self.buttonLabel3) # 改变按钮6标签的函数
    281. if int(salary) == 3:
    282. self.shui = 30
    283. self.buttonLabel3 = f'{self.shui}'
    284. self.Label3.setText(self.buttonLabel3) # 改变按钮6标签的函数
    285. # 函数二:用于时间刷新,实时时间显示:目前是调用当前电脑上时间
    286. def TimeUpdate(self):
    287. self.time_label.setText(QDateTime.currentDateTime().toString('yyyy-MM-dd hh:mm:ss dddd'))
    288. if self.state == False :
    289. self.state_label.setText('Error')
    290. else :
    291. self.state_label.setText('OK')
    292. def is_number(self,s):
    293. pattern = re.compile(r'^[-+]?[-0-9]\d*\.\d*|[-+]?\.?[0-9]\d*$')
    294. result = pattern.match(s)
    295. if result:
    296. return True
    297. else:
    298. return False
    299. def Ncalculate_handle(self):
    300. calculate_data_Density=self.Label4.text()
    301. if not self.is_number(calculate_data_Density):
    302. calculate_data_Density = 0
    303. print('Density input is not number')
    304. self.Label4.setText('0')
    305. self.state = False
    306. else :
    307. calculate_data_Density = float(calculate_data_Density)
    308. if calculate_data_Density==self.midu :
    309. calculate_data_Density=self.Density
    310. else :
    311. self.state = True
    312. calculate_data_temperature=self.Label1.text()
    313. if not self.is_number(calculate_data_temperature):
    314. calculate_data_temperature = 0
    315. print('Temperature input is not number')
    316. self.state = False
    317. self.Label1.setText('0')
    318. else :
    319. calculate_data_temperature = float(calculate_data_temperature)
    320. if calculate_data_temperature==self.tem :
    321. calculate_data_temperature=self.temperature
    322. calculate_data_shui=self.Label3.text()
    323. if not self.is_number(calculate_data_shui):
    324. calculate_data_shui = 0
    325. print('Water input is not number')
    326. self.state = False
    327. self.Label3.setText('0')
    328. else :
    329. calculate_data_shui = float(calculate_data_shui)
    330. if calculate_data_shui==self.shui :
    331. calculate_data_shui=self.shui
    332. calculate_data_height=self.Label2.text()
    333. if not self.is_number(calculate_data_height):
    334. calculate_data_height = 0
    335. print('Height input is not number')
    336. self.state = False
    337. self.Label2.setText('0')
    338. else :
    339. calculate_data_height = float(calculate_data_height)
    340. if calculate_data_height==self.hei :
    341. calculate_data_height=self.height
    342. self.k1 = calculate_data_Density
    343. self.k2 = calculate_data_height
    344. self.k3 = calculate_data_shui
    345. self.k4 = calculate_data_temperature
    346. z = [self.k1, self.k2, self.k3, self.k4]
    347. z = (z - data_mean) / np.max(data)
    348. z1 = z[0]
    349. z2 = z[1]
    350. z3 = z[2]
    351. z4 = z[3]
    352. self.h1 = sigmoid(network.w11 * z1 + network.w12 * z2 + network.w13 * z3 + network.w14 * z4 + network.b1)
    353. self.h2 = sigmoid(network.w21 * z1 + network.w22 * z2 + network.w23 * z3 + network.w24 * z4 + network.b2)
    354. self.output = network.w1 * self.h1 + network.w2 * self.h2 + network.b3
    355. self.output = self.output * np.max(all_y_trues) + all_y_trues_mean
    356. self.d1 = round(self.output, 2) # 0.0005 is changed as 0.05
    357. self.Ncalculate_data=self.d1
    358. self.caculate_outData_label.setText(f'{self.Ncalculate_data}')
    359. print(f'Neural Networks OutPut is {self.d1}')
    360. # 函数三:点击设置按钮后用于主界面的关闭与子界面1的打开
    361. def call_dialog(self):
    362. self.childwindow = QMainWindow() # 子界面childwindow的设置
    363. self.childwindow.resize(400, 300)
    364. self.childwindow.move(300, 100)
    365. self.childwindow.setWindowTitle('设置界面')
    366. self.save = QPushButton('返回', self.childwindow) # 存储按钮
    367. self.save.move(80, 200)
    368. self.save.clicked.connect(self.back)
    369. self.language = QPushButton('语言', self.childwindow) # 语言按钮
    370. self.language.move(80, 40)
    371. self.language.clicked.connect(self.call_dialog2)
    372. self.test = QPushButton('校零', self.childwindow) # 校零按钮
    373. self.test.move(80, 120)
    374. self.test.clicked.connect(self.backzero)
    375. self.childwindow.show()
    376. # 函数四 语言按钮的子窗口2
    377. def call_dialog2(self):
    378. self.childwindow2 = QMainWindow() # 子界面childwindow的设置
    379. self.childwindow2.resize(400, 300)
    380. self.childwindow2.move(300, 100)
    381. self.childwindow2.setWindowTitle('语言界面')
    382. self.foreign = QPushButton('英语', self.childwindow2) # 存储按钮
    383. self.foreign.move(80, 40)
    384. self.foreign.clicked.connect(self.English)
    385. self.china = QPushButton('中文', self.childwindow2) # 语言按钮
    386. self.china.move(80, 120)
    387. self.china.clicked.connect(self.Chinese)
    388. self.childwindow.close()
    389. self.childwindow2.show()
    390. def English(self):
    391. self.wendu.setText('Temeratiure')
    392. self.gaodu.setText('Height')
    393. self.ceshi.setText('Begin')
    394. self.bizhong.setText('Density')
    395. self.setup.setText('Setting')
    396. self.save.setText('Save')
    397. self.language.setText('Language')
    398. self.test.setText('Test')
    399. self.foreign.setText('English')
    400. self.china.setText('Chinese')
    401. self.save.setText('Save')
    402. self.childwindow2.close()
    403. self.childwindow.show()
    404. def Chinese(self):
    405. self.wendu.setText('温度')
    406. self.gaodu.setText('高度')
    407. self.ceshi.setText('刷新')
    408. self.bizhong.setText('密度')
    409. self.setup.setText('设置')
    410. self.save.setText('存储')
    411. self.language.setText('语言')
    412. self.test.setText('校零')
    413. self.foreign.setText('英语')
    414. self.china.setText('中文')
    415. self.save.setText('返回')
    416. self.childwindow2.close()
    417. self.childwindow.show()
    418. # 函数五:点击返回按钮后用于子界面1的关闭与主界面的打开
    419. def back(self):
    420. self.childwindow.close()
    421. self.window.show()
    422. # 函数六:点击返回按钮后用于子界面1的关闭与主界面的打开
    423. def backzero(self):
    424. self.shui = 0
    425. self.buttonLabel1 = f'{self.shui}c'
    426. self.Label1.setText(self.buttonLabel1) # 改变单文本框1标签的函数,给赋当前温度值
    427. self.buttonLabel2 = f'{self.shui}cm'
    428. self.Label2.setText(self.buttonLabel2) # 改变单文本框2标签的函数,赋当前高度值
    429. self.buttonLabel3 = f'{self.shui}ml'
    430. self.Label3.setText(self.buttonLabel3) # 改变单文本框3标签的函数
    431. self.buttonLabel4 = f'{self.shui}ml'
    432. self.Label4.setText(self.buttonLabel4) # 改变单文本框4标签的函数
    433. self.childwindow.close()
    434. self.window.show()
    435. app = QApplication([])
    436. stats = Stats()
    437. stats.window.show()
    438. app.exec_()

     

    为方便调试、测量数据,编写两套启动脚本

    auto_start_test.sh:不含神经网络计算,只为测量、调试,启动、运行更快

    auto_start.sh:含神经网络计算部分,先将测量后的数据进行训练学习,利用模型得出计算量

     

     

  • 相关阅读:
    以太坊路线图:合并之后 Rollup+分片是扩容关键
    mybatis 执行流程,mybatis源码解析,推荐收藏
    【小程序】基于SpringBoot开发的餐厅点餐系统
    MySQL 表分区简介
    Metabase学习教程:入门-3
    爬虫入门基础与Selenium反爬虫策略
    TCP/IP(十九)TCP 实战抓包分析(三)TCP 第一次握手 SYN 丢包
    以sqlilabs靶场为例,讲解SQL注入攻击原理【15-17关】
    KubeEdge设备接入的mqtt调试
    面试官:vue2和vue3的区别有哪些?
  • 原文地址:https://blog.csdn.net/qq_41495871/article/details/127809293