Nachdem der MQTT -Client auf dem Raspberry PI funktionsbereit ist, sollen durch die Ansprache der GPIO-Pins Messages ausgelöst werden.

Für die Aktivierung der GPIO-Pins wurden von uns 2 Wege als praktikabel identifiziert:

  • Über ein Python Script unter Verwendung des Packages python-rpi-gpio
  • Über ein Script die Pins direkt ansprechen

    cd /sys/class/gpio
    echo 4 > export
    echo out > gpio4/direction
    #aktivieren:
    echo 1 > gpio4/value
    #deaktivieren:
    echo 0 > gpio4/value

Da wir bereits Python in Buildroot aktiviert hatten und darüber in Verbindung mit dem Package python-rpi-gpio alle gewünschten Funktionen (zb. ein Listener für die Aktivierung eines bestimmt GPIO-Pins) relativ einfach realisierbar sind, fiel die Entscheidung für eine Verwendung der Python Variante.

Dabei wurde das gewünschte Package in ein Python Script importiert und die Pins initialisiert.

import RPi.GPIO as GPIO

#Modus setzen (BOARD/BCM), regelt Ansprache (Nr.) der Pins

GPIO.setmode(GPIO.BCM)

#Speziellen Pin als Eingang oder Ausgang initialisieren
PIN_B = 23
GPIO.setup(PIN_B, GPIO.OUT)
PIN_A = 24
GPIO.setup(PIN_A, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

Dabei aktiviert pull_up_down=GPIO.PUD_DOWN den internen Wiederstand des Pi für diesen Port (hier gpio24) (könnte auch extern gelöst werden).

Mit der Initialisierung der Pins können diese anschließend verwendet werden. Folgend die Aktivierung des Pins gpio23 für 5 Sekunden:

GPIO.output(PIN_B, GPIO.HIGH)
time.sleep(5)
GPIO.output(PIN_B, GPIO.LOW)

Für den Input Pin gpio24 soll zudem eine ständige Prüfung auf Aktivität erfolgen. Dieser Pin wird bei einem Klingeln an der Tür aktiviert. Zur Realisierung wurde ein Listener geschrieben und dem Pin zugeordnet.

#listener fuer pin initialisieren:
bounce_time = 10000
GPIO.add_event_detect(PIN_A, GPIO.FALLING, callback=inputLow, bouncetime=bounce_time)

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.

Zusätzlich zu den Pins wurde das Script um die MQTT Publish Funktionalität erweitert.

client.publish(„b8:27:eb:37:eb:80“, „isRinged“)

Damit sieht das aktuelle Script, mit vollem Funktionsumfang, momentan wie folgt aus:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import paho.mqtt.client as mqtt
import atexit
import time

def exit_handler():
client.disconnect()
GPIO.cleanup()
exit()

def on_disconnect(client, userdata, rc):
print(„Disconnect with result code “ + str(rc))

 

# Read MAC from file
myMAC = open(‚/sys/class/net/wlan0/address‘).read()
print(myMAC)
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, rc):
print(„Connected with result code “ + str(rc))
# Subscribing in on_connect() means that if we lose the connection and reconnect then subscriptions will be renewed.
#client.subscribe(str(myMAC)+“/#“)
client.subscribe(„b8:27:eb:37:eb:80/#“)

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print(„Topic: „, msg.topic + „\nMessage: “ + str(msg.payload))
print(str(msg.payload))
if str(msg.payload)==“b’openDoor'“:
GPIO.output(PIN_B, GPIO.HIGH)
client.publish(„b8:27:eb:37:eb:80“, „isOpen“)
time.sleep(5)
GPIO.output(PIN_B, GPIO.LOW)

def inputLow(channel):
if channel == PIN_A:
msg_info = client.publish(„b8:27:eb:37:eb:80“, „isRinged“)
print(„es klingelt“)
# if msg_info.is_published() == False:
# print(„Message is not yet published.“)
# This call will block until the message is published.
# msg_info.wait_for_publish()

if __name__ == „__main__“:
#GPIO initialisieren:
GPIO.setmode(GPIO.BCM)
PIN_B = 23
GPIO.setup(PIN_B, GPIO.OUT)
PIN_A = 24
GPIO.setup(PIN_A, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#listener fuer pin initialisieren:
bounce_time = 10000
GPIO.add_event_detect(PIN_A, GPIO.FALLING, callback=inputLow, bouncetime=bounce_time)

#client = paho.Client()
client = mqtt.Client(clean_session=True)
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
#client.on_publish = on_publish

atexit.register(exit_handler)

print(„Now trying to connect…“)
client.username_pw_set(„iot“,“iot123″)
client.connect(„62.75.166.253“, 1883)
print(„conn“)
# Blocking call that processes network traffic, dispatches callbacks and handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a manual interface.
client.loop_forever()

Soviel zum aktuellen Stand des Projekts Türsteuerung, weitere Updates folgen.

DingDong 6. Blogeintrag: Aktivierung der GPIO Pins
Markiert in:     

Ein Kommentar zu „DingDong 6. Blogeintrag: Aktivierung der GPIO Pins

  • 4. Juli 2017 um 18:43 Uhr
    Permalink

    Simple enough. Habe ich schon gesagt, dass ich ein großer Python-Fan bin? 😛

Kommentare sind geschlossen.