Hallo zusammen,
ich habe bereits fundierte Kenntnisse beim programmieren von
Microcontrollern. Nun würde ich gerne einen Messwert aufnehmen und diese
in meine Datenbank eintragen. Hat jemand damit schon Erfahrung? oder
kann mir jemand ein gutes Buch empfehlen?
vielen Dank im voraus
was für eine Datenbank?
wo soll die Datenbank laufen?
welchen "Verbindung" gibt es vom Messwertsystem zum Datenbanksystem?
welche Datenmengen müssen übertragen werden?
Ich empfehle das Buch "Messwerte aus Microcontrollern in Datenbanken
abspeichern", Verlag: "Dumm&Dämlich GmbH". ISBN musst aber selber
raussuchen.
Sollte alles drinstehen was du wissen musst.
welche Datenbank das ist, ist im mom egal, schön wäre es wenn es über
TCP/IP gehen würde.
ich stell es mir sovor, dass ich z.B ein Temperaturmesswert aufnehme.
Dieser dann in der Datenbank gespeichert wird und mit Hilfe eines Web
Servers per Smartphone abfragen kann
Und der Controller ist wohl auch unwichtig.
Normalerweise hat man einen Client für eine Datenbank. Dieser läuft
lokal und spricht über TCP/IP mit dem Datebanksever. Zur Anwendung
stellt er meist standardisierte Schnittstellen (ODBC) zur Verfügung.
D.h. du brauchst nur einen Client und musst dir ODBC angucken.
Allgemeine Kentnisse über relationale Datenbanken setze ich mal vorraus,
bzw. müssten seperat angeeignet werden.
gruß cyblord
Miriam schrieb:> welche Datenbank das ist, ist im mom egal, schön wäre es wenn es über> TCP/IP gehen würde.
Dann könntest du auf deinem Messsystem den Datenbanktreiber nutzten,
oder auf dem Datenbankserver ein Programm schreiben was die Daten über
TCP annimmt und an die DB weiterreicht.
Darüber wird du kein Buch finden, weil du kein konkretes Problem hast.
Miriam schrieb:> welche Datenbank das ist, ist im mom egal, schön wäre es wenn es über> TCP/IP gehen würde.
Es stellt sich immer noch die Frage: Wie ist deine Systemarchitektur?
Wo läuft die Datenbank?
Läuft die auf dem µC (welcher?) oder läuft die auf einem eigenen
Datenbankserver?
> ich stell es mir sovor, dass ich z.B ein Temperaturmesswert aufnehme.> Dieser dann in der Datenbank gespeichert wird und mit Hilfe eines Web> Servers per Smartphone abfragen kann
Das ist so aussagekräftig wie:
Ich will ein Auto bauen. Ich stelle mir das so vor, dass es 4 Räder
haben soll.
Ich will ein Verkehrsflugzeug bauen. Dazu stelle ich mir vor, dass ich
Flügel und Triebwerke brauchen werde.
Ich will ein Haus bauen. Ich stelle mir vor, dass es ein Dach und eine
Eingangstür hat.
Welchen µC hast du? Welche Kommunikationsmöglichkeiten hast du auf dem
µC? Hast du einen Web-Server zur Verfügung? Hast du einen Web-Provider,
der dir eine Datenbank zur Verfügung stellt? Wie sonst soll der Zugriff
aus dem Web auf die Daten erfolgen?
Im Moment sieht das nach einer 2-Teilung aus
1
µC Server
2
+--------+ +---------+
3
| |---------->| |
4
+--------+ | |<----- WEB
5
| Daten- |
6
| bank |
7
| |
8
| Web- |
9
| Server |
10
+---------+
Wo steht der Server? Hast du einen bei dir zu Hause?
Wenn zu Hause: Wie ist deine Web-Anbindung, ist die ständig verfügbar?
Eventuell könnte man auch den Server mit dem µC 'verheiraten', in dem
man beides zb auf einen NET-I/O gibt, der die Datenbank auf einer
SD-Karte realisiert (Wobei Datenbank ein recht hochtrabender Begriff für
eine Reihe aus Tupeln ist)
ich habe das I/O Net Board von Pollin mit einem ATMEGA32
ja die Struktur soll wie oben beschrieben sein.
Micrcontroller nimmt die Messwerte auf, schickt sie an eine Datenbank
die auf meinem PC läuft, Webserver stellt die Daten im Hausnetz zur
verfügung. Der Webserver läuft auch auf dem PC.
lediglich die Messwertaufnahme und die Versendung der daten per TCP
sollte auf dem uC realisiert werden
Also bleiben dir 2 Möglichkeiten: Du schaust in die tech. Doku deiner
Datenbank und schreibst die Kommunikation via TCP selbst, oder du suchst
dir einen fertigen Client für den AVR, bzw. portierst einen.
Aber die Frage stellt sich: Warum muss es eine ausgewachsene Datenbank
sein? Und warum direkt damit Kommunizieren? Wenn du schon einen
Webserver hast, dann mach ein PHP-Skript welches Meßwerte z.B. über GET
Parameter entgegen nimmt, dann kannst du via TCP sehr einfach einen HTTP
Request senden und diese Webseite aufrufen und deine Meßwerte übergeben.
Das PHP-Skript kann diese dann sehr einfach in eine Datenbank schreiben.
Die Hürde hierbei: Kannst du denn bereits sauber via Net/IO Daten via
TCP raussenden? Oder musst du das auch noch implementieren?
gruß cyblord
Miriam schrieb:> das muss ich auch noch implementieren :-(> oder du suchst dir einen fertigen Client für den AVR -> was meinst du> damit?
man könnte auch versuchen einen mysql/MS-SQL (freetds)/sqllite/ Client
auf deinem AVR zu übersetzen.
Miriam schrieb:> ok, gibt es dafür ein Buch> sowas hör ich zum ersten mal
nein bestimmt nicht, weil es vermutlich noch niemand gemacht hat. Es ist
für einen AVR einfach nicht sinnvoll. Bei einem ARM macht das dann schon
mehr sinn.
Das einfachste für den AVR wird sein, die Messwerte per UDP an einen
Server zu senden. Dann kann es aber passieren das auch mal ein Messwert
verloren geht. (im LAN sehr unwahrscheinlich).
Miriam schrieb:> ok, gibt es dafür ein Buch
Eher nicht.
> sowas hör ich zum ersten mal
Dann ist es für dich sowieso unmöglich. Das macht man nicht mal so
schnell.
Halte dich an die Webserver/PHP Methode, das könnte klappen. Den TCP/IP
Stack brauchst du halt noch auf deinem AVR. Bevor das nicht steht, würde
ich mir um höhere Schichten erstmal keine Gedanken machen.
Mit dem Vorwissen sollte man auch mal ins Auge fassen, den ganzen Plan
etwas umzuändern.
Auf dem Net-IO wird ein Web-Server installiert. Zb. der vom Radig
Ulrich, oder Ethersex.
Dieser Web-Server übernimmt das Ausliefern der kompletten Web-Site und
das Programm wird soweit gepimpt, dass die Messwerte lokal gehalten
werden. Entweder im EEPROM speichern (falls die Datenmengen nicht allzu
gross sind), oder auf einer SD-Karte.
Aber im Moment sehe ich da ehrlich gesagt noch etwas schwarz, weil dir
noch gar nicht bewusst ist, dass du erst mal die komplette Infrastruktur
schaffen musst, damit du überhaupt erst mal eine Netzwerk Verbindung
herstellen und betreiben kannst. Erst wenn diese Verbindung steht,
stellt sich dann erstmalig die Frage: Wer? kommuniziert eigentlich mit
wem? auf welchem? Port und welche Daten? werden vom Net-IO zu wem?
übertragen, der dann was? damit macht?
Im Momemnt stehst du da, wie die Banker am Anfang des 20. Jahrhunderts,
die die Börsenkurse von London nach New-York übertragen möchten (das ist
ihre Wunschvorstellung), die aber das Problem haben das noch überhaupt
keine Transatlantikleitung liegt und die Ingenieure auch noch keine
Ahnung davon haben, wie das funktionieren soll, die schwachen
Telefonspannungen über eine Distanz von 6000km zu übertragen. Ehe der
Wunsch der Banker in Erfüllung gehen kann, gilt es, erst mal einen
Haufen darunter liegende Technik zu erstellen und lauffähig zu machen.
Mit dem Wunsch alleine ist es nicht getan.
Ich habe auch noch einen Lösungsvorschlag, der vielleicht nicht so schön
ist, aber warscheinlich eine ganze Ecke einfacher umzusetzen.
Statt sich auf dem kleinen AVR mit TCP/IP-Implementierung rum zu
schlagen, werden die Daten per UART an den PC übermittelt. Dann musst du
nur noch auf dem PC ein Programm schreiben, dass die Daten am UART
entgegen nimmt und diese entweder über ODBC direkt oder (wenn es eine
MySQL_DB sein soll) über den mitgelieferten Komandozeilen-Clienten in
die DB einträgt.
Nicht besonders schön, wenn man schon das Net-IO Board hat und somit gut
übers LAN gehen könnte, aber sicherlich einfacher in der Umsetzung.
Hallo Miriam,
ich mache das bei mir so:
- die ATmega-Schaltung hängt per serieller Schnittstelle an einem
Raspberry Pi
- der Raspberry Pi ist in meinem Netzwerk und hat damit
Internet-Verbindung
- die ATmega-Schaltung empfängt mit einem Funkmodul Messwerte von
Temperatur/Feuchte/Druck-Sensoren
- überträgt diese über die serielle Schnittstelle an den Raspberry Pi
- dort läuft ein Python-Script, dass auf diese Messwerte wartet und
diese dann an eine "Web-DB" wie ThingSpeak (www.thingspeak.com) schickt,
DBs wie diese sind genau dafür gemacht.
- auf Thingspeak.com kannst Du Dir die Graphen zu Deinen Messwerten
direkt ansehen oder Du kannst es wiederum mit anderen Scripts per API
abfragen
- auf diese Weise steuere ich Luftbefeuchter: Script auf dem Raspberry
Pi holt den letzten Wert für das Schlafzimmer. Wenn der <40%
Luftfeuchtigkeit ist, dann schalte ich eine Funksteckdose ein, wenn
darüber, dann wieder aus.
- die Funksteckdose wird auch von der Atmega-Schaltung angesteuert, der
Raspberry Pi schickt über die serielle Schnittstelle den Befehl zum
Schalten einer Funksteckdose
D.h. ich brauche hierfür kein TCP/IP, das erledigt der Raspberry Pi. Und
ich brauche auf dem keine Datenbank, das wäre mir zu pflegeaufwändig.
Man könnte sich aber dort auch selber eine DB einrichten, MySQL zum
Beispiel. Mit Python ist es sicher nicht schwierig auf eine MySQL-DB
zuzugreifen.
Viele Grüße,
Conny
cyblord ---- schrieb:> Halte dich an die Webserver/PHP Methode, das könnte klappen. Den TCP/IP> Stack brauchst du halt noch auf deinem AVR. Bevor das nicht steht, würde> ich mir um höhere Schichten erstmal keine Gedanken machen.
Lass das lieber mit dem Netzwerk auf dem AVR. Mach es per serieller
Schnittstelle.
Conny G. schrieb:> cyblord ---- schrieb:>> Halte dich an die Webserver/PHP Methode, das könnte klappen. Den TCP/IP>> Stack brauchst du halt noch auf deinem AVR. Bevor das nicht steht, würde>> ich mir um höhere Schichten erstmal keine Gedanken machen.>> Lass das lieber mit dem Netzwerk auf dem AVR. Mach es per serieller> Schnittstelle.
er hat doch schon Netzwerk:
> I/O Net Board
kann doch nicht so schwer sein, damit einfach ein UDP Packet mit den
Messwerten abzuschicken.
Conny G. schrieb:> cyblord ---- schrieb:>> Halte dich an die Webserver/PHP Methode, das könnte klappen. Den TCP/IP>> Stack brauchst du halt noch auf deinem AVR. Bevor das nicht steht, würde>> ich mir um höhere Schichten erstmal keine Gedanken machen.>> Lass das lieber mit dem Netzwerk auf dem AVR. Mach es per serieller> Schnittstelle.
Einfach so per serielle Schnittstelle wird wohl schwierig, da müsste das
Ding ja neben dem PC stehen.
Und es wird einen Grund geben, wenn explizit nach Netzwerk gefragt wird
und ein NetIO Board verwendet wird. Und deine Methode geht auch übers
Netzwerk, nur hast du einen RasPi dazwischen. Das ist mit Kanonen auf
Spatzen geschossen.
Wenn dann würde ich einen integrierte Netzwerkbaustein nehmen, welcher
direkt per z.B. per SPI angesteuert werden kann und den Stack
integeriert hat. Der ENC auf dem netIO ist einfach zu unhandlich und
umständlich.
> kann doch nicht so schwer sein, damit einfach ein UDP Packet mit den> Messwerten abzuschicken.
1. Wohin? Ein Webserver benötigt eigentlich TCP. Dann muss man die
Gegenstelle auch noch selber programmieren.
2. Der ENC Baustein kann nur MAC. Dann fehlt dir noch die ganze IP
Schicht, inkl. ARP usw. Selbst wenn du dann NUR noch UDP oben drauf
setzt. Erst mal machen dann behaupten es wäre so einfach.
gruß cyblord
Peter II schrieb:> kann doch nicht so schwer sein, damit einfach ein UDP Packet mit den> Messwerten abzuschicken.
Das Problem ist, dass man zum Net-Io nur so ein schwindliges Programm
mitbekommt. Und noch nicht mal das in Source Code Form. Wenn sie
wenigstens den Source Code für einen einfachen UDP/TCP Stack mitliefern
würden oder irgendwo downloadbar hätten.
Eine andere Variante würde es noch geben:
Das auf dem Net-IO mitgelieferte Programm funktioniert grundsätzlich.
D.h. man kann mittels TELNET (auf einem anderen Port) oder einem
Terminal-Programm welches man auf eine IP/Port Kombination ansetzen
kann, auf den Net-IO zugreifen und mittels ASCII Kommandos den Status
von Port-Pins oder Analogen Eingängen abfragen. Dann müsste man die
Steuerung des kompletten Vorgangs auf dem Server-Rechner machen. Der
Net-IO ist dann nur ein passiver Teilnehmer im Netzwerk, der PC macht
die laufende Abfrage des Sensors und trägt das in die Datenbank ein.
Grundsätzlich machbar wäre das schon.
Dann läuft eben auf dem PC ein Programm, welches alle 30 Sekunden den
Messwert vom Net-IO erfragt und weiter verarbeitet.
Miriam schrieb:> ich habe bereits fundierte Kenntnisse beim programmieren von> Microcontrollern.
Nein, hast du nicht.
Suche dir erstmal eine Datenbank aus. Dann suchst du dir zu dieser
Datenbank raus, wie man sie anspricht. Und DANN überlegst du dir, wie
man da rangehen könnte. Dazu benutzt du am besten eine
Internet-Suchmaschine deiner Wahl.