我在Raspberry Pi上使用python从Arduino和mySQL数据库发送和接收变量,进行一些计算并将数据发送到适当的目的地。在脚本的开头我将数据保存在" oldVariables"查看数据库数据是否已更改。出于某种原因,我在0
函数中将变量设置为1
或if
,如果调用了该函数,则打印出6
..我才开始使用python进行这个项目所以请随意批评我的代码,以便我可以改进它。这是我得到的:
这是返回6的部分(我发送" m发送" 6"来自Arduino on button事件):
arduino = ser.readline().strip()
while arduino < 8:
if (arduino == 6):
if (oldAlarm == 0):
aStat = 1
armed = True
os.system("python alarmOn.py")
else:
aStat = 0
armed = False
cur.execute("UPDATE elements SET value = %s WHERE element = 'Alarm'",
(aStat))
print aStat
con.commit()
arduino = ser.readline().strip()
由于某些或其他原因,更新数据库的唯一功能是LDR,其中if (arduino > 100):
但更新数据库的其他功能看起来完全相同但他们没有更新,甚至在我进入之前while arduino < 8
循环。
这就是剩下的......:
import MySQLdb as mdb
import sys
import serial
import os
import time
ser = serial.Serial('/dev/ttyACM1', 9600)
con = mdb.connect('10.0.0.100', 'pi', 'pi', 'Smart_Home')
arduino = 0
oldAlarm = 0
aStat = 0
rStat = 0
lStat = 0
armed = False
with con:
cur = con.cursor()
cur.execute("SELECT value FROM elements WHERE element='Alarm'")
rows = cur.fetchone()
for row in rows:
oldAlarm = int(row)
cur.execute("SELECT value FROM elements WHERE element='Relay'")
rows = cur.fetchone()
for row in rows:
oldRelay = int(row)
cur.execute("SELECT value FROM elements WHERE element='Motion'")
rows = cur.fetchone()
for row in rows:
oldMotion = int(row)
def triggerAlarm():
global oldAlarm
if (oldAlarm != alarm):
ser.write('1')
if (oldAlarm == 0):
oldAlarm = 1
armed = True
else:
oldAlarm = 0
armed = False
def triggerRelay():
global oldRelay
if (oldRelay != relay):
ser.write('2')
if (oldRelay == 0): oldRelay = 1
else: oldRelay = 0
def triggerMotion():
global oldMotion
if (oldMotion != motion & armed == True):
ser.write('3')
while True:
arduino = ser.readline().strip()
if (arduino > 100):
lStat = arduino
print lStat
cur.execute("UPDATE elements SET value = %s WHERE element = 'LDR'",
(lStat))
con.commit()
arduino = ser.readline().strip()
while arduino < 8:
if (arduino == 6):
if (oldAlarm == 0):
aStat = 1
armed = True
os.system("python alarmOn.py")
else:
aStat = 0
armed = False
cur.execute("UPDATE elements SET value = %s WHERE element = 'Alarm'",
(aStat))
print aStat
con.commit()
arduino = ser.readline().strip()
if (arduino == 7):
rStat = 1
print rStat
cur.execute("UPDATE elements SET value = %s WHERE element = 'Relay'",
(rStat))
con.commit()
arduino = ser.readline().strip()
if (arduino == 8):
rStat = 0
print rStat
cur.execute("UPDATE elements SET value = %s WHERE element = 'Relay'",
(rStat))
con.commit()
break;
cur.execute("SELECT value FROM elements WHERE element = 'Alarm'")
rows = cur.fetchone()
for row in rows:
alarm = int(row)
triggerAlarm()
cur.execute("SELECT value FROM elements WHERE element = 'Relay'")
rows = cur.fetchone()
for row in rows:
relay = int(row)
triggerRelay()
cur.execute("SELECT value FROM elements WHERE element = 'Motion'")
rows = cur.fetchone()
for row in rows:
motion = int(row)
triggerMotion()
print 'end'
很抱歉这段代码很长,但我学到的关于python的一件事是它对我来说非常难以预测,而且简单的错误可能在任何地方......
当我播出时,我的os.system("python alarmOn.py")
在调用事件时也没有执行..:/
答案 0 :(得分:1)
您的主要问题是您正在使用行
读取串行输入arduino = ser.readline().strip()
将其与程序体中的整数进行比较,例如:if (arduino == 6)
或
while arduino < 8
。
虽然Python 2在数字和字符串之间的<
或>
比较中没有引发错误,但这是一个错误。在Python 2中,所有字符串都比任何数字都要大。 (因此,您的while arduino < 8
永远不会输入)。在Python3中,程序会
此时只是打破了TypeError。 (==比较没有错,他们只是
从来都不是真的。)
所以,请记住,与SQL或ShellScript不同,Python是一种强类型语言 - 和数字根本不同于字符串。
如果您实际上是从arduino发送文本号码(ASCII字符用
字节值48 - 58),您必须在阅读后转换为int
的整数:
arduino = int(ser.readline().strip())
另一方面,如果您要发送数字字节&#34; 8&#34;或&#34; 100&#34;在&#34; 0 - 255&#34;范围
从arduino中,您可以使用ord
内置的Python获取数字:
arduino = 0
value = ser.readline().strip()
if value:
arduino = ord(value)
您可能会在该代码中遇到其他问题,但修复此问题会使您按计划进行,以便了解正在进行的操作。由于您要打印值以检查发生了什么,请打印arduino
变量,以便您知道实际发生了什么。
(您可以使用print repr(arduino)
来区分字符串和整数值)