Сбой Raspberry Pi во время программы на Python (ИЛИ как можно убить Linux???)
Я строю сенсор с активированной клавиатурой с помощью Raspberry Pi и Python. Кажется, все идет хорошо, но через несколько минут и нескольких нажатий клавиш на клавиатуре происходит полный сбой Pi, и он немедленно отключается - никаких сообщений об ошибках не появляется.
Сценарий будет непрерывно ждать ввода с клавиатуры, и если код верен, включите датчик, если это не так, попробуйте снова. Если датчик активирован, вы должны ввести правильные цифры, чтобы избежать срабатывания будильника через 30 секунд)
Может ли кто-нибудь указать мне, в чем может быть проблема? Вот то, что я пытался до сих пор безуспешно
1) Обмен пи на новый пи 2
2) Различные ОС, как NOOBS, так и Raspbian Wheezy
3) Другой датчик (акселерометр против ИК-датчика)
4) Отключите монитор, клавиатуру и используйте SSH соединение через Cygwin
5) Получить файл журнала до сбоя - файл журнала был пуст после перезагрузки
python bad_script &> full_log.txt
6) Другая команда файла журнала: вызывает мгновенный сбой и также пуста после перезагрузки:
python script.py >> /logdir/script.py.log 2>&1
Вопрос в том, как я могу разбить Linux? Если это проблема с памятью, разве в linux нет предупреждения о прекращении обработки до их появления?
Вот полный скрипт, который я запускаю:
import sys
from time import sleep
import threading
import signal
from matrix_keypad import RPi_GPIO1
import RPi.GPIO as GPIO
import smbus
import time
passcode = [1,2,3,4] # this is the correct code you have to enter
kp = RPi_GPIO1.keypad(columnCount = 3)
alarm_active = threading.Event() # shared variable used to control the sensor monitoring thread
alarm_active.clear() # Clear the alarm initially
monitor_thread = None # Global variable used to store the monitoring thread
#Set up all the pins correctio
GPIO.setmode(GPIO.BCM)
PINIR=7
GPIO.setup(7, GPIO.IN) # infrad-sensor
#Now activate the kaypad and listen for keypad inputs
def digit():
r = None
while r == None:
r = kp.getKey()
return r
def get_keycode():
# Function to loop around reading 4 keypresses in a row
# Compare against chosen code
# If match, switch the alarm state
entered = []
while len(entered) < 4:
key = digit()
sleep(0.5)
print key
entered.append( key )
if entered == passcode:
entered = []
print "Code correct"
switch_alarm_state()
else:
# Just clear the keypad buffer if the wrong code went in
# Could say "BAD CODE!" here, or even force immediate alarm perhaps
print "Wrong Code - Try again"
GPIO.output(27, True) # let red LED blink as indicator that code was wrong
time.sleep(1)
GPIO.output(27, False)
entered = []
def switch_alarm_state():
# Function to control the state of the alarm
# If the alarm should be on, run a thread monitoring the sensor
# If the alarm should be off, make sure the thread is stopped
global monitor_thread
if alarm_active.is_set():
# If the alarm is currently set, stop it
print "Alarm was abolished"
GPIO.output(17, False) #switch green LED off
alarm_active.clear() # Signals to the monitor thread that we wish to shut it down
monitor_thread.join() # Wait until the monitor thread has stopped
else:
# Alarm is not currently set, so start the sensor monitor thread going
print "Alarm was activated"
GPIO.output(17, True)
monitor_thread = threading.Thread( target=sensor_monitor )
alarm_active.set()
monitor_thread.start()
def sensor_monitor():
# Function to be run in a separate thread, monitoring the sensor
alarm_timer = None # Variable to hold a timer object that will fire the alarm
while alarm_active.is_set():
#print xrota
if GPIO.input(PINIR):
print "Alarm has been triggered"
if alarm_timer is None:
alarm_timer = threading.Timer( 30.0, fire_alarm )
alarm_timer.start()
sleep(0.5)
# The alarm must have been deactivated to get here
# Stop any outstanding alarms and shutdown
if alarm_timer is not None:
alarm_timer.cancel()
return
def fire_alarm():
# Here you implement the actions to be carried out by an alarm
print "Alarm is send to server"
msg = "Alarm"
publish.single("alarm/demo",msg, hostname="52.17.194.125")
def shutdown_handler( signum, frame ):
# Shut down the child thread nicely
alarm_active.clear()
monitor_thread.join()
if __name__ == '__main__': # This is the Python way to check you are being directly run, and not just imported by another script
signal.signal( signal.SIGINT, shutdown_handler ) # If you stop the script with ctrl+C, make sure it shuts down properly
signal.signal( signal.SIGTERM, shutdown_handler )
try:
while True:
get_keycode()
except KeyboardInterrupt:
GPIO.cleanup()
print "Quit program"