Daten empfangen von NAS Webserver/MySQL

Hall zusammen,

ich suche nun schon zwei Tage aber ich finde leider nichts passendes und hoffe ihr könnt mir helfen.

Ich habe 1000de Beispiele gefunden die zB Temperaturwerte mit PHP in eine Datenbank schreiben.

Ich suche genau das Gegenteil.

Auf meiner NAS läuft ein Websever mit einer MySql Datenbank, per PHP frage ich die Daten (Zahlen) ab...

Diese sollen dann an meinen Arduino Nano auf einer 7-Segment angezeigt werden.

Die Anzeige und das Ethernet Shield funktioniert.

Am liebten wäre es mir, wenn die Daten vom PHP-Script an den Arduino geschickt werden, also nicht dass der Arduino sich die Daten holt.

Vielen Dank und viele Grüße

Markus

also nicht dass der Arduino sich die Daten holt

Fragt ein Webserver den andern: “Hast du was zu tun ?”
Antwort: “Jetzt ja”

per PHP frage ich die Daten (Zahlen) ab

Wer genau ist “ich”?

Im Ernst: ein Arduino kann Server oder Client sein. Was ist hier sinnvoller?

“Ich” kann natürlich ein Client sein, der zu zwei Servern eine Verbindung aufbaut. Wenn “Ich” das nicht macht, zeigt der Arduino auch nichts bzw. was altes an.

Intuitiv klar für mich wäre ein Arduino als Client, der die Aufgabe hat, von einem Server sich was zu holen und es anzuzeigen.

Aber andersrum macht ein Arduino Server, der nur die Aufgabe hat, bei einer passenden Anfrage diese auf seinen 4x7 Segmenten darzustellen, auch Sinn.

Die Anzeige und das Ethernet Shield funktioniert.

Auch zusammen? Dann ist “andersrum” doch schon so gut wie fertig und du kannst dich auf dein PHP Script konzentrieren.

Du brauchst kein PHP dazwischen, das geht auch direkt.
Die Lösung ist hier beschrieben.

Gruß Tommy

Hallo zusammen,

ich hole mal etwas weiter aus... Im Moment läuft auf einen Raspberry 3 ein "Steeldart Punktezähler", 301, 501, Cricket, usw.

Dargestellt wird es über PHP bzw. HTML, CSS, Javascript und die Daten aus einer MySql auf einem älteren Monitor.

"Ich" ist also ein Raspberry. Ich würde den Raspberry aber gerne gegen Arduino austauschen.

Die Punkte der Spieler aus der MySql sollen auf 7-Segmentanzeigen dargestellt werden, im Prinzip genau so wie die elektronischen Dartautomaten.

Da sich die Anzeige möglichste schnell aktualisieren soll, refreshe ich zur Zeit im Sekundentakt per Javascript. Das möchte ich auch beibehalten.

Im Sekundentakt Anfragen an MySql schicken finde ich aber unschön, vor allem wenn man mal 2 Stunden nicht spielt, daher wäre ein Arduino als Server besser. Sobald sich der Punktewert ändert wird der neue Stand an den Arduino gesendet.

Wie sieht so ein Befehl den über PHP aus?
Ich kenne es bei "normalen" Webserver... zB: http://192.168.178.20/index.php?newpoints=280

Auf dem Arduino gibt es aber keine PHP-Dateien... oder lässt man die dann einfach weg und hängt die GET Variablen direkt an die IP.

Viele Grüße
Markus

PS: Ich überlege gerade ob es vielleicht Sinn macht auf Raspberry, MYSQL, NAS, PHP usw. komplett zu verzichten.
Also rein Arduino und als "Datenbank" evtl. TXT Dateien auf einer SD-Karten nutzen soll. Was meint ihr dazu?

Wie sieht so ein Befehl den über PHP aus?

PHP kann UDP Pakete versenden.
http://php.net/manual/de/function.socket-create.php
Dein Arduino kann diese empfangen und auswerten.

Puuuhhhh, mit Socket hab ich mich noch nie beschäftigt.
Schau ich mir aber mal an !!

Vermutlich verstehe ich das Problem nicht (was ist ein normaler Webserver?) :

http://192.168.178.20/index.htm?newpoints=280

ist doch eine einfache Aufgabe für einen Arduino als Webserver ?
Der Arduino könnte sogar eine Webseite zurückliefern, mit dem du ihn per Browser testen kannst.

Zum Thema "Brauche ich mySQL oder reicht eine TXT-Datei auf einer SD":
Ein Arduino hat ein EEPROM, wenn du was über einen Reset hinweg speichern willst.
Das überlebt wahlweise sogar einen Arduino-Sketch-FirmwareUpdate.

