Raspberry Pi, кажется, думает, что кнопка постоянно нажимается - PullRequest
1 голос
/ 11 января 2020

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

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 Ответ

0 голосов
/ 16 января 2020

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

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

Объяснение:

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

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...