-2

I'm trying to fix this code for a robot with multiple sensors. The values of TRIG and ECHO are input through another part of the code.

Set this at the beginning of the code

def init():
    GPIO.setmode(GPIO.BOARD)

This is the function where I'm getting the error

def getSensor(TRIG,ECHO):
    try:
        init()
        #Set the pins for TRIG, trig is the output pin 
        GPIO.setup(TRIG,GPIO.OUT) #Error right here
        #Set the pins for ECHO, echo is the input pin
        GPIO.setup(ECHO,GPIO.IN)
        #3.3v sent to trig
        GPIO.output(TRIG,1)
        #turn off the trig pin
        GPIO.output(TRIG,0)
        while GPIO.input(ECHO) == 0:
            pass
        start = time.time()
        while GPIO.input(ECHO) == 1:
            pass
        stop = time.time()
        reading = (stop - start) * 17000
        return reading    
    except KeyboardInterrupt:
        print ("Interrupted by keyboard")
    except:
        print ("Other error or exception occured")
    finally:
        GPIO.cleanup()

How can I fix this? I can't figure out where I'm going wrong

Shreesh
  • 1
  • 1
  • 3
  • Related if not dupe: https://raspberrypi.stackexchange.com/q/55143/19949 – Ghanima Jul 22 '19 at 21:11
  • Have you looked at the warning message? It used to tell you exactly what you needed to do to stop the warning. – joan Jul 22 '19 at 21:18
  • @Ghanima I read through that right before posting this, i believe the error is the same, but can't figure out what exactly i should change – Shreesh Jul 22 '19 at 21:22
  • @joan it says to use GPIO.setwarnings(False) to disable it, but that just ignores the error, and doesn't help me use the robot – Shreesh Jul 22 '19 at 21:23
  • Warnings are just warnings, not errors. And you can turn them off. – ben_nuttall Jul 22 '19 at 21:42

2 Answers2

2

Debugging without all relevant code is a hit and miss affair.

Your problem is most likely to be caused by calling GPIO.setup() inside a function. This should be called ONCE in your program.

Calling GPIO.setmode multiple times is also an error it definitely should be called ONCE only.

NOTE there is actually nothing wrong with calling the setup multiple times, but Python is quite correctly warning you.

Milliways
  • 59,890
  • 31
  • 101
  • 209
1

I'm guessing you don't see this every time, but maybe every 2nd run? Here's why: When you run it the first time, your code exits the function through the 'return reading' statement, skipping the gpio.cleanup() line. This leaves the pins in an 'in use' state.

When is gets called again or you run it a second time, your call to gpio.setup() triggers an exception, but then in your finally clause you call gpio.cleanup() which frees up the pins. If you run it again, it'll work starting the cycle over.

The solution is to simply add a gpio.cleanup() before the return statement

tbitson
  • 161
  • 4