0

Iam trying to create the error detection application for my battery charger prototype using Rpi.GPIO. I successfully created the add event detect for multiple GPIO pins (totally 8 pins for each error).

My doubt is regarding the assignment of priority for each error. I try to run the call back function depends on the priority list below but unsuccessful. If i give emergency stop signal after earth missing it is not detected. Emergency stop signal gets detected only after earth missing signal. I listed the error according to the priority below.

  1. Emergency stop
  2. Phase reversal
  3. Earth Leakage
  4. Earth Missing
  5. Short circuit
  6. power failure
  7. Input over voltage
  8. Input under voltage

I attached the example code below

import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD) # We are accessing GPIOs according to their physical location
GPIO.setup(37, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(35, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(33, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(31, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(29, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(40, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(38, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(36, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def errorDetection(channel):
 if(channel == 37):
 while GPIO.input(37) == 0:
 print('Emergency stop occured')
 
 
 elif(channel == 35):
 while GPIO.input(35) == 0:
 print('Phase reverse occured')
 
 elif(channel == 33):
 while GPIO.input(33) == 0:
 print('Earth leakage occured')
 
 elif(channel == 31):
 while GPIO.input(31) == 0:
 print('Earth Missing occured')
 
 elif(channel == 29):
 while GPIO.input(29) == 0:
 print('Short circuit occured')
 
 elif(channel == 40):
 while GPIO.input(40) == 0:
 print('Power failure occured')
 
 elif(channel == 38):
 while GPIO.input(38) == 0:
 print('Input over voltage occured')
 
 elif(channel == 36):
 while GPIO.input(36) == 0:
 print('Input under voltage occured')
 
GPIO.add_event_detect(37, GPIO.FALLING, errorDetection, bouncetime=2000)
GPIO.add_event_detect(35, GPIO.FALLING, errorDetection, bouncetime=2000)
GPIO.add_event_detect(33, GPIO.FALLING, errorDetection, bouncetime=2000)
GPIO.add_event_detect(31, GPIO.FALLING, errorDetection, bouncetime=2000)
GPIO.add_event_detect(29, GPIO.FALLING, errorDetection, bouncetime=2000)
GPIO.add_event_detect(40, GPIO.FALLING, errorDetection, bouncetime=2000)
GPIO.add_event_detect(38, GPIO.FALLING, errorDetection, bouncetime=2000)
GPIO.add_event_detect(36, GPIO.FALLING, errorDetection, bouncetime=2000)
i = 0;
while i <= 10:
 print("i value",i)
 i = i+1
 sleep(4)
 if i == 10:
 i = 0
asked Sep 2, 2021 at 9:30
3
  • 1
    While joan's comments are relevant WHY would you use a single callback function rather than callbacks for each event? Then you don't need any if or other tests. Commented Sep 2, 2021 at 9:48
  • I think i used a single call back function errorDetection for multiple GPIO add events. correct me if iam wrong Commented Sep 2, 2021 at 10:01
  • 1
    I suggest you try gpiozero which is much simpler than RPi.GPIO and has many excellent examples. Commented Sep 2, 2021 at 10:49

1 Answer 1

1

You have a while loop for each condition. That means the program flow stops at that position until the condition is removed.

I suggest you change those while to if. That should do what you seem to want.

E.g. rather than

while GPIO.input(37) == 0:

use

if GPIO.input(37) == 0:

answered Sep 2, 2021 at 9:42
2
  • i tried using if statement also but the execution immediately return to main while loop even though my input signal is low. My doubt how to make the execution to stay in the within if statement until the GPIO value becomes high again. Commented Sep 2, 2021 at 9:57
  • This has become just an ordinary programming question. You need to sit down and think about what you are trying to achieve. Personally I would detect rising and falling edges and clear/set a flag for each trigger. Commented Sep 2, 2021 at 12:55

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.