{"id":137,"date":"2019-03-19T18:31:11","date_gmt":"2019-03-19T17:31:11","guid":{"rendered":"https:\/\/azure.teamprojects.de\/?page_id=137"},"modified":"2019-03-21T10:16:16","modified_gmt":"2019-03-21T09:16:16","slug":"raspberry-pi-tutorial-2","status":"publish","type":"page","link":"https:\/\/azure.teamprojects.de\/?page_id=137","title":{"rendered":"Raspberry Pi Tutorial 2"},"content":{"rendered":"\n<p>Temperatursensor und D2C Nachrichten Senden<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_17 counter-hierarchy counter-decimal ez-toc-grey\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" style=\"display: none;\"><i class=\"ez-toc-glyphicon ez-toc-icon-toggle\"><\/i><\/a><\/span><\/div>\n<nav><ul class=\"ez-toc-list ez-toc-list-level-1\"><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Einleitung\" title=\"Einleitung\">Einleitung<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Voraussetzungen\" title=\"Voraussetzungen:\">Voraussetzungen:<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Ziel\" title=\"Ziel:\">Ziel:<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Vorbereitung\" title=\"Vorbereitung:\">Vorbereitung:<\/a><ul class=\"ez-toc-list-level-3\"><li class=\"ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Raspberry_Pi_vorbereiten_Um_den_Temperatursensor_nutzen_zu_koennen\" title=\"Raspberry Pi vorbereiten (Um den Temperatursensor nutzen zu k\u00f6nnen)  \">Raspberry Pi vorbereiten (Um den Temperatursensor nutzen zu k\u00f6nnen)  <\/a><\/li><\/ul><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Den_Temperatursensor_in_den_Bisherigen_Code_einbinden\" title=\"Den Temperatursensor in den Bisherigen Code einbinden:\">Den Temperatursensor in den Bisherigen Code einbinden:<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Nachrichten_vom_Pi_senden\" title=\"Nachrichten vom Pi senden\">Nachrichten vom Pi senden<\/a><ul class=\"ez-toc-list-level-3\"><li class=\"ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Einfache_Nachrichten\" title=\"Einfache Nachrichten: \">Einfache Nachrichten: <\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Key_Value_Pair_als_Nachricht_verschicken\" title=\"Key Value Pair als Nachricht verschicken \">Key Value Pair als Nachricht verschicken <\/a><\/li><\/ul><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/azure.teamprojects.de\/?page_id=137\/#Weitere_Tutorials\" title=\"Weitere Tutorials\">Weitere Tutorials<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Einleitung\"><\/span>Einleitung<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>In diesem Tutorial geht es darum, einen Raspberry Pi 3 mit dem Clouddienst Microsoft Azure zu verbinden. Im ersten Teil des Tutorials haben wir einen Client auf dem Raspberry Pi programmiert, diesen mit einem Azure IoT Hub verbunden  und Cloud-To-Device Nachrichten empfangen. Jetzt erweitern wir das ganze um einen Temperatursensor, dessen Daten wir dann an Azure senden.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"1024\" src=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-1-1024x1024.png\" alt=\"\" class=\"wp-image-142\" srcset=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-1-1024x1024.png 1024w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-1-150x150.png 150w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-1-300x300.png 300w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-1-768x768.png 768w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Pi-1.png 1200w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption>Verwendete Hardware: Raspberry Pi <\/figcaption><\/figure>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Voraussetzungen\"><\/span>Voraussetzungen:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Dieses Tutorial geht davon aus, das Erfahrung mit Programmierung vorhanden sind, setzt aber keine Erfahrungen mit Raspbian, GPIO Mikroprozessoren (Pi, Arduino etc.) oder Python voraus. Da das Tutorial auf dem Code des ersten Teils aufbaut empfiehlt es sich diesen zuerst durch zuarbeiten, oder den fertigen Code herunterzuladen.<\/p>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Ziel\"><\/span>Ziel:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Ziel ist es\ndevice-to-cloud Nachrichten an Microsoft Azure IoT Hub zu versenden,\ndie Daten vom Raspberry Pi in die Cloud senden. Um dem ganzen\nFunktion zu geben schlie\u00dfen wir au\u00dferdem einen Temperatursensor an.<\/p>\n\n\n\n<p><strong>Beispiel Nutzungen:<\/strong><\/p>\n\n\n\n<p>&#8211;\nAu\u00dfen Temperatursensor<\/p>\n\n\n\n<p>&#8211;\nBewegungsmelder f\u00fcr eine Hundeklappe<\/p>\n\n\n\n<p>&#8211;\nVerkehrsz\u00e4hler an einer stark befahrenen Stra\u00dfe<\/p>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Vorbereitung\"><\/span>Vorbereitung:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3><span class=\"ez-toc-section\" id=\"Raspberry_Pi_vorbereiten_Um_den_Temperatursensor_nutzen_zu_koennen\"><\/span>Raspberry Pi vorbereiten (Um den Temperatursensor nutzen zu k\u00f6nnen)  <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Der\nin diesem Tutorial verwendete Temperatursensor DS18B20 verwendet das\n1-Wire Bus Interface, bevor wir dieses an unserem Raspberry Pi nutzen\nk\u00f6nnen, m\u00fcssen wir dieses daf\u00fcr vorbereiten. Daf\u00fcr nutzen wir\nfolgenden Konsolenbefehl um die Konfiguration des Raspberries zu\nver\u00e4ndern<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/boot\/config.txt  <\/code><\/pre>\n\n\n\n<p>Dies\n\u00f6ffnet die Datei im nano Editor und erlaubt uns diese zu ver\u00e4ndern.\nWir suchen nun innerhalb dieser Datei nach der Zeile, die\n<code>dtoverlay=w1-gpio<\/code> enth\u00e4lt, existiert sie nicht f\u00fcgen\nwir sie ganz am Ende der Datei hinzu und speichern das ganze. Damit\ndie \u00c4nderungen in Kraft treten m\u00fcssen wir den Pi neu starten. \n<\/p>\n\n\n\n<p>Wir\nbauen jetzt noch einen Schaltkreis mit dem Temperatursensor auf,\ndaf\u00fcr nutzen wir neben diesem einen GND Pol, einen 3.3V Pol  des\nPis, sowie den GPIO Pin 4. zwischen dem Kontakt mit dem 3.3V pol und\ndem Mittleren F\u00fc\u00dfchen des Sensors wird ein 4.7 Kohm Widerstand\neingesetzt. An dem Ende, das nicht mit den 3.3V verbunden ist legen\nwir das Kable an, das zum GPIO Pin 4 f\u00fchrt. \n<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" width=\"403\" height=\"600\" src=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Schaltung.png\" alt=\"\" class=\"wp-image-143\" srcset=\"https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Schaltung.png 403w, https:\/\/azure.teamprojects.de\/wp-content\/uploads\/2019\/03\/Schaltung-202x300.png 202w\" sizes=\"(max-width: 403px) 100vw, 403px\" \/><figcaption>Schaltplan Temperatursenso<\/figcaption><\/figure>\n\n\n\n<p>Nachdem\nwir diesen Schaltkreis aufgebaut haben k\u00f6nnen wir mittels einiger\nBefehle testen, ob unsere Einstellungen korrekt sind.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo modprobe w1-gpio\n\ufeffsudo modprobe w1-therm\ncd \/sys\/bus\/w1\/devices\nls<\/code><\/pre>\n\n\n\n<p>Dies\nwird alle Ger\u00e4te, die \u00fcber den 1-Wire Bus angeschlossen sind\nanzeigen. Der Temperatursensor wird eine ID haben, die mit einer 28\nanf\u00e4ngt, der viele Nummern folgen. Nun k\u00f6nnen wir testen ob der\nSensor arbeitet, indem wir das Folgende eintippen, dabei wird XXXX\ndurch die Zahlen, die der 28 folgen ersetzt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd 28-xxxx\ncat w1_slave<\/code><\/pre>\n\n\n\n<p>Nun\nsollte man das folgende erhalten. Geschieht das, arbeitet der Sensor<\/p>\n\n\n\n<p>a3 01 4b 46 7f ff 0e 10\nd8 : crc=d8 YES<br>a3 01 4b 46 7f ff 0e 10 d8 t=32768 \n<\/p>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Den_Temperatursensor_in_den_Bisherigen_Code_einbinden\"><\/span>Den Temperatursensor in den Bisherigen Code einbinden:<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\nWir \u00f6ffnen nun wieder unseren Code vom ersten Tutorial\nund erg\u00e4nzen diesen um einige imports, da diese f\u00fcr die Verwendung\ndes Temperatursensors von N\u00f6ten sind.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> # Import Libraries\n import os\n import glob\n import time\ufeff<\/code><\/pre>\n\n\n\n<p>\nNun m\u00fcssen wir noch die folgenden Funktionen in unseren\nCode einf\u00fcgen, damit wir die Temperatur auslesen k\u00f6nnen<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Initialize the GPIO Pins \nos.system('modprobe w1-gpio')  # Turns on the GPIO module \nos.system('modprobe w1-therm') # Turns on the Temperature module   \n\n# Finds the correct device file that holds the temperature data \nbase_dir = '\/sys\/bus\/w1\/devices\/' \ndevice_folder = glob.glob(base_dir + '28*')[0] \ndevice_file = device_folder + '\/w1_slave'   \n\n# A function that reads the sensors data \ndef read_temp_raw():   \n  f = open(device_file, 'r') # Opens the temperature device file   \n  lines = f.readlines() # Returns the text   \n  f.close()          \n  return lines   \n\n# Convert the value of the sensor into a temperature \ndef read_temp():   \n  lines = read_temp_raw() # Read the temperature 'device file'    \n \n  # While the first line does not contain 'YES', wait for 0.2s   \n  # and then read the device file again.   \n  while lines[0].strip()[-3:] != 'YES':     \n    time.sleep(0.2)     \n    lines = read_temp_raw()     \n  # Look for the position of the '=' in the second line of the   \n  # device file.   \n  equals_pos = lines[1].find('t=')     \n\n  # If the '=' is found, convert the rest of the line after the   \n  # '=' into degrees Celsius, then degrees Fahrenheit   \n  if equals_pos != -1:     \n    temp_string = lines[1][equals_pos+2:]     \n    temp_c = float(temp_string) \/ 1000.0     \n    #temp_f = temp_c * 9.0 \/ 5.0 + 32.0     \n    return temp_c #, temp_f<\/code><\/pre>\n\n\n\n<p>\nSobald diese Funktionen Teil des Codes sind ist es uns\nm\u00f6glich die Temperatur auszulesen. Man kann dies nun einfach testen,\nindem man in der While-Schleife, die die bisher nur ein Delay enth\u00e4lt\nfolgendes einf\u00fcgt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>s = str(read_temp()) \nprint(s) <\/code><\/pre>\n\n\n\n<p>\nJetzt wird nach jeder Wartezeit die aktuelle Temperatur\nausgegeben. Dabei sollte man die Wartezeit auf 15 Sekunden erh\u00f6hen.<\/p>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Nachrichten_vom_Pi_senden\"><\/span>Nachrichten vom Pi senden<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3><span class=\"ez-toc-section\" id=\"Einfache_Nachrichten\"><\/span>Einfache Nachrichten: <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\nUm nun die Temperatur auch in die Cloud zu bekommen m\u00fcssen wir\nunserem Client ein paar neue Methoden zur Verf\u00fcgung stellen, dazu\ngeh\u00f6rt eine sendText(str) und eine sendKeyValuePair(key, value)\nmethode. Zuerst wollen wir die einfachere sendText Methode erstellen.\nDiese wandelt den \u00fcbergebenen String in eine IoTHubMessage und\nschickt diese dann mittels CLIENT.send_event_async an den Server. Da\nwir in dieser send methode eine Callback Methode angeben m\u00fcssen\nerstellen wir auch diese<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#Gibt aus, ob die nachricht erfolgreich gesendet wurde \ndef send_confirm_callback(message, result, context):   \n  print(\"Nachricht ID %s Status %s\" %(message.message_id, result)) \n\n# Funktion um einen String an den verbundenen IoT Hub zu schicken \ndef sendText(str):   \n  global CLIENT, send_confirm_callback   \n  #aus der Bibliothek passende funktio\u00e4hlen, um ein objekt vom richtigen\n  typen zu   \n  msg = IoTHubMessage(str)   \n  # es gibt weitere optionale parameter, diese k\u00f6nnten mit dem folgenden \n  code gesetzt werden   \n  # msg.message_id = \"id\"   \n  # msg.correlation_id = \"cid\"      \n  print(\"schicke die Nachricht [%s]...\" % (str))     \n  CLIENT.send_event_async(msg, send_confirm_callback, 0)<\/code><\/pre>\n\n\n\n<h3><span class=\"ez-toc-section\" id=\"Key_Value_Pair_als_Nachricht_verschicken\"><\/span>Key Value Pair als Nachricht verschicken <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Au\u00dfer\neinfachen Nachrichten k\u00f6nnen wir diesen auch noch ein Key, Value\nPaar anh\u00e4ngen um das Handlen der Nachrichten im Hub sp\u00e4ter\neinfacher zu haben. Auch in dieser wird zuerst eine IoTHubMessage\nerzeugt, dieser werden dann Attribute hinzugef\u00fcgt bevor sie\nverschickt wird.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Methode um Key, Valu paare an den IoT Hub zu schicken \ndef sendKeyValuePair(key, value):   \n  global CLIENT, send_confirm_callback, MSGID   \n  msg_txt = (\"%s, %s\" %(key, value))   \n  msg = IoTHubMessage(msg_txt)   \n  msg.message_id = str(MSGID)      \n  propmap = msg.properties()   propmap.add(key,value)     \n  CLIENT.send_event_async(msg, send_confirm_callback,0)<\/code><\/pre>\n\n\n\n<p> Um nun die Temperatur als Key Value Paar an den Server zu schicken erzeugen wir uns noch eine weitere Funktion, die den Aufruf der Sendefunktion und das umwandeln der Temperatur in einen String \u00fcbernimmt. Au\u00dferdem k\u00fcmmert sie sich darum, dass aufsteigende Nachrichten IDs vergeben werden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def sendTemp():     \n  global MSGID      \n  s = str(read_temp())     \n  sendKeyValuePair(\"Temperatur\",s)     \n  MSGID += 1<\/code><\/pre>\n\n\n\n<p>\nJetzt muss nur noch die Schleife nach angepasst\nwerden und wir senden regelm\u00e4\u00dfig die Aktuelle Temperatur an die\nCloud. Mittels dem was wir im letzten Tutorial gelernt haben k\u00f6nnen\nwir das senden sogar ferngesteuert machen. Daf\u00fcr \u00e4ndern wir nur die\ngotMail Methode wie folgt und schreiben dies hier in die\nWhile-Schleife<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>while True:   \n  if SENDING:     \n    sendTemp()     \n    time.sleep(15)   \n  else:     \n    time.sleep(1)  <\/code><\/pre>\n\n\n\n<p>In der Funktion gotMail m\u00fcssen wir folgendes erg\u00e4nzen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  global SENDING         \n  if msg == \"temperature\" or msg == \"temp\":         \n    print(read_temp())         \n    s = str(read_temp())         \n    sendText(s)     \n  elif msg == \"start\" or msg == \"start sending\":       \n    SENDING = True     \n  elif msg == \"stop\" or msg == \"stop sending\":       \n    SENDING = False   <\/code><\/pre>\n\n\n\n<h2><span class=\"ez-toc-section\" id=\"Weitere_Tutorials\"><\/span>Weitere Tutorials<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><a href=\"https:\/\/azure.teamprojects.de\/?page_id=26\">Schnellstart Tutorial<\/a><br><a href=\"https:\/\/azure.teamprojects.de\/?page_id=119\">Tutorial 1: C2D Nachrichten empfangen<\/a><br><a href=\"https:\/\/azure.teamprojects.de\/?page_id=181\">Tutorial 3: Daten per Mail versenden<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Temperatursensor und D2C Nachrichten Senden Table of Contents EinleitungVoraussetzungen:Ziel:Vorbereitung:Raspberry Pi vorbereiten (Um den Temperatursensor nutzen zu k\u00f6nnen) Den Temperatursensor in den Bisherigen Code einbinden:Nachrichten vom Pi sendenEinfache Nachrichten: Key Value Pair als Nachricht verschicken Weitere Tutorials Einleitung In diesem Tutorial geht es darum, einen Raspberry Pi 3 mit dem Clouddienst Microsoft Azure zu verbinden. Im &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/azure.teamprojects.de\/?page_id=137\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eRaspberry Pi Tutorial 2\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":100,"featured_media":0,"parent":581,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages\/137"}],"collection":[{"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/users\/100"}],"replies":[{"embeddable":true,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=137"}],"version-history":[{"count":10,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages\/137\/revisions"}],"predecessor-version":[{"id":584,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages\/137\/revisions\/584"}],"up":[{"embeddable":true,"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=\/wp\/v2\/pages\/581"}],"wp:attachment":[{"href":"https:\/\/azure.teamprojects.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}