2. Praktische Übung: Messwerterfassung und Speicherung in MySQL-DB Messwerterfassung mit dem Raspberry Pi und Speicherung in einer mySQL-Datenbank. 2.1. Inbetriebnahme des Raspberry Pi USB 2x 3.3V GPIO2 (SDA1, I2C) GPIO3 (SCL1, I2C) GPIO4 (GPIO_GCLK) GND GPIO17 (GPIO_GEN0) GPIO27 (GPIO_GEN2) GPIO22 (GPIO_GEN3) 3.3V GPIO10 (SPI_MOSI) GPIO9 (SPI_MISO) GPIO11 (SPI_CLK) GND ID_SD (I2C ID EEPROM) GPIO5 GPIO6 GPIO13 GPIO19 GPIO26 GND Power CSI (CAMERA) HDMI Audio USB 2x ETHERNET Sensorboard mit PCF 8591 DSI (DISPLAY) VCC GND SCL SDA 5V 5V GND GPIO14 (TXD0) GPIO15 (RXD0) GPIO18 (GPIO_GEN1) GND GPIO23 (GPIO_GEN4) GPIO24 (GPIO_GEN5) GND GPIO25 (GPIO_GEN6) GPIO8 (SPI_CE0_N) GPIO7 (SPI_CE1_N) ID_SC (I2C ID EEPROM) GND GPIO12 GND GPIO16 GPIO20 GPIO21 Sie erhalten vom Dozenten ein Set bestehend aus einem Raspberry Pi 2 B, einem Netzteil, einem Gehäuse, einer Mikro SD Speicherkarte und einem Sensorboard inkl. Verbindungskabeln. Verbinden Sie den Raspberry Pi mit dem Sensorboad wie in Abbildung 2.1 dargestellt. Beachten Sie, dass bei einem Verkabelungsfehler Board und/oder Raspberry Pi schaden nehmen können. Abbildung 2.1.: Raspberry Pi und Sensorboard mit PCF 8591 Nitsche, Kremer 1 Informationssysteme 2. Praktische Übung: Messwerterfassung und Speicherung in MySQL-DB Legen Sie die Speicherkarte ein und schlieÿen Netzteil und LAN-Kabel an. Sobald eine Spannungsversorgung anliegt startet der Bootvorgang und wird etwa eine halbe Minute dauern. Auf der Speicherkarte ist ein aktuelles (März 2015) RasbianBetriebssystem installiert. Ebenso sind bereits einige Softwarepakete, wie beispielsweise ein Webserver (Apache) und ein Datenbankserver (MySQL), eingerichtet. 2.2. Test der Softwarekonguration Versuchen Sie sich über eine Secure Shell (SSH) mit dem System zu verbinden. In Ubuntu önen Sie dazu ein neues Terminal (STRG-ALT-T ) und geben den folgenden Befehl ein: user@ubuntu-ikt ~ $ ssh [email protected] Die IP-Adresse können Sie dem Aufdruck auf Ihrem Raspberry Pi entnehmen. Das System mit dem Namen rpi201 hat die IP-Adresse 192.168.15.201. Das Benutzerkonto lautet wie in Ubuntu user mit dem Passwort ebenfalls user. Nachdem Sie sich Zugang zu Ihrem System verschat haben, testen Sie den DatenbankLogin. user@rpi201 ~ $ mysql mydb -u dbuser -p Ein MySQL-Datenbanksystem kann mehrere Datenbanken parallel verwalten. Die Datenbank mydb wurde bereits vorab für Sie eingerichtet. Die Option -u speziziert den Benutzernamen (dbuser ) und -p gibt an, dass ein Passwort (dbuser ) vorhanden ist. Einen erfolgreichen Login erkennen Sie daran, dass sich der Prompt zu mysql> ändert. Loggen Sie sich wieder aus. mysql> exit Testen Sie nun die Funktionsfähigkeit des Webservers, indem Sie vom Entwicklungsrechner (Ubuntu-IKT ) die Webseite http://192.168.15.xxx:80 aufrufen. Als Browser können Sie Firefox nutzen. Es sollte folgende Webseite erscheinen: Nitsche, Kremer 2 Informationssysteme 2. Praktische Übung: Messwerterfassung und Speicherung in MySQL-DB Abbildung 2.2.: Test des Webservers 2.3. Test der Sensorplatine Die bereits angeschlossene Sensorplatine verfügt über ein PCF8591 A/D- bzw. D/AWandler, den Sie bereits aus dem IKT-Praktikum im Wintersemester kennen sollten. Wir verwenden diesen Chip, da der Raspberry Pi über keine analogen Eingänge verfügt. Die Platine stellt dem Raspberry Pi die Messwerte analoger Sensoren über den I 2 C -Bus (Inter-Integrated Circuit ) zur Verfügung. Auf der Platine sind bereits drei Sensoren montiert, ein Temperatursensor, ein Lichtsensor (Fotowiderstand) und ein Potentiometer. Diese drei Sensoren werden in den kommenden Übungen wiederholt genutzt. Testen Sie, ob der Raspberry Pi über I 2 C Zugri auf die Platine hat. Mit dem Befehl user@rpi201 ~ $ 0 1 2 3 00: -10: -- -- -- -20: -- -- -- -30: -- -- -- -40: -- -- -- -50: -- -- -- -60: -- -- -- -70: -- -- -- -- i2cdetect -y 1 4 5 6 7 8 -- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- --- -- -- -- 48 -- -- -- -- --- -- -- -- --- -- -- -- 9 -------- a -------- b -------- c -------- d -------- e -------- f -------- lassen sich angeschlossene Geräte identizieren. Die Option -y unterdrückt den interaktiven Modus und die 1 steht für den I 2 C -Bus mit der Adresse 1 (es kann mehrere geben). Es sollte eine Matrix erscheinen, in der die Adresse 48 aktiv ist. Den Wert des Potentiometers können Sie mit Nitsche, Kremer 3 Informationssysteme 2. Praktische Übung: Messwerterfassung und Speicherung in MySQL-DB user@rpi201 ~ $ i2cget -y 1 0x48 0x03 0x73 abrufen. Dabei steht 0x48 für die Geräteadresse der Platine und 0x03 für die Datenadresse des Potentiometers. Der Lichtsensor hat die Datenadresse 0x00 und der Temperatursensor 0x01. Testen Sie die Funktion der Sensoren, beispielsweise indem Sie Ihre Hand über den Lichtsensor halten und den Befehl zum Auslesen wiederholt aufrufen. Die Rückgabewerte sind standardmäÿig in hexadezimaler Darstellung. 2.4. Messwerte automatisiert aufnehmen Ein informationsverarbeitendes System übernimmt sinnvollerweise die die Aufzeichnung der Messwerte. Schreiben Sie zunächst ein Python-Skript, dass im Sekundentakt Messwerte ausgibt. user@rpi201 ~ $ mkdir uebung user@rpi201 ~ $ cd uebung user@rpi201 ~/uebung $ nano sensorinput.py Sie können folgendes Programm als Grundlage nutzen: #!/usr/bin/python from smbus import SMBus import time bus = SMBus(1) board = 0x48 light = 0x00 print("Read from PCF8591") print("Press Ctrl+C to stop") while(0 == 0): bus.write_byte(board, light) time.sleep(1) lightval = bus.read_byte(board) print("Licht:" + repr(lightval)) Ihr Programm können Sie mit user@rpi201 ~/uebung $ python sensorinput.py Nitsche, Kremer 4 Informationssysteme 2. Praktische Übung: Messwerterfassung und Speicherung in MySQL-DB starten. Abbrechen lässt es sich mit der Tastenkombination STRG+C. Beachten Sie das in der Programmiersprache Python die Einrückungen essentiell sind. Testen Sie das Programm und erweitern Sie es so, dass auch das Potentiometer und der Temperatursensor ausgelesen werden. Sie werden dabei ggfs. auf das Problem stoÿen, dass Sensorwerte vertauscht sind, überlegen Sie sich eine Lösung dafür. 2.5. Tabelle für Messwerte (phpMyAdmin) Damit Messwerte in einer Datenbank abgelegt werden können, muss zunächst eine entsprechende Tabelle angelegt werden. Dies kann auf unterschiedliche Weise geschehen, beispielsweise über die Weboberäche phpMyAdmin. Sie erreichen die Verwaltungsoberäche, indem Sie die Webseite http://192.168.0.xxx/phpmyadmin/ aufrufen. Die Logindaten sind identisch wie zuvor (dbuser/dbuser ). Sie haben die Option die beiden Datenbanken mydb und praktikum zu verwalten. Wählen Sie mydb und erzeugen sich eine neue Tabelle namens rawdata mit vier Spalten (siehe Abbildung 2.3). Abbildung 2.3.: Tabelle erzeugen (1) Die Namen und Datentypen der Spalten können Sie wie in Abbildung 2.4 gezeigt wählen. Nitsche, Kremer 5 Informationssysteme 2. Praktische Übung: Messwerterfassung und Speicherung in MySQL-DB Abbildung 2.4.: Tabelle erzeugen (2) Setzen Sie auÿerdem für die Spalte id den index auf PRIMARY und wählen Sie A_I (AUTO_INCREMENT ) an. Nachdem Sie auf speichern geklickt haben, wird die Tabelle erzeugt. Sie können über den Reiter Einfügen Testwerte in die Tabelle eingeben. Lassen Sie dabei den Wert für id leer, den dieser wird automatisch vergeben. Löschen Sie am Ende bitte alle Testwerte und loggen sich aus der Weboberäche aus. Die Tabelle kann jetzt von unserem Python-Programm genutzt werden. 2.6. Tabelle für Messwerte (SQL) Alternativ zur gerade vorgestellten Vorgehensweise der Erstellung einer Tabellenstruktur über phpMyAdmin kann dies natürlich direkt in SQL geschehen. Loggen Sie sich dazu wieder in der Datenbank mydb ein und erzeugen Sie eine entsprechende Tabelle. mysql> DROP TABLE IF EXISTS rawdata; mysql> CREATE TABLE rawdata (id int AUTO_INCREMENT, lightval int, tempval int, potival int, PRIMARY KEY (id)); Sofern das Statement korrekt war, sollte eine Bestätigung erfolgen. Query OK, 0 rows affected (0.66 sec) Nitsche, Kremer 6 Informationssysteme 2. Praktische Übung: Messwerterfassung und Speicherung in MySQL-DB Geben Sie nun testweise einen Datensatz ein. mysql> INSERT INTO rawdata (lightval, tempval, potival) values (10,15,20); Prüfen Sie den Inhalt der Tabelle. mysql> select * from rawdata; +----+----------+---------+---------+ | id | lightval | tempval | potival | +----+----------+---------+---------+ | 1 | 10 | 15 | 20 | +----+----------+---------+---------+ 1 row in set (0.00 sec) Wenn Sie weitere Datensätze anlegen, sollte sich die id automatisch erhöhen. Löschen Sie jetzt wieder alle Testdaten mit dem Statement: mysql> delete from rawdata; Dabei bleibt die Struktur der Tabelle erhalten, aber sämtlicher Inhalt wird gelöscht. 2.7. Tabelle mit Python füllen Jetzt werden die Kenntnisse über Python und MySQL verknüpft. Die Werte des Python-Skripts werden direkt in die Tabelle rawdata in der Datenbank geschrieben. Erstellen Sie sich dazu zunächst eine Kopie des Skripts. user@rpi201 ~/uebung $ cp sensorinput.py sensormysql.py Das Skript von oben kann dabei wie folgt erweitert werden (Ergänzungen in rot): #!/usr/bin/python from smbus import SMBus import time import MySQLdb bus = SMBus(1) board = 0x48 light = 0x00 print("Read from PCF8591") print("Press Ctrl+C to stop") Nitsche, Kremer 7 Informationssysteme 2. Praktische Übung: Messwerterfassung und Speicherung in MySQL-DB db = MySQLdb.connect("localhost","dbuser","dbuser","mydb") cursor = db.cursor() while(0 == 0): bus.write_byte(board, temp) time.sleep(1) lightval = bus.read_byte(board) print("Licht:" + repr(lightval)) sql = "INSERT INTO rawdata(lightval) VALUES(" + repr(lightval) + ");" print(sql) try: cursor.execute(sql) db.commit() except: db.rollback() db.close() Erweitern Sie es wieder um die beiden anderen Sensoren und testen Sie Ihr Skript, indem Sie es ausführen und anschlieÿend die Tabelle anschauen. Nitsche, Kremer 8 Informationssysteme