Search code examples
raspberry-piemulationraspbiangpio

Does GPIO.IN need to be linked to GPIO.OUT in RPi.GPIO in order for it to work properly?


I was writing code on an raspbian emulator with GPIO. I am able to get it to work, but for some reason when I change the order of GPIO.HIGH and the print statement in the conditionals, it does not run properly and stops after the first click. Anyone know if this is an issue with the emulator or just a property of raspberry pi and hooking it up to hardware? It also does not work at all if I do not link the GPIO.IN with a GPIO.OUT.

this gif shows what happens when I change order or remove - It turns on the first time, but it does not turn off or on again after that. It for some reason breaks it out of the while loop.

gif of activity

Here is the code I am using:

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
import time
#initialise a previous input variable to 0 (assume button not pressed last)
prev_input = 0
prev_input1 = 0

inputs = [11, 13, 15]
outputs = [3, 5, 7]
GPIO.setup(inputs, GPIO.IN)
GPIO.setup(outputs, GPIO.OUT)

secs = 0

def main():
  while True:
    button_press(15, 7)
    timer = add_secs(11, 5, 2)
    #print(timer)


def button_press(button1, button2):
  #take a reading
  global prev_input
  inputa = GPIO.input(button1)
  #if the last reading was low and this one high, print
  if ((not prev_input) and inputa):
    print("Light on")
    GPIO.output(button2, GPIO.HIGH)   #code does not work if I remove/reorder this statement
  if((not inputa) and prev_input):
    print("Light off")
    GPIO.output(button2, GPIO.LOW)      #code does not work if I remove/reorder this statement
  #update previous input
  prev_input = inputa
  #slight pause to debounce
  time.sleep(0.05)

def add_secs(button1, button2, num):
  global prev_input1
  secs = 0
  inputa = GPIO.input(button1)
  if((not prev_input1) and inputa):
    secs = num
    print(secs)
    GPIO.output(button2, GPIO.LOW)      #code does not work if I remove/reorder this statement
  prev_input1 = inputa
  time.sleep(0.05)
  return secs


main()

Solution

  • I contacted the developer of the emulator and he let me know there was an issue with the emulator that is now resolved.

    The code runs properly after clearing the browsing data in chrome and re-running the program.