Я использую кнопки для включения и выключения светодиода с помощью Raspberry Pi. Две кнопки работают нормально, но по какой-то причине в какой-то конкретной функции кажется, что она постоянно нажимается. Это не относится к другим функциям, и код для другой кнопки кажется идентичным, поэтому я изо всех сил пытаюсь определить проблему. Датчик PIR тоже работает нормально.

import time
import RPi.GPIO as GPIO
import os
GPIO.setmode(GPIO.BCM)
PIR_PIN = 7
GPIO.setup(PIR_PIN, GPIO.IN)
btn_pin = 4#first button
led_pin = 12#LED
btn_pin2 = 24#second button
GPIO.setmode(GPIO.BCM)
GPIO.setup(btn_pin, GPIO.IN)#first button
GPIO.setup(led_pin, GPIO.OUT)#LED
GPIO.setup(btn_pin2, GPIO.IN)#second button
GPIO.output(12, GPIO.LOW)#turn LED off
light = 0
count = 0
account = 0

while True:
    if GPIO.input(4) == 0:
        time.sleep(0.4)
        if light == 0:
            GPIO.output(12, GPIO.HIGH)
            print('On')
            light = 1
        else:
            GPIO.output(12, GPIO.LOW)#Turn light off
            print('Off')
            light = 0
            w = open('Database3.txt', 'r')
            for line in w:
                account = line
            w.close()
            g = open('Database2.txt', 'r')
            temp = open('temp_file', 'w')
            for line in g:
                CurrentLine = line.split(',')
                if CurrentLine[0] == account:
                    current = CurrentLine[5]#retrieves current energy stats
                    print(current)#Check for correct value
                    current_value = float(current)#Declares a float
                    current_value = current_value + count#Adds on current use
                    print(current_value)
                    current = str(current_value)#Declares a string
                    CurrentLine[5] = (current)#Updates value
                OutputLine = ','.join(CurrentLine)
                temp.write(OutputLine)#Writes data to temporary file
            g.close()#Closes file
            temp.close()#Closes file
            os.remove('Database2.txt')#Removes original file
            os.rename('temp_file', 'Database2.txt')#Renames current file
            count = 0

    if GPIO.input(24) == 0:
        time.sleep(2)#Allows for daily average to be calculated
        GPIO.output(12, GPIO.LOW)#Turns light off
        #print('Off')
        w = open('Database3.txt', 'r')
        for line in w:
            account = line
        w.close()
        light = 0
        print('New day')
        temp = open('temp_file', 'w')
        h = open('Database2.txt', 'r')
        print(account)
        for line in h:
            CurrentLine = line.split(',')
            if CurrentLine[0] == account:
                    days = CurrentLine[4]#retrieves current energy stats
                    #print(days)#Check for correct value
                    num_days = float(days)#Declares an integer

                    total = CurrentLine[6]#retrieves current energy stats
                    #print(total)#Check for correct value
                    total_num = float(total)#Declares an float

                    today = CurrentLine[5]
                    today_float = float(today)

                    total_num = total_num + today_float
                    print('total energy: ',total_num,)

                    DailyAverage = total_num/num_days
                    DailyAverageStr = str(DailyAverage)
                    num_days = num_days + 1#Adds an extra day

                    total = str(total_num)#Declares a string
                    days = str(num_days)
                    print('num days: ',num_days,)

                    CurrentLine[4] = days
                    CurrentLine[6] = (total)#Updates value
                    CurrentLine[5] = '0'#Resets the energy use for 'today'
                    CurrentLine[7] = DailyAverageStr
            OutputLine = ','.join(CurrentLine) 
            temp.write(OutputLine)#Writes data to temporary file
        h.close()#Closes file
        temp.close()#Closes file
        os.remove('Database2.txt')#Removes original file
        os.rename('temp_file', 'Database2.txt')#Renames current file

    if GPIO.input(PIR_PIN):
        if light == 1:
            print('Motion Detected')
            print('Turn the lights off!')
            count = count + 1
            time.sleep(1)

Первый работает нормально, однако со вторым, независимо от того, установлен ли он на «0» или «1», он думает, что он постоянно нажимается. Если бы кто-нибудь мог предложить какие-то предложения, буду очень признателен.

1
Olivia 11 Янв 2020 в 22:12

1 ответ

Вам необходимо настроить встроенный PULL-UP резистор.

GPIO.setup(btn_pin2, GPIO.IN, pull_up_down=GPIO.PUD_UP)

Объяснение:

Когда вы подключаете вывод RPI к любой цифровой схеме (например, датчику PIR) с цифровым выходом, есть гарантия, что на выводе RPI будет какое-то стабильное напряжение, то есть либо логический «0», либо «1».

Кнопка, с другой стороны, не обеспечивает никакого опорного напряжения (при нажатии), потому что у нее есть только 2 «контакта» без питания и без какой-либо электроники.

Обычно кнопки используются в сочетании с

  • либо подтягивающий резистор с замыканием кнопки на массу (для подачи сигнала «1» в «нажатом состоянии»)
  • или понижающий резистор и кнопка закорачивают линию питания при нажатии (для подачи сигнала «0» при нажатии кнопки)

BCM SoC содержит встроенные резисторы, которые можно использовать для настройки входного сигнала в случае, если контакт болтается в воздухе (то есть при использовании с кнопкой без дополнительного резистора).

Метод setup имеет третий параметр, который устанавливает подтягивающие / понижающие резисторы.

настройка (канал (ы), направление, pull_up_down = PUD_OFF, начальный = None)

По умолчанию режим PUD (pull-up-down) инициализируется значением PUD_OFF, что хорошо, когда вы подключаете устройство RPI к цифровому выходу внешней цифровой схемы.

Но вам нужно явно указать режим PUD, когда вы используете висячий контакт для ввода.

PS: это может быть интересно для ты.

0
Maxim Sagaydachny 16 Янв 2020 в 08:57