grüß Euch,
mein UNO ist die fortsetzung nach dem ethernet-AVR-NET-IO von pollin. auf diesen konnte man über die original-firmware (intra- und internet) auf das board zugreifen, hier der PHP-code:
.....
.....
$fp = fsockopen($server, $port, $errno, $errstr, 30); //die verbindung zum NET-IO wird geöffnet
if(!$fp)
{
printf("Error: %s (%s)", $errstr, $errno);
}
#echo "fp = " . $fp;
for($WerteNummer=0; $WerteNummer<10; $WerteNummer++){ //die ADC-werte werden 10mal gemessen (für mittelwertberechnung)
for( $ADCnr=1; $ADCnr < 5; $ADCnr++ ){ //in der netserver-software sind die ADCs von 1 bis 4 nummeriert, NICHT von 0-3!!//
fputs($fp, "GETADC " . $ADCnr . "\r\n"); /* "fputs" schreibt z.B. "GETADC" in die terminal-oberfläche vom NET-IO.
der verfügbare befehlssatz ist dem beiblatt der SW netserver zu entnehmen.
"GETADC" ist aber leider NICHT dokumentiert!!!
diesen habe ich von
http://defcon-cc.dyndns.org/projects/mikrocontroller/netio.php */
$ADCstring = fread($fp, $BUFFER_SIZE);
$ADCzahl = intval( $ADCstring ); //umwandeln in integer
//jetzt werden mit fwrite die werte in eine logdatei geschrieben:
....
....
meine frage: gibt es diese möglichkeit auch beim arduino?
was ich möchte:
der arduino soll (standalone) die adc-werte als webserver bereitstellen (tut er brav), diese sollen dann von überall aber nicht nur abrufbar (browser) sondern auch speicherbar sein (PHP: fwrite).
könnt Ihr mir weiterhelfen?
grüße aus Ö!
M.
edit:
fsockopen($server,...) und fputs(...) funktionieren; nur wenn ich dann fgets anwende, bleibt er hängen.
Ich habe das Net-IO board von pollin mit dem Programm ProfiLab 4.0 benutzt. Da konnte man auch die ADC auslesen und auf dem PC verarbeiten/abspeichern. Sehr komfortabel!
wenn du mit dem Browser auf dein Arduino zugreifen kannst, dann geht das auch mit PHP.
Ich benutze immer file_get_contents, find ich einfacher als fsockopen, etc...
antwort auf o_lampe und kduin
tja,
eigentlich hatte ich schon geschrieben: dass der UNO standalone, d.h. ohne PC arbeiten soll, das heißt wieder, dass er nur über ethernet erreichbar ist.
ich frage also nicht nach PC-verbindung sondern nach remote-verbindung über ....:
ich möcht auf den Bermudas sitzen und die daten, die er über dyndns ausspuckt, dort, auf den bermudas, vielleicht auf dem hotel-PC **speichern ** 8).
der arduino-sketch ist der original-sketch ethernet- "WebServer", natürlich mit angepasster IP und GW:
/*
Web Server
A simple web server that shows the value of the analog input pins.
using an Arduino Wiznet Ethernet shield.
Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13
* Analog inputs attached to pins A0 through A5 (optional)
created 18 Dec 2009
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
*/
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connnection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// add a meta refresh tag, so the browser pulls again every 5 seconds:
client.println("<meta http-equiv=\"refresh\" content=\"5\">");
// output the value of each analog input pin
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("
");
}
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disonnected");
}
}
das heißt wiederum, ich muss über PHP (weil HTML hat da keine funktionen) irgendwie auf eine mir nicht geläufige oberfläche im arduino zugreifen.
wiegesagt, beim AVR-NET-IO gez (da bietet die firmware die möglichkeit), ob beim arduino, weiß ich nicht.
das war die frage an Euch.
Danke!
und woher nimmst Du auf den bermudas den webserver für PHP?
bau Dir doch einfach Deine webseite, die auf dem arduino liegt, mit html und javascript so, daß Du speichern kannst, was immer Du vorgesehen hast.
und woher nimmst Du auf den bermudas den webserver für PHP?
so wie ichs mit dem AVR-NET-IO gemacht hab: HTML/php-seite und apache-service am läppi (im keller, beim nachbarn, auf den bermudas... 8)
bau Dir doch einfach Deine webseite, die auf dem arduino liegt, mit html und javascript so, daß Du speichern kannst, was immer Du vorgesehen hast.
bin ich so verknackt, dass ichs nicht kapier: mit dem arduino kann ich per html/java doch nur wieder (oder stimmt das vielleicht nicht?) am arduino speichern (z.b. SD-karte). DAS funktioniert ja, gibts ja auch original-beispiele dafür.
aber ich möchte im keller (bei der nachbarin?) speichern, jedenfalls remote, warum auch immer...
jedenfalls dank Dir recht heftig. wird schon werden!
lg
M.
Ok, ich fasse mal zusammen, was ich bisher verstanden habe.
Es gibt einen Arduino UNO mit Ethernet-Schnittstelle (vermute ich mal, denn geschrieben wurde davon noch nix), der ADC Werte erfassen soll. Diese soll er per Web-Schnitstelle bereitstellen
Es gibt irgendwo auf der Welt einen Rechner/Server mit Webserver und PHP, der dann auf den Arduino Zugreifen soll, um die Daten regelmäßig auszulesen
Es gibt einen Laptop / Rechner, der dann auf den Webserver zugreift um die dort gespeicherten Daten abzuholen, zu verarbeiten oder was auch immer.
Ist das das soweit richtig?
Zu 1) Der Sketch den Du aktuell verwendest ist ungünstig für eine automatische Verarbeitung, da er eine "normale" HTML-Seite erzeugt. Wenn Du nur automatisiert darauf zugreifst, würde ich die Daten in einem "freundlicheren" Format ausgeben. Z.B. immer einen Sensorwert pro Zeile und dann den ADC-Pin und den gemessenen Wert durch ein Semikolon getrennt. Dann kannst Du das in PHP schön per foreach und explode() auseinandernehmen.
Zu 2) Wie zu 1 schon geschrieben, am besten per
//lines like "1;245" with 1=arduino adc-pin and 245 measured value
$data = file("http://myarduinoip/")
foreach ( $data as $line) {
$elements = explode(";",$line);
.... //hier dann weiterarbeiten $elements[0] ist der adc-pin und $elements[1] ist der wert
}
Zu 3) Das ist ja dann nur eine Frage wie Du Dein PHP-Script aufbaust, das die gespeicherten Werte zusammenstellt und präsentiert.
bin ich so verknackt, dass ichs nicht kapier: mit dem arduino kann ich per html/java doch nur wieder (oder stimmt das vielleicht nicht?) am arduino speichern (z.b. SD-karte).
Du speicherst nicht per HTML/java, sondern Du sendest einen request, der das speichern dann auslösen kann. gut, wenn Du auf der SD-karte speichern willst, aber für Deine wünsche eben nicht geeignet.
Du mußt serverseitig (was der arduino macht), von clientseitig (was der pc macht) unterscheiden.
wenn der webserver arduino Dir daten schickt, kannst du auf dem pc damit machen, was Du willst.
z.b. die gesendeten werte per hand kopieren und in einer datei speichern. oder auf die tabelle (wenn es denn eine ist, die der arduino sendet) rechtsklicken und nach excel exportieren.
wenn Du jetzt in deiner html-datei von arduino das passende javascript reinschreibst, kannst Du einen button in die seite bauen, der beim draufklicken die werte lokal am pc speichert. und natürlich kannst Du das auch alle 5 minuten automatisch passieren lassen. dazu mußt Du Deine webseite (zuhause.dyndns.com) zu den vertrauenswürdigen seiten hinzufügen.
es gäbe noch viele möglichkeiten, ohne zweiten webserver (was der PHP-server ja dann wäre), auszukommen. das ist ja das, was mich dran stört. dieser umweg.
wenn der webserver arduino Dir daten schickt, kannst du auf dem pc damit machen, was Du willst.
möglicherweise liegt genau da der knacker. leider hab ich bisher immer gepostet, dass der läppi im keller oder auf den bermudas sitzt, liegt.
was ich nicht gesagt (aber vorausgesetzt) hab, dass ich NICHT dabeisitz und abspeichere, sondern der läpdäp soll das alleine, von selber machen (PHP: fwrite).
ändert das was an unserem verständnis?
probieren muss ich Dein schnipsel:
$data = file("http://myarduinoip/")
mein problem: hab nie HTML verwendet/verstanden, sondern sofort mit PHP gemurxt.
berechtigte frage: wie kann man PHP ohne HTML reden.
Also PHP ist eine Scriptsprache, die auf einem Webserver ausgeführt wird. Normalerweise erzeugt man mit PHP einfach HTML-Ausgaben, die dann von einem Browser dargestellt werden.
HTML ist also das Ausgabeformat und PHP ist die Programmiersprache.
Mittels PHP kannst Du Dir ein Skript bauen, welches den Arduino per HTTP-Port anspricht und dort Daten liest. Allerdings hast Du noch ein anderes Problem, das PHP-Script muss auf dem Server regelmäßig gestartet werden. Diese Funktionalität liefert die das PHP nicht direkt. Bei Linux kann man das mit cron lösen, bei Windows gibts sicher was ähnliches.
Willst Du dann zusätzlich den Webserver noch mit einem Browser für den Datenzugriff ansprechen?
mkl0815: $data = file("http://arduino-IP/") war der tip des tages, funktioniert (zumindest ein nachfolgendes print_r, mit dem ich mir das array ausgeben lasse).
warum mag fgets nicht?
jedenfalls einmal herzlichen dank, den rest krieg ich hin, trotzdem meld ich mich noch.
lg
Marcel
zum verständnis ein beispiel. das script schreibt den inhalt einer webseite in eine datei c:\log.txt. wenn Du die alle 5 minuten über geplante tasks ausführst, hängt sie das, was der arduino sendet, in der datei hinten dran. wenn's die datei nicht gibt, wird sie angelegt, mußt nicht Du machen.
hab gerade gesehen, daß man unter win7 keine datei auf c: anlegen kann.
muß man mit dem notepad öffnen und einen anderen pfad angeben, der auf dem rechner vorhanden ist.
grüß Euch nocheinmal,
und danke für Eure mithilfe.
eisbaer:
jetzt muss ich doch noch VB strebern und HTML dazu. vielleicht tu ichs wirklich, wahrscheinlich ist es fürs verständnis notwendig.
jedenfalls bin ich mit PHP im (ungesetzlich China-geklonten ) Arduino drinnen und kann mit den verschiedenen funktionen (file, explode, implode,..) die gelieferten daten lesen und speichern.
das war auch meine (titel)frage.
abschließend zwei fragen:
stimmt es, dass man mit reinem HTML (ohne PHP, VB, Java,...) das, was ich wollte (über einen HTML-request speichern), NICHT kann?
sollte das NICHT stimmen, man es also SCHON kann: wie?
grüße und dank rundherum!
Marcel
PS: ist es in Wien so eisig, dass da schon die Eisbären herumlaufen? bei uns (500m) hats doch noch plusgrade.
stimmt es, dass man mit reinem HTML (ohne PHP, VB, Java,...) das, was ich wollte (über einen HTML-request speichern), NICHT kann?
sollte das NICHT stimmen, man es also SCHON kann: wie?
HTML ist eine reine Beshreibungssprache (evtl. von neueren HTML 5 Erweiterungen mal abgesehen), damit kannst Du nicht programmieren sondern nur codieren. Also das Format einer Ausgabe festlegen.
Weiterhin hat Dein eigentliches Ansinnen, nämlich Daten von einem Arduino abzuholen mit HTML überhaupt nichts zu tun. Im Grunde baust Du eine Netzwerkverbindung auf, schickst eine Anfrage an den Arduino (HTTP - HyperText Transfer Protocol, nicht HTML - HyperText Markup Language) und bekommst eine Antwort. Ob der Arduino jetzt die Antwort in HTML verpackt schickt, oder einfach als strukturierten Text (CSV z.b.) ist erstmal egal.
Du brauchst halt auf der Gegenseite des Arduino (also dem Rechner / Server der die Daten abfragt) ein Programm, das die Anfrage an den Arduino schickt und dann die ankommenden Daten speichert, bzw. verarbeitet.
Du mußt VBS nicht lernen. sag mir, was Du willst, die paar zeilen schreib' ich Dir um. Du mußt das script auch nicht immer wieder neu mit den geplanten tasks starten, man kann es auch durchlaufen und einfach intern pausieren lassen. ich denke, das ist die einfachste methode, daten vom arduino abzuholen.
beachtlich aber, wie verschrien vbs ist. es wurde vom MS entwickelt, um windows-rechner lokal und im netzwerk zu administrieren und natürlich von virenschreibern gleich mal mißbraucht (zb iLoveYou-Letter).
prompt wurde es auch nur einmal (außer von mir) hier runtergeladen. dabei ist es ja klartext, mit rechtsklick>bearbeiten sieht man genau, was es tut, bevor man es mit einem doppelklick ausführt. aber so ist das leben.
gruß stefan
PS: der eisbär wurde mir von einer freundin verpaßt, ihre kleine nichte machte dann den eisebär draus.
eisEbaer:
ja, so ist das leben: dass ich das e einfach überlesen hab.
apropos bären in Wien. da gibz ein köstliches? buch von John Irving, Lasst die Bären los. sehr empfehlenswert.
Zu Deinem angebot, das ich sehr gerne annehme werde.
der prinzipielle ablauf (PHP) funktioniert schon:
$ADCwerteArray = file("http://IP-adresse"); //verbindung zum Arduino und auslesen
$zeile = implode(";",$ADCwerteArray); //als string in CSV-format ausgeben
fwrite ($logdatei, $data . $zeile); // $data sind datum + zeit; logdatei zuvor mit fopen geöffnet
dieses script läuft auf dem PC, am Arduino eine angepasste version des original-webservers von www.arduino.cc
bei diesem bin ich noch nicht sicher, ob er die ADC-werte schon fixfertig als CSV-string ausgeben soll oder mit client.println als array.
zu VB:
ich habs schon einmal angefangen, war mir aber damals zu nervig (damals hab ich BASIC missbraucht). dazwischen liegen bis jetzt TurboPascal, BASCOM, PHP edit: und Arduinoisisch.
lg
Marcel
edit: aber stimmz, dass wenn ich JavaScript in der HTML-seite verwende, ich mir den Apache-server erspare (siehe Eisebaer )?