Listing 1
$ sudo apt-get update $ sudo apt-get upgrade $ git clone git://git.drogon.net/wiringPi $ cd wiringPi $ ./build
Listing 2
$ gpio readall +-----+-----+---------+------+---+-Model B2-+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | | | 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | | | 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 | | | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 | | 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | | 27 | 2 | GPIO. 2 | IN | 1 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 | | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 | | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | | | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 | | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 | | | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | 28 | 17 | GPIO.17 | IN | 0 | 51 || 52 | 0 | IN | GPIO.18 | 18 | 29 | | 30 | 19 | GPIO.19 | IN | 0 | 53 || 54 | 0 | IN | GPIO.20 | 20 | 31 | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+-Model B2-+---+------+---------+-----+-----+
MySQL
Die sehr verbreitete Open-Source-Datenbank MySQL eignet sich optimal für kleine bis mittlere Projekte. Sie zählt zum Software-Fundus von Raspbian, sodass Sie sie einfach über die Paketverwaltung installieren. Dabei fragt die Software das Root-Passwort für die Datenbank ab – merken Sie es sich gut. Davon abgesehen, läuft die Installation in der Regel komplett ohne Interaktion durch. Um zu testen, ob das Einrichten erfolgreich war, verbinden Sie sich zunächst mitttels des Befehls mysql -uroot -p mit dem Server. Am MySQL-Prompt tippen Sie dann show databases;, um die bereits vorhandenen Datenbanken einzusehen.
Apache
Durch die Möglichkeit, Module zu laden, erweitern Sie den Webserver auf einfache Weise. Sie installieren ihn unter Raspbian mittels des Kommandos sudo apt-get install apache2. Anschließend können Sie mit einem Webbrowser sofort testen, ob alles funktioniert: Unter http://localhost sollte sich eine einfache HTML-Seite zeigen. Meist ist es sinnvoll, das PHP-Modul gleich mit einzurichten. Das erledigen Sie mittels des Befehls sudo apt-get install php5 php5-mysql. Für einen einfachen Test schreiben Sie mit dem Befehl aus Listing 3 eine PHP-Datei in das WWW-Verzeichnis von Apache. Anschließend finden Sie unter http://localhost/index.php viele Informationen über die PHP-Installation.
Listing 3
$ sudo echo "<?php phpinfo();?>" > /var/www/index.php
Nun legen Sie eine neue Datenbank namens nika an und vergeben an den gleichnamigen User die entsprechenden Rechte zum Administrieren. Die Datenbank enthält nur die Tabelle nika, deren Struktur Sie in der Tabelle “Spalten in nika” finden. Das Skript createDB.sql, das Sie auf der Heft-DVD finden, erledigt diese Arbeiten für Sie, Listing 4 zeigt deren Inhalt. Sie führen das Skript mit dem folgenden Befehl auf der Kommandozeile aus:
$ mysql -u root -p < createDB.sql
Spalten in <C>nika<C>
|
Name |
Typ |
|---|---|
|
|
Zeitstempel ( |
|
|
Ganzzahl ( |
|
|
Ganzzahl ( |
|
|
Ganzzahl ( |
Listing 4
create database nika; use nika; create table nika (ts timestamp, go_in int , go_out int, move int) ; GRANT ALL ON nika.* TO 'nika'@'localhost' IDENTIFIED BY 'nika'; FLUSH PRIVILEGES;
Listing 5 (status.php) zeigt die PHP-Routine, die nach dem Initialisieren der GPIO alle zwei Sekunden die Ports der Lichtschranken ausliest. Löst eine Lichtschranke aus, schreibt sie in die entsprechende Spalte der Datenbank den Wert 1. Danach setzt die Routine die Lichtschranken zurück. Die Praxis zeigt, ob die Wartezeit, die Sie mit dem Befehl usleep() definiert haben, passt oder ob Sie diese verkürzen müssen. Der Status des Bewegungsmelders fragt sie ab, um die IR-LEDs ein- oder auszuschalten.
Listing 5
<?php
exec('/usr/local/bin/gpio mode 0 out');
exec('/usr/local/bin/gpio mode 1 out');
exec('/usr/local/bin/gpio mode 2 in');
exec('/usr/local/bin/gpio mode 3 in');
exec('/usr/local/bin/gpio mode 4 in');
while(true) {
exec('/usr/local/bin/gpio read 2 2>&1', $goin , $rc);
exec('/usr/local/bin/gpio read 3 2>&1', $goout, $rc);
exec('/usr/local/bin/gpio read 4 2>&1', $move , $rc);
$goin=$goin[0];
$goout=$goout[0];
$move=$move[0];
if (($goin>0) or ($goout>0)) {
$db = mysql_connect("localhost","nika","nika") or die("DB Connect error");
mysql_select_db("nika");
$q = "insert into nika values ( now(),$goin,$goout,$move)";
echo ("\n$q\n");
mysql_query($q);
exec('/usr/local/bin/gpio write 0 1');
exec('/usr/local/bin/gpio write 0 0');
mysql_close($db);
}
if ($move>0) {
exec('/usr/local/bin/gpio write 1 1');
}
else {
exec('/usr/local/bin/gpio write 1 0');
}
echo("in:$goin out:$goout Move:$move\n");
usleep(2000000);
}
?>
Das Skript läuft in einer Endlosschleife. Sie starten es mit nohup php status.php & im Hintergrund, sodass es selbst dann weiterläuft, wenn Sie das entsprechende Terminal beenden.
Listing 6 (reporting.php) legen Sie im Verzeichnis für Daten des Webservers ab. Es besteht aus einfachen SQL-Abfragen und liefert kaum Layout. Sie rufen es aus dem lokalen Netzwerk über http://RasPi-IP/reporting.php auf.
Listing 6
<html>
<body>
<H2>10 letzte Flugbewegungen</H2>
<?php
$db = mysql_connect("localhost","nika","nika") or die("DB Connect error");
mysql_select_db("nika");
$q = "select * from nika order by ts desc limit 10";
$ds = mysql_query($q);
echo "<table border=1>";
echo "<tr><td>Zeit</td><td>go_in</td><td>go_out</td></tr>";
while($r = mysql_fetch_object($ds)) {
echo "<tr><td>".$r->ts."</td>";
echo "<td>".$r->go_in."</td>";
echo "<td>".$r->go_out."</td></tr>";
}
echo "</table>";
?>
<H2>Anzahl Vögel im Kasten</H2>
<?php
$q = "select sum(go_in) as go_in from nika";
$ds = mysql_query($q);
$r = mysql_fetch_object($ds);
$in = $r->go_in;
$q = "select sum(go_out) as go_out from nika";
$ds = mysql_query($q);
$r = mysql_fetch_object($ds);
$out = $r->go_out;
$sum = $in-$out;
echo ("$sum<br>");
mysql_close($db);
?>
</body>
</html>
Fazit
So ein Nistkasten bereichert jeden Garten, selbst ohne Anschluss ans Internet. Bei dem schönen Bauprojekt lernen Sie eine Menge. Der Autor bereut im Nachhinein nur die Verwendung der uralten 5V-TTL-Bausteine. Für eine Neuauflage peilt er eine etwas modernere CMOS-Variante an, die mit den 3,3 Volt von der Raspberry GPIO ohne Probleme zurechtkommt. Die Auswertungssoftware verdient sicher noch etwas Schliff – der vorliegende Code dient als Einstieg, um zu zeigen, was möglich ist.
Infos
- Nabu: http://www.nabu.de
- Ex-Store: https://www.ex-store.de
- WiringPi: https://projects.drogon.net





