我拥有一台连接到树莓的3D打印机。为了控制(如通过继电器关闭和关闭)远程打印机,我制作了一个小的python脚本。
控制它的一种可能性是使用似乎正常工作的Telegram Bot(telepot)。 打开和关闭打印机的另一种方法是硬件开关。出于安全原因,我希望只有按下开关3秒钟才能关闭打印机。
问题是,脚本有时会崩溃(大多数是在很长的正常运行时间之后)。 我认为它是我最后的循环,但我不明白为什么它只会在不同的时间后崩溃以及如何改进它。 那是迄今为止的代码:
#!/usr/bin/python
import time
import subprocess
import os
import datetime
import telepot
import urllib
import RPi.GPIO as GPIO
chat_id_auth = XXXXXXXXXXX
# Warnungen ausschalten
GPIO.setwarnings(False)
# Pin Nummern verwenden
GPIO.setmode(GPIO.BOARD)
# Pin 11 als Input
GPIO.setup(29, GPIO.IN)
GPIO.setup(11, GPIO.OUT)
GPIO.output(11, 0) #on
def handle(msg):
chat_id = msg['chat']['id']
command = msg['text']
print 'Got command: %s' % command
if chat_id == chat_id_auth:
if command == '/status':
bot.sendMessage(chat_id, 'online')
elif command == '/picture':
bashCommand = 'wget --output-document snapshot.jpg http://127.0.0.1:8080/?action=snapshot'
subprocess.check_output(bashCommand, shell=True)
print ('downloaded photo')
bot.sendPhoto(chat_id, open('snapshot.jpg','rb'), caption='Printer Status')
print ('sent photo')
bashCommand = 'rm snapshot.jpg'
subprocess.check_output(bashCommand, shell=True)
print ('removed photo')
elif command == '/ip':
bashCommand = 'ifconfig eth0 | grep \'inet addr:\' | cut -d: -f2 | awk \'{ print $1}\''
output = subprocess.check_output(bashCommand, shell=True)
bot.sendMessage(chat_id, output)
print(output)
elif command == '/on':
#bashCommand = 'echo \'0\' > /sys/class/gpio/gpio17/value'
#output = subprocess.check_output(bashCommand, shell=True)
GPIO.output(11, 0) #on
bot.sendMessage(chat_id, 'Drucker wird eingeschaltet..')
#print(output)
elif command == '/off':
#bashCommand = 'echo \'1\' > /sys/class/gpio/gpio17/value'
#output = subprocess.check_output(bashCommand, shell=True)
GPIO.output(11, 1) #off
bot.sendMessage(chat_id, 'Drucker wird ausgeschaltet..')
#print(output)
else:
bot.sendMessage(chat_id, 'You are not authorized.')
bot = telepot.Bot('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
bot.message_loop(handle)
print 'I am listening ...'
global n
n=0
while True:
if GPIO.input(29):
if GPIO.input(11) == 0:
if n >= 300: #Taster 3s halten zum Ausschalten
GPIO.output(11, 1) #off
n=0
time.sleep(2)
elif GPIO.input(11) == 1:
GPIO.output(11, 0) #on
n=0
time.sleep(2)
time.sleep(0.01)
n+=1
else:
n=0
print n
GPIO.cleanup()
答案 0 :(得分:0)
我看不出崩溃的明确原因,但最后的while循环似乎非常繁忙,等待什么也没做(没有按下按钮)。根据我的理解,然后打印0和循环没有任何延迟,因此它将尽可能快地打印零并尽可能地保持Raspi忙。也许负载是您遇到任何崩溃的间接原因(但这只是疯狂的猜测)。
无论如何,我建议改进那个大规模忙碌的等待。即使它没有解决崩溃,它也会改善您的代码。要实现这一点,只需在time.sleep(0.1)
分支中添加else:
,每秒最多循环十次(并不像CPU那样快)。
无论如何你应该调试情况。找出崩溃的原因。
./script.py >& script.log
)try
/ except
您的例外和打印调试内容,以防您抓到一些。kill -l
以查看所有信号及其编号的列表。