element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • About Us
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Raspberry Pi
  • Products
  • More
Raspberry Pi
Raspberry Pi Forum Python help with GPIO
  • Blog
  • Forum
  • Documents
  • Quiz
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Raspberry Pi to participate - click to join for free!
Featured Articles
Announcing Pi
Technical Specifications
Raspberry Pi FAQs
Win a Pi
Raspberry Pi Wishlist
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • State Suggested Answer
  • Replies 27 replies
  • Answers 10 answers
  • Subscribers 666 subscribers
  • Views 3411 views
  • Users 0 members are here
  • raspberry_pi
Related

Python help with GPIO

rcayot
rcayot over 5 years ago

Okay, I guess it is time to ask for help.  I have learned how to breadboard up a set of traffic lights, a button and a buzzer.  I can get them all to work with simple python programs.  Now I want to interrupt the normal light sequence when the button is pushed.  I can even get a detect event to work.  What I do not seem to be able to do is condition the "if" or "while" loop for the lights on the event. 

 

I have a callback and it seems to work, so I can print the status of the "button is pressed" but I cannot pass it as "true" to the loop.  I suspect it may be that when defining "btnpushed" it is local to only the callback loop?

 

i can self learn, but most of the tutorials I see are very single topic context, like what is a while loop or what is an if loop.  Any pointers to a good example of using these functions would be great!

 

i hope this is clear.

 

Roger Ayotte

  • Sign in to reply
  • Cancel
  • shabaz
    0 shabaz over 5 years ago in reply to rcayot

    rcayot  wrote:

     

    I happened to be trying that, it works when only = instead of ==

     

    I added a print statement after btnpushed = 0 and at the start of the program it prints 0, and when I press the button, it prints 1 but on every case the lights keep cycling.

     


    Roger

     

    That's because every variable you're modifying in that def block is _local_. You need to define it as global.

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Verify Answer
    • Reject Answer
    • Cancel
  • rcayot
    0 rcayot over 5 years ago in reply to shabaz

    yes? using btnpushed as global worked as far as getting the loop interrupted?

     

    Now back to work on the rest of it!

     

    Thanks all who helped!

     

    Roger Ayotte

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • genebren
    0 genebren over 5 years ago in reply to rcayot

    Roger,

     

    I would assume that you will also need an GPIO.add_event_detect(26, GPIO.FALLING, callback=cb1, bouncetime=300) statement to detect GPIO.RISING to clear btnpushed in order to get your loop running again.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • clem57
    0 clem57 over 5 years ago in reply to shabaz

    Bingo shabaz. Because line 13 sets btnpushed = 0, it is global in scope. But inside cb1, line 17 does a comparison and not an assign on global btnpushed. I guess the value is never changed as a result.

     

    yes, when I set btnpushed to 1, the while btnpushed == 0 does not run.

     

    when set to 0 it runs, and when I get an event that sets it to 1 the while btnpushed = 0 still runs!

     

    Roger

    Kindly see https://www.guru99.com/python-operators-complete-tutorial.html where much of this is explained.

     

    Various comparison operators are ( ==, != , <>, >,<=, etc) image Notice all are 2 symbols not one.

     

    Various assignment operators used in Python are (+=, - = , *=, /= , etc.) image These are special compound assignments where the left side is operated(+-*/) on by the right creating a value to replace the left side.

     

    I hope this clears the air so to speak.

    If not, let me know...

     

    Clem

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • clem57
    0 clem57 over 5 years ago in reply to shabaz

    Please read my post before...

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • rcayot
    0 rcayot over 5 years ago in reply to genebren

    Thanks, I was wondering how I was going to do that!

    roger

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • yoyojacky
    0 yoyojacky over 5 years ago

    Try this:

    1. import RPi.GPIO as GPIO 
    2. from time import sleep 
    3. from signal import pause 
    4. GPIO.setmode(GPIO.BCM) 
    5. GPIO.setup(25, GPIO.OUT, initial=GPIO.LOW)  # red LED
    6. GPIO.setup(12, GPIO.OUT, initial=GPIO.LOW)  # yellow LED
    7. GPIO.setup(20, GPIO.OUT, initial=GPIO.LOW)  # green LED
    8. btnpushed = 0
    9. GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP) 

                           def  blinking():              

    1.        GPIO.output(20, GPIO.HIGH)  # green on
    2.         sleep(5)  #
    3.         GPIO.output(20, GPIO.LOW)  # green off
    4.         sleep(0.01) 
    5.         GPIO.output(12, GPIO.HIGH)  # yellow on
    6.         sleep(2) 
    7.         GPIO.output(12, GPIO.LOW)  # yellow off
    8.         GPIO.output(25, GPIO.HIGH)  # red on
    9.         sleep(5) 
    10.         GPIO.output(25, GPIO.LOW)  # red off

                         def  noblinking():              

    1.        GPIO.output(20, GPIO.LOW)  # green off
    1.        GPIO.output(12, GPIO.LOW)  # yellow off
    1.        GPIO.output(25, GPIO.LOW)  # red off

     

     

    1. try: 
    2.     while True: 

                                    if  btnpushed == 0:

                                        blinking()

                                        print(btnpushed)

                                    else:

                                        noblinking()

                                        print(btnpushed)  

    1. except KeyboardInterrupt: 
    2.     GPIO.cleanup((25, 26, 12, 20)) 
    3. GPIO.cleanup((25, 26, 12, 20)) 
    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
<
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube