我知道很多人都提出了相关问题,但请帮助我。我正在尝试复制我在网上找到的开源温度控制实验室。我想在Raspberry Pi上运行它。 这是我不断得到的错误:
Traceback (most recent call last):
File "/home/pi/Desktop/Python/test_Temperature.py", line 14, in <module>
print('Temperature 1: ' + str(a.T1) + ' degC')
File "/home/pi/Desktop/Python/tclab.py", line 26, in T1
self._T1 = float(self.read('T1'))
TypeError: float() argument must be a string or a number, not 'NoneType'
生成它的代码是:
import tclab
import numpy as np
import time
try:
# Connect to Arduino
a = tclab.TCLab()
# Get Version
print(a.version)
# Temperatures
print('Temperatures')
print('Temperature 1: ' + str(a.T1) + ' degC')
print('Temperature 2: ' + str(a.T2) + ' degC')
# Turn LED on
print('LED On')
a.LED(100)
# Turn on Heaters (0-100%)
print('Turn On Heaters (Q1=90%, Q2=80%)')
a.Q1(90.0)
a.Q2(80.0)
# Sleep (sec)
time.sleep(60.0)
# Turn Off Heaters
print('Turn Off Heaters')
a.Q1(0.0)
a.Q2(0.0)
# Temperatures
print('Temperatures')
print('Temperature 1: ' + str(a.T1) + ' degC')
print('Temperature 2: ' + str(a.T2) + ' degC')
# Allow user to end loop with Ctrl-C
except KeyboardInterrupt:
# Disconnect from Arduino
a.Q1(0)
a.Q2(0)
print('Shutting down')
a.close()
# Make sure serial connection still closes when there's an error
except:
# Disconnect from Arduino
a.Q1(0)
a.Q2(0)
print('Error: Shutting down')
a.close()
raise
我相信代码会尝试使用以下代码与另一个python文件进行通信:
import sys
import time
import numpy as np
try:
import serial
except:
import pip
pip.main(['install','pyserial'])
import serial
from serial.tools import list_ports
class TCLab(object):
def __init__(self, port=None, baud=9600):
if (sys.platform == 'darwin') and not port:
port = '/dev/ttyACM1'
def stop(self):
return self.read('X')
def version(self):
return self.read('VER')
@property
def T1(self):
self._T1 = float(self.read('T1'))
return self._T1
@property
def T2(self):
self._T2 = float(self.read('T2'))
return self._T2
def LED(self,pwm):
pwm = max(0.0,min(100.0,pwm))/2.0
self.write('LED',pwm)
return pwm
def Q1(self,pwm):
pwm = max(0.0,min(100.0,pwm))
self.write('Q1',pwm)
return pwm
def Q2(self,pwm):
pwm = max(0.0,min(100.0,pwm))
self.write('Q2',pwm)
return pwm
# save txt file with data and set point
# t = time
# u1,u2 = heaters
# y1,y2 = tempeatures
# sp1,sp2 = setpoints
def save_txt(self,t,u1,u2,y1,y2,sp1,sp2):
data = np.vstack((t,u1,u2,y1,y2,sp1,sp2)) # vertical stack
data = data.T # transpose data
top = 'Time (sec), Heater 1 (%), Heater 2 (%), ' \
+ 'Temperature 1 (degC), Temperature 2 (degC), ' \
+ 'Set Point 1 (degC), Set Point 2 (degC)'
np.savetxt('data.txt',data,delimiter=',',header=top,comments='')
def read(self,cmd):
cmd_str = self.build_cmd_str(cmd,'')
try:
self.sp.write(cmd_str.encode())
self.sp.flush()
except Exception:
return None
return self.sp.readline().decode('UTF-8').replace("\r\n", "")
def write(self,cmd,pwm):
cmd_str = self.build_cmd_str(cmd,(pwm,))
try:
self.sp.write(cmd_str.encode())
self.sp.flush()
except:
return None
return self.sp.readline().decode('UTF-8').replace("\r\n", "")
def build_cmd_str(self,cmd, args=None):
"""
Build a command string that can be sent to the arduino.
Input:
cmd (str): the command to send to the arduino, must not
contain a % character
args (iterable): the arguments to send to the command
"""
if args:
args = ' '.join(map(str, args))
else:
args = ''
return "{cmd} {args}\n".format(cmd=cmd, args=args)
def close(self):
try:
self.sp.close()
print('Arduino disconnected successfully')
except:
print('Problems disconnecting from Arduino.')
print('Please unplug and reconnect Arduino.')
return True
我还不知道我的python代码,所以一个非常明确的“虚拟类”解释的解决方案真的会有所帮助。谢谢你们。
答案 0 :(得分:0)
这是read()
函数:
def read(self,cmd):
cmd_str = self.build_cmd_str(cmd,'')
try:
self.sp.write(cmd_str.encode())
self.sp.flush()
except Exception:
return None
return self.sp.readline().decode('UTF-8').replace("\r\n", "")
可以返回的其中一项是 None
,正如您在return None
行中看到的那样。如果发生这种情况,那么你的行:
float(self.read('T1'))
会失败,因为它会尝试将None
转换为float
,并且会出现您收到的错误。