Michael, da bin ich mir nicht sicher... ich glaube ich denke einfach viel zu kompliziert und vielleicht gibt es ja gar kein Problem :slight_smile:

Ein normaler Webserver ist für mich, Apache, PHP, MYSQL mit phpmyadmin usw.

Wie sieht den die URL aus, die ich an den Arduino schicken?

So würde ich es normalerweise machen, kann ich mir aber nicht vorstellen, da es ja keine index.php auf dem arduino gibt...
http://192.168.178.20/index.php?newpoints=280

oder lässt man die PHP-Datei einfach weg?
http://192.168.178.20/?newpoints=280

Ich fange gerade erst an mit Arduino, ist alles noch ein bisschen verwirrend...

oder lässt man die PHP-Datei einfach weg?
http://192.168.178.20/?newpoints=280

Oder noch einfacher:
http://192.168.178.20/newpoints/280
Oder auch http://192.168.178.20/280

Natürlich kann man auch http://192.168.178.20/index.php?newpoints=280 senden.
Der Arduino kann dann ja das index.php wohlwollend ignorieren.

Tipp:
Der Programmierer ist dafür zuständig, wie der Arduino auf den Request reagiert.
Wenn schon HTTP, dann empfehle ich dir REST.
Einfacher gehts nicht.

Ein "normaler Webserver" ist für mich alles, mit dem ein "normaler Browser" reden kann.

Dem kann man natürlich in die Adresszeile "http://192.168.178.20/280" schreiben und sich freuen, wenn die Antwort mit einer Zeile HTTP/1.1 200 OK anfängt.
Schöner wäre natürlich eine Antwort, mit der mein "normaler Browser" gleich einen neuen Wert senden könnte. Aber auch dazu brauchte man bei der Erfindung des www noch keine php scripts.

dazu brauchte man bei der Erfindung des www noch keine php scripts

perl?

Meine webdesigner-werkzeuge sind notepad und ftp.
Ok, ich hätte jetzt statt “notepad” “vi” schreiben sollen, aber ich will ja glaubwürdig bleiben.

Guten Morgen zusammen,

die Datenübertragung über UDP läuft eigentlich super, zumindest im seriallen Monitor ich bekomme zB. dem Wert 281 angezeigt!!!

Ich habe dieses Beispiel udpListener genutzt.

Leider macht die Anzeige auf einen 7 Segment Display noch Probleme.

ich nutze die Adafruit_LED_Backpack Bibliothek. Aus dem Beispiel SevenSeg

Da man in der Adafruit Bibliohek einfach direkt mit Zahlen arbeiten kann dachte ich, dass ich den UPD Wert einfach wie folgt nutzen kann.

so funktioniert es:

matrix.print(281);
matrix.writeDisplay();
delay(500);

so leider nicht

void udpSerialPrint(uint16_t dest_port, uint8_t src_ip[IP_LEN], uint16_t src_port, const char *data, uint16_t len){

Serial.println(data);

matrix.print(data);
matrix.writeDisplay();
delay(500);
}

so leider nicht

void udpSerialPrint(uint16_t dest_port, uint8_t src_ip[IP_LEN], uint16_t src_port, const char *data, uint16_t len){

Serial.println(data);

int test = data;
matrix.print(test);
matrix.writeDisplay();
delay(500);
}

Auf dem Display wurde immer "60" ausgegeben.

Wo ist mein Fehler?

Viele Grüße
Markus

Da man in der Adafruit Bibliohek einfach direkt mit Zahlen arbeiten kann dachte ich, dass ich den UPD Wert einfach wie folgt nutzen kann.

Falsch gedacht!
Die 280 ist bei dir keine Zahl, sondern eine Zeichenkette!

Tipp: atoi()
(oder vergleichbares)

Hallo zusammen,

vielen Dank für eure Hilfe !!!

Jetzt funktioniert es einwandfrei !!!

atoi() , ich hab mir sowas in der Richtung gedacht, aber ich wusste nicht wonach ich suchen musste

Viele Grüße
Markus

ich wusste nicht wonach ich suchen musste

Suchen ist übertrieben. Der erste Fehler von Leuten die von python oder php kommen:

void udpSerialPrint(uint16_t dest_port, uint8_t src_ip[IP_LEN], uint16_t src_port, const char *data, uint16_t len){

kümmern sich nicht ums wesentliche: Datentypen.

Man kann auch sagen, dass[b] print [/b] ein vollkommen falscher Methoden-Name ist, wenn sie nicht klaglos int, float und Texte beliebiger Länge schluckt. Aber leider ist bei Libraries auch immer der schuld, der sie verwendet.

Glückwunsch übrigens !