Messwerterfassung und Speicherung in MySQL-DB

Werbung
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
Herunterladen