2013-09-16 4 views
-1

Здравствуйте, у меня есть небольшая проблема. Сделал небольшой проект с малиной Pi.
О проекте: Существует переключатель, подключенный к дверям, когда двери открыты, переключатель нажат, а малина Pi записывает дату и время в файл, но он делает это каждые 2 секунды, если двери все еще открыты. Я понял, как изменить это время, но если я поставлю больше времени на спящий режим, тогда, если двери закрыты, но время сна не прошло, двери могут быть снова открыты, и это не будет записано в файл. Вот мой код для этого. У меня есть два светодиода, чтобы видеть, когда двери закрыты и открыты.Python time.sleep script

#!/usr/bin/env python 

import time 
import RPi.GPIO as GPIO 

def main(): 
    GPIO.setmode(GPIO.BCM) 

    GPIO.setup(23,GPIO.IN) 
    GPIO.setup(24,GPIO.OUT) 
    GPIO.setup(25,GPIO.OUT) 


    GPIO.output(25,True) 

    while True: 
     if GPIO.input(23): 
      GPIO.output(24,True) 
      GPIO.output(25,False) 
      f = open('register','a') 
      t = time.strftime("%Y.%m.%d. - %H:%M:%S") 
      f.write('Doors opened ') 
      f.write(t) 
      f.write('\n') 
      f.close() 
     else: 

      GPIO.output(24,False) 
      GPIO.output(25,True) 
      print "button false" 

     time.sleep(0.1) 

    GPIO.cleanup() 



if __name__=="__main__": 
    main() 

В принципе, код проверяется каждую секунду, если цепь закрыта или нет. Если он не записывает каждый второй новый текстовый файл с датой и временем, если он не продолжает проверку. Мне нужно написать в файл дату и время открытия дверей, а затем ждать закрытия двери.

+0

Независимо от вашей проблемы, я бы рекомендовал не открывать и закрывать файл войти время цикла. Просто откройте файл журнала перед входом в цикл while и закройте его после цикла while. – tssch

+0

Не работал, теперь он ничего не писал в файле во время выполнения этой программы, а когда я нажал Ctrl + c, он написал все результаты в файле, но снова с интервалом в 2 секунды. – jjanko3

+0

@ jjanko3 Причина, по которой все было написано, когда вы уходите программа связана с тем, что буферы Python записываются по умолчанию. О том, как это сделать, см. Здесь: http://docs.python.org/2/library/functions.html#open Извините, я не могу помочь с реальной проблемой! Было бы очень полезно, если бы вы отредактировали вопрос, чтобы объяснить, что представляют собой все цифры '23-25'. – darthbith

ответ

0

Вы должны записать последнее значение, считанное с дверного переключателя, и только журнал, если текущее значение отличается от последнего значения.

last_value = None #Set to None so it will always be different the first time. 
while True: 
    current_value = GPIO.input(23) 
    if current_value != last_value: 
     if current_value: 
      GPIO.output(24,True) 
      GPIO.output(25,False) 
      #LOG STUFF 
     else: 
      GPIO.output(24,False) 
      GPIO.output(25,True) 
      print "button false" 
    last_value = current_value 
    time.sleep(0.1) 
+0

Большое спасибо – jjanko3

-1
import RPi.gpio as gpio 
import time 

open_door_pin = 23 
red_light_pin = 24 
green_light_pin = 25 

gpio.setmode(gpio.bcm) 

gpio.setup(open_door_pin, gpio.IN) 
gpio.setup(red_light_pin, gpio.OUT) 
gpio.setup(green_light_pin, gpio.OUT) 

gpio.output(red_light_pin, False) 
gpio.output(green_light_pin, True) 

f = open('register','a') 

while True: 
    gpio.wait_for_edge(open_door_pin,gpio.BOTH) 
    if gpio.input(open_door_pin): 
    gpio.output(red_light_pin, True) 
    gpio.output(green_light_pin, False) 
    t = time.strftime("%Y.%m.%d. - %H:%M:%S") 
    f.write('Doors opened ') 
    f.write(t) 
    f.write('\n') 
    else: 
    gpio.output(red_light_pin, False) 
    gpio.output(green_light_pin, True) 
    t = time.strftime("%Y.%m.%d. - %H:%M:%S") 
    f.write('Doors closed ') 
    f.write(t) 
    f.write('\n') 

f.close() 
gpio.cleanup() 
+0

Можете ли вы добавить какое-то объяснение? – dazedconfused

Смежные вопросы