{"id":15492,"date":"2025-11-03T17:00:29","date_gmt":"2025-11-03T16:00:29","guid":{"rendered":"https:\/\/www.picademie.nl\/?p=15492"},"modified":"2025-11-11T13:51:37","modified_gmt":"2025-11-11T12:51:37","slug":"gpio-schakelen-met-flipflop-toggle","status":"publish","type":"post","link":"https:\/\/www.picademie.nl\/index.php\/2025\/11\/03\/gpio-schakelen-met-flipflop-toggle\/","title":{"rendered":"GPIO schakelen met flipflop script (toggle)"},"content":{"rendered":"\n<pre class=\"wp-block-preformatted\">Met een drukknop een GPIO-poort HOOG en LAAG schakelen is geen probleem, maar sinds de softwarematige toggle-functie op de Pico beschikbaar kwam zocht ik naar een stabiele flipflop functie in Python voor de Raspberry Pi. Bijkomstigheid was dat ik daarmee de hotelschakeling opnieuw uitvond.<\/pre>\n\n\n\n<p>De meeste flipflop schakelingen werken wel, maar zijn erg onbetrouwbaar. Simpelweg doordat sommige scripts te weinig rekening houden met het zgn. bouncing-effect van mechanische schakelaars. Deze dender of contactstuiter is met name te wijten aan fysieke schakelaars en drukknoppen. Na enige tijd zoeken in de diverse forums heb ik een pythonscript gevonden dat tot nu toe het meest stabiel is. <\/p>\n\n\n\n<p>Ik heb op basis van de standaard flipflop schakeling twee varianten ontwikkeld waarmee de flipflop functie meerdere toepassingen kent. In deze tutorial stel ik er drie beschikbaar.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>E\u00e9n led in- en uitschakelen met \u00e9\u00e9n knop<\/li>\n\n\n\n<li>E\u00e9n led in- en uitschakelen met twee of meer knoppen (hotelschakeling) <\/li>\n\n\n\n<li>Twee leds in- en uitschakelen met twee knoppen <\/li>\n<\/ol>\n\n\n\n<p>Hieronder laat ik de scripts zien en hoe je de componenten aansluit.<\/p>\n\n\n\n<p><em>Daar gaan we&#8230;<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Ik ga ervan uit dat je inmiddels weet hoe je onderstaande script naar een editor in Raspberry Pi OS kopieert, opslaat en vervolgens opstart. Zo niet laat het me weten door hieronder een reactie te geven. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Voorbereiding script 1<\/strong><\/p>\n\n\n\n<p>Sluit de knop (button) aan op GPIO21. Aangezien het script de interne pull-up weerstand oproept gebruiken we geen fysieke pull-up weerstand. Wil je dit wel? Kijk dan <a href=\"https:\/\/www.picademie.nl\/index.php\/2021\/02\/16\/pull-up-pull-down\/\" target=\"_blank\" rel=\"noreferrer noopener\">hier<\/a> hoe je dit doet.<\/p>\n\n\n\n<p>De led sluit je met een serieweerstand aan op GPIO20. Omdat de GPIO een spanning van 3,3V heeft voldoet een weerstand tussen de 150 &#8211; 270\u03a9. Wil je meer weten over de led en zijn serieweerstand? Kijk dan <a href=\"https:\/\/www.picademie.nl\/index.php\/2022\/11\/08\/de-led\/\" target=\"_blank\" rel=\"noreferrer noopener\">hier<\/a>! <\/p>\n\n\n\n<p><strong>Script 1 &#8211; E\u00e9n led in- en uitschakelen met \u00e9\u00e9n knop<\/strong><\/p>\n\n\n\n<p>Onderstaand script heeft \u00e9\u00e9n knop als input en \u00e9\u00e9n led als output. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import time\nimport RPi.GPIO as GPIO\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setwarnings(False)\n\nprint (\"\\nSTOP het programma met Ctrl-c\\n\")\n\nbutton = 21 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Pin 40<\/mark>\nled    = 20 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Pin 39<\/mark>\n\nGPIO.setup(led,GPIO.OUT)\nGPIO.output(led,GPIO.LOW) <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># start met een uitgang LAAG<\/mark>\nGPIO.setup(button, GPIO.IN, pull_up_down=GPIO.PUD_UP)  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Interne weerstand<\/mark>\n\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">def toggleLEDcallback(channel):<\/mark>\n    if (GPIO.input(led) == True):\n        GPIO.output(led, False)\n    else:\n        GPIO.output(led, True)\n\nGPIO.add_event_detect(button, GPIO.RISING, callback=toggleLEDcallback, bouncetime=100)\n\nwhile True:\n    time.sleep(1)\n\nGPIO.cleanup()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Voorbereiding script 2<\/strong><\/p>\n\n\n\n<p>Sluit de knoppen (buttons) aan op GPIO12 en GPIO21. Aangezien het script de interne pull-up weerstand oproept gebruiken we geen fysieke pull-up weerstand. Wil je dit wel? Kijk dan <a href=\"https:\/\/www.picademie.nl\/index.php\/2021\/02\/16\/pull-up-pull-down\/\" target=\"_blank\" rel=\"noreferrer noopener\">hier<\/a> hoe je dit doet.<\/p>\n\n\n\n<p>De led sluit je met een serieweerstand aan op GPIO20. Omdat de GPIO een spanning van 3,3V heeft voldoet een weerstand tussen de 150 &#8211; 270\u03a9. Wil je meer weten over de led en zijn serieweerstand? Kijk dan <a href=\"https:\/\/www.picademie.nl\/index.php\/2022\/11\/08\/de-led\/\" target=\"_blank\" rel=\"noreferrer noopener\">hier<\/a>! <\/p>\n\n\n\n<p><strong>Script 2 &#8211; E\u00e9n led in- en uitschakelen met twee of meer knoppen (hotelschakeling) <\/strong><\/p>\n\n\n\n<p>Voor degene die het niet weet; met behulp van een hotelschakeling schakel je met minimaal twee knoppen \u00e9\u00e9n led. Je vindt dit soort schakelingen vaak in trappenhuizen en gangen van hotels en flats. <\/p>\n\n\n\n<p>Onderstaand script heeft twee knoppen als input en \u00e9\u00e9n led als output. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import time\nimport RPi.GPIO as GPIO\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setwarnings(False)\n\nprint (\"\\nSTOP het programma met Ctrl-c\\n\")\n\nbutton1 = 12 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Pin 32<\/mark>\nbutton2 = 21 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Pin 40<\/mark>\nled1    = 20 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Pin 39<\/mark>\n\nGPIO.setup(led1,GPIO.OUT)\nGPIO.output(led1,GPIO.LOW) <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># start met een uitgang LAAG<\/mark>\n\nGPIO.setup(button1, GPIO.IN, pull_up_down=GPIO.PUD_UP)  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Interne pull-up weerstand<\/mark>\nGPIO.setup(button2, GPIO.IN, pull_up_down=GPIO.PUD_UP)  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Interne pull-up weerstand<\/mark>\n\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">def toggleLEDcallback(channel):<\/mark>\n    if (GPIO.input(led1) == True):\n        GPIO.output(led1, False)\n    else:\n        GPIO.output(led1, True)\n\nGPIO.add_event_detect(button1, GPIO.RISING, callback=toggleLEDcallback, bouncetime=100)\nGPIO.add_event_detect(button2, GPIO.RISING, callback=toggleLEDcallback, bouncetime=100)\n\nwhile True:\n    time.sleep(1)\n\nGPIO.cleanup()\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Voorbereiding script 3<\/strong><\/p>\n\n\n\n<p>Sluit de knoppen (buttons) aan op GPIO12 en GPIO21. Aangezien het script de interne pull-up weerstand oproept gebruiken we geen fysieke pull-up weerstand. Wil je dit wel? Kijk dan <a href=\"https:\/\/www.picademie.nl\/index.php\/2021\/02\/16\/pull-up-pull-down\/\" target=\"_blank\" rel=\"noreferrer noopener\">hier<\/a> hoe je dit doet.<\/p>\n\n\n\n<p>De leds sluit je met een serieweerstand aan op GPIO18 en GPIO20. Omdat de GPIO een spanning van 3,3V heeft voldoet een weerstand tussen de 150 &#8211; 270\u03a9. Wil je meer weten over de led en zijn serieweerstand? Kijk dan <a href=\"https:\/\/www.picademie.nl\/index.php\/2022\/11\/08\/de-led\/\" target=\"_blank\" rel=\"noreferrer noopener\">hier<\/a>!<\/p>\n\n\n\n<p><strong>Script 3 &#8211; Twee leds in- en uitschakelen met twee knoppen <\/strong><\/p>\n\n\n\n<p>Op zich geen spannend script als je de bovenste twee bestudeerd hebt. Ik wil hiermee laten zien hoe simpel de onderdelen in het script op te nemen zijn.<\/p>\n\n\n\n<p>Naast de vertrouwde microswitch heb ik een zgn. aanraak schakelaar gebruikt. De schakelaar heeft geen last van &#8216;dender&#8217;, maar kan soms al schakelen als je je vinger er boven houdt. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import time\nimport RPi.GPIO as GPIO\n\nGPIO.setmode(GPIO.BCM)\nGPIO.setwarnings(False)\n\nprint (\"\\nSTOP het programma met Ctrl-c\\n\")\n\nbutton1 = 12 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Pin 32<\/mark>\nbutton2 = 21 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Pin 40<\/mark>\nled1    = 18 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Pin 39<\/mark>\nled2    = 20 <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Pin 39<\/mark>\n\nGPIO.setup(led1,GPIO.OUT)\nGPIO.output(led1,GPIO.LOW) <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># start met een uitgang LAAG (= uit)<\/mark>\nGPIO.setup(led2,GPIO.OUT)\nGPIO.output(led2,GPIO.LOW) <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># start met een uitgang LAAG (= uit)<\/mark>\n\nGPIO.setup(button1, GPIO.IN, pull_up_down=GPIO.PUD_UP)  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Interne pull-up weerstand<\/mark>\nGPIO.setup(button2, GPIO.IN, pull_up_down=GPIO.PUD_UP)  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"># Interne pull-up weerstand<\/mark>\n\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">def toggleLEDcallback1(channel):<\/mark>\n    if (GPIO.input(led1) == True):\n        GPIO.output(led1, False)\n    else:\n        GPIO.output(led1, True)\n\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">def toggleLEDcallback2(channel):<\/mark>\n    if (GPIO.input(led2) == True):\n        GPIO.output(led2, False)\n    else:\n        GPIO.output(led2, True)\n\nGPIO.add_event_detect(button1, GPIO.RISING, callback=toggleLEDcallback1, bouncetime=100)\nGPIO.add_event_detect(button2, GPIO.RISING, callback=toggleLEDcallback2, bouncetime=100)\n\nwhile True:\n    time.sleep(1)\n\nGPIO.cleanup()<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Conclusie<\/strong><\/p>\n\n\n\n<p>Als je de scripts test merk je dat het basisscript erg stabiel is en geen dendereffect kent. Althans, ik heb het nog nooit bij dit script gezien. <\/p>\n\n\n\n<p>In mijn labopstelling maak ik gebruik van een microswitch, geen knop met de constructie van een ouderwetse vonkende deurbel. Daarnaast maak ik gebruik van een zgn. aanraakschakelaar. Deze is contactloos en levert een stabiele GPIO input.<\/p>\n\n\n\n<p>Door in het script met de bouncetime te experimenteren zal je zien dat dit effect heeft op het denderen.<\/p>\n\n\n\n<p>Hoe mooi zou het zijn als de Pi, net als de Pico in microPython, een toggle-functie voor Python zou hebben. We zullen het voorlopig nog met de standaard routines moeten doen. Wellicht komt dit in de nabije toekomst beschikbaar.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Raspberry Pi - Schakelen met FlipFlop (toggle) script\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/kaejFzRsI90?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\"><sup>De flipflop functie met een aanraakschakelaar en microswitch in verschillende schakelmogelijkheden<\/sup><\/figcaption><\/figure>\n\n\n\n<p>Veel plezier ermee! Mocht je vragen of opmerkingen hebben, laat dan hieronder een reactie achter.<\/p>\n\n\n\n<p><em>Have A Nice Day!<\/em><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Met een drukknop een GPIO-poort HOOG en LAAG schakelen is geen probleem, maar sinds de softwarematige toggle-functie op de Pico beschikbaar kwam zocht ik naar <a class=\"mh-excerpt-more\" href=\"https:\/\/www.picademie.nl\/index.php\/2025\/11\/03\/gpio-schakelen-met-flipflop-toggle\/\" title=\"GPIO schakelen met flipflop script (toggle)\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":15533,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[728,722,724],"tags":[],"class_list":["post-15492","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handy-stuff","category-led-relais","category-tkinter"],"jetpack_featured_media_url":"https:\/\/www.picademie.nl\/wp-content\/uploads\/2025\/11\/Flipflop3.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/posts\/15492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/comments?post=15492"}],"version-history":[{"count":0,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/posts\/15492\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/media\/15533"}],"wp:attachment":[{"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/media?parent=15492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/categories?post=15492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.picademie.nl\/index.php\/wp-json\/wp\/v2\/tags?post=15492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}