Datenerfassung mit AVR µC, MySQL

Hier eine kurze Beschreibung dieses Projektes:
Ziel des Projektes ist das Aufzeichnen und Ausgeben der Messdaten auf einem PC von einem an der seriellen Schnittstelle angeschlossenen Mikrocontroller. Auf dem PC läuft ein Linux Betriebssystem (Debian Sarge - stable). Mit einigen Anpassungen (Dateipfade Webserver etc.) läuft er aber auf allen Linux-Systemen

Gerade im Bereich Kommunikation mit dem µC müsste sicher noch einiges geändert werden. Hier habe ich zu Gunsten der Einfachheit auf ein CRC-Verfahren verzichtet. Lediglich die Übertragung der Sensor-IDs wird über eine XOR-Verknüpfung grob geprüft und bei einem Fehler werden die Daten erneut abgefragt.

Schema

Kurze Auflistung der Funktionen:


Bedienung

Alle Einstellungen werden in der mcmysql.conf Datei vorgenommen. Dazu schließt man nur einen DS1820-Sensor an den Mikrocontroller an und ruft dann das Programm mit mcmysql -r auf. Als Rückgabe erhält man dann die 16-stellige Identifikationsnummer welche man gleich an entsprechender Stelle im Config-File einträgt. Als SensorName trägt man noch einen Namen zur Messung ein.
Hat man alle IDs ausgelesen sowie die Zugangsdaten der MySQL-Datenbank eingetragen, wird mit dem Aufruf mcmysql -d die entsprechende Datenbank angelegt, sowie mit dem Aufruf mcmysql -i die 1-Wire Seriennummern in das EEPROM des Mikrocontroller übertragen.
Mit dem Aufruf mcmysql -z fragt das Programm dann im eingstellten Zyklus die Temperaturen der Sensoren ab und trägt sie in der Datenbank ein.


Software

Alle hierzu benötige Software lässt sich bei einem Debian-basierten System per apt installieren.
Benötigt werden folgende Pakete, die bequem per apt-get install installiert werden können:

Sind alle benötigen Komponenten installiert kann durch ein

make mcmysql
die ausführbare Datei kompiliert werden.
TODO: Programm als Daemon laufen lassen.

AVR

Der 1-Wire Bus ist am AVR an Port C Pin 0 angeschlossen. Der AVR arbeitet mit einer Taktfrequenz von 4,194304 MHz. Die Übertragungsrate der seriellen Schnittstelle ist auf 4800 Baud eingestellt.
Der AVR wartet auf ein ankommendes Zeichen an der seriellen Schnittstelle. Das übertragene Zeichen gibt an, welcher Messkanal gelesen werden soll. Dieser Wert wird dann an den PC zurückübertragen

MAIN.C

Datenauswertung über Web-Interface

Die Daten können aus der Datenbank mittles eines Web-Interfaces abgerufen werden. Dazu müssen die Perl-Skripte mcausgabe.pl, mcauswert.pl und show.gp in das cgi-bin Verzeichnis des Webservers kopiert werden. (bei Debian ist standardmäßig /usr/lib/cgi-bin/). Die Datei messmenu.html wird in das Verzeichnis des Webservers kopiert (bei Debian /var/www/). In dem Menü kann man dann die darzustellende Messung sowie den Zeitbereich auswählen. Sind für diesen Bereich Daten vorhanden wird dann mittels Gnuplot das Diagramm erstellt.
Messdaten werden dazu erst aus der Datenbank geholt und in die Datei messung.dat geschrieben. Das entsprechende Batch-File für Gnuplot ist die Date show.gp.
Alle Diagramme werden im png-Format im root-Verzeichnis des Webservers gespeichert.

Eventuell auftretende Fehler lassen sich im Logfile /var/log/apache/error.log des Apache einsehen.

Wichtig: In beiden Perl-Skripten müssen die Zugangsdaten zur MySQL-Datenbank eingetragen werden.

TODO: Ältere Diagramme automatisch löschen.

Config File

Für das Parsen des Config-Files gibt es unter Linux keine API oder einen einheitlichen Standard.
Deshalb habe ich auf die Bibliothek libConfuse zurückgegriffen, die als Debian-Paket verfügbar ist.

apt-get install libconfuse-dev
Dokumentation zu libconfuse finden sich auf
http://www.nongnu.org/confuse/

Infos und Links

Messwerterfassung mit Linux:
http://www.linux-magazin.de/Artikel/ausgabe/1999/08/Messen/messen.html

http://www.loetstelle.net/praxis/seriellport/seriell.php

Infos zur seriellen Schnittstelle unter Linux:
http://www.easysw.com/~mike/serial/serial.html

CGI-Programmierung, Ansprechen der MySQL-API uvm.:
http://pronix.linuxdelta.de/C/standard_C/index.shtml

Perl-Programmierung:
Perl-Einführung auf SelfHTML

Dokumentation der MySQL C-API: (englisch/deutsch)
http://dev.mysql.com/doc/refman/4.1/en/c.html
http://dev.mysql.com/doc/refman/4.0/de/c.html

Schnittstelle einstellen mit:
#stty ospeed 1200 ispeed 1200 -crtscts -parenb cs8 < /dev/ttyS0       
Einstellungen anzeigen lassen mit:
#stty -a < /dev/ttyS0