{"id":442,"date":"2017-07-04T18:15:25","date_gmt":"2017-07-04T16:15:25","guid":{"rendered":"https:\/\/www.pingu-mobil.de\/iot\/?p=442"},"modified":"2021-05-14T10:07:48","modified_gmt":"2021-05-14T08:07:48","slug":"dingdong-6-blogeintrag-aktivierung-der-gpio-pins","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2017\/tuersteuerung\/dingdong-6-blogeintrag-aktivierung-der-gpio-pins\/","title":{"rendered":"DingDong 6. Blogeintrag: Aktivierung der GPIO Pins"},"content":{"rendered":"<p>Nachdem der MQTT -Client auf dem Raspberry PI funktionsbereit ist, sollen durch die Ansprache der GPIO-Pins Messages ausgel\u00f6st werden.<\/p>\n<p>F\u00fcr die Aktivierung der GPIO-Pins wurden von uns 2 Wege als praktikabel identifiziert:<\/p>\n<ul>\n<li>\u00dcber ein Python Script unter Verwendung des Packages python-rpi-gpio<\/li>\n<li>\u00dcber ein Script die Pins direkt ansprechen<br \/>\n<blockquote><p>cd \/sys\/class\/gpio<br \/>\necho 4 &gt; export<br \/>\necho out &gt; gpio4\/direction<br \/>\n#aktivieren:<br \/>\necho 1 &gt; gpio4\/value<br \/>\n#deaktivieren:<br \/>\necho 0 &gt; gpio4\/value<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p>Da wir bereits Python in Buildroot aktiviert hatten und dar\u00fcber in Verbindung mit dem Package python-rpi-gpio alle gew\u00fcnschten Funktionen (zb. ein Listener f\u00fcr die Aktivierung eines bestimmt GPIO-Pins) relativ einfach realisierbar sind, fiel die Entscheidung f\u00fcr eine Verwendung der Python Variante.<\/p>\n<p>Dabei wurde das gew\u00fcnschte Package in ein Python Script importiert und die Pins initialisiert.<\/p>\n<blockquote><p>import RPi.GPIO as GPIO<\/p>\n<p>#Modus setzen (BOARD\/BCM), regelt Ansprache (Nr.) der Pins<\/p>\n<p>GPIO.setmode(GPIO.BCM)<\/p>\n<p>#Speziellen Pin als Eingang oder Ausgang initialisieren<br \/>\nPIN_B = 23<br \/>\nGPIO.setup(PIN_B, GPIO.OUT)<br \/>\nPIN_A = 24<br \/>\nGPIO.setup(PIN_A, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)<\/p><\/blockquote>\n<p>Dabei aktiviert pull_up_down=GPIO.PUD_DOWN den internen Wiederstand des Pi f\u00fcr diesen Port (hier gpio24) (k\u00f6nnte auch extern gel\u00f6st werden).<\/p>\n<p>Mit der Initialisierung der Pins k\u00f6nnen diese anschlie\u00dfend verwendet werden. Folgend die Aktivierung des Pins gpio23 f\u00fcr 5 Sekunden:<\/p>\n<blockquote><p>GPIO.output(PIN_B, GPIO.HIGH)<br \/>\ntime.sleep(5)<br \/>\nGPIO.output(PIN_B, GPIO.LOW)<\/p><\/blockquote>\n<p>F\u00fcr den Input Pin gpio24 soll zudem eine st\u00e4ndige Pr\u00fcfung auf Aktivit\u00e4t erfolgen. Dieser Pin wird bei einem Klingeln an der T\u00fcr aktiviert. Zur Realisierung wurde ein Listener geschrieben und dem Pin zugeordnet.<\/p>\n<blockquote><p>#listener fuer pin initialisieren:<br \/>\nbounce_time = 10000<br \/>\nGPIO.add_event_detect(PIN_A, GPIO.FALLING, callback=inputLow, bouncetime=bounce_time)<\/p><\/blockquote>\n<p>Die bouncetime regelt dabei die Zeit, die zwischen einer erneuten Aktivierung des Pins liegt. callback gibt die Funktion an, die bei Aktivierung des Pins aufgerufen wird.<\/p>\n<p>Zus\u00e4tzlich zu den Pins wurde das Script um die MQTT Publish Funktionalit\u00e4t erweitert.<\/p>\n<blockquote><p>client.publish(&#8222;b8:27:eb:37:eb:80&#8220;, &#8222;isRinged&#8220;)<\/p><\/blockquote>\n<p>Damit sieht das aktuelle Script, mit vollem Funktionsumfang, momentan wie folgt aus:<\/p>\n<blockquote><p>#!\/usr\/bin\/python<br \/>\n# -*- coding: utf-8 -*-<\/p>\n<p>import RPi.GPIO as GPIO<br \/>\nimport paho.mqtt.client as mqtt<br \/>\nimport atexit<br \/>\nimport time<\/p>\n<p>def exit_handler():<br \/>\nclient.disconnect()<br \/>\nGPIO.cleanup()<br \/>\nexit()<\/p>\n<p>def on_disconnect(client, userdata, rc):<br \/>\nprint(&#8222;Disconnect with result code &#8220; + str(rc))<\/p>\n<p>&nbsp;<\/p>\n<p># Read MAC from file<br \/>\nmyMAC = open(&#8218;\/sys\/class\/net\/wlan0\/address&#8216;).read()<br \/>\nprint(myMAC)<br \/>\n# The callback for when the client receives a CONNACK response from the server.<br \/>\ndef on_connect(client, userdata, rc):<br \/>\nprint(&#8222;Connected with result code &#8220; + str(rc))<br \/>\n# Subscribing in on_connect() means that if we lose the connection and reconnect then subscriptions will be renewed.<br \/>\n#client.subscribe(str(myMAC)+&#8220;\/#&#8220;)<br \/>\nclient.subscribe(&#8222;b8:27:eb:37:eb:80\/#&#8220;)<\/p>\n<p># The callback for when a PUBLISH message is received from the server.<br \/>\ndef on_message(client, userdata, msg):<br \/>\nprint(&#8222;Topic: &#8222;, msg.topic + &#8222;\\nMessage: &#8220; + str(msg.payload))<br \/>\nprint(str(msg.payload))<br \/>\nif str(msg.payload)==&#8220;b&#8217;openDoor'&#8220;:<br \/>\nGPIO.output(PIN_B, GPIO.HIGH)<br \/>\nclient.publish(&#8222;b8:27:eb:37:eb:80&#8220;, &#8222;isOpen&#8220;)<br \/>\ntime.sleep(5)<br \/>\nGPIO.output(PIN_B, GPIO.LOW)<\/p>\n<p>def inputLow(channel):<br \/>\nif channel == PIN_A:<br \/>\nmsg_info = client.publish(&#8222;b8:27:eb:37:eb:80&#8220;, &#8222;isRinged&#8220;)<br \/>\nprint(&#8222;es klingelt&#8220;)<br \/>\n# if msg_info.is_published() == False:<br \/>\n# print(&#8222;Message is not yet published.&#8220;)<br \/>\n# This call will block until the message is published.<br \/>\n# msg_info.wait_for_publish()<\/p>\n<p>if __name__ == &#8222;__main__&#8220;:<br \/>\n#GPIO initialisieren:<br \/>\nGPIO.setmode(GPIO.BCM)<br \/>\nPIN_B = 23<br \/>\nGPIO.setup(PIN_B, GPIO.OUT)<br \/>\nPIN_A = 24<br \/>\nGPIO.setup(PIN_A, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)<br \/>\n#listener fuer pin initialisieren:<br \/>\nbounce_time = 10000<br \/>\nGPIO.add_event_detect(PIN_A, GPIO.FALLING, callback=inputLow, bouncetime=bounce_time)<\/p>\n<p>#client = paho.Client()<br \/>\nclient = mqtt.Client(clean_session=True)<br \/>\nclient.on_connect = on_connect<br \/>\nclient.on_message = on_message<br \/>\nclient.on_disconnect = on_disconnect<br \/>\n#client.on_publish = on_publish<\/p>\n<p>atexit.register(exit_handler)<\/p>\n<p>print(&#8222;Now trying to connect&#8230;&#8220;)<br \/>\nclient.username_pw_set(&#8222;iot&#8220;,&#8220;iot123&#8243;)<br \/>\nclient.connect(&#8222;62.75.166.253&#8220;, 1883)<br \/>\nprint(&#8222;conn&#8220;)<br \/>\n# Blocking call that processes network traffic, dispatches callbacks and handles reconnecting.<br \/>\n# Other loop*() functions are available that give a threaded interface and a manual interface.<br \/>\nclient.loop_forever()<\/p><\/blockquote>\n<p>Soviel zum aktuellen Stand des Projekts T\u00fcrsteuerung, weitere Updates folgen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nachdem der MQTT -Client auf dem Raspberry PI funktionsbereit ist, sollen durch die Ansprache der GPIO-Pins Messages ausgel\u00f6st werden. F\u00fcr die Aktivierung der GPIO-Pins wurden von uns 2 Wege als praktikabel identifiziert: \u00dcber ein Python Script unter Verwendung des Packages<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[7,8],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/442"}],"collection":[{"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/comments?post=442"}],"version-history":[{"count":1,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/442\/revisions"}],"predecessor-version":[{"id":561,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/posts\/442\/revisions\/561"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/media?parent=442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/categories?post=442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2017\/wp-json\/wp\/v2\/tags?post=442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}