Сбой 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"

0 ответов

Другие вопросы по тегам