Wie Variable aus JavaScript in Arduino Code verwenden?

Ich habe einen Webserver, auf der Webseite sind Buttons und Schieberegler. Wenn der Schieberegler bewegt und losgelassen wird soll der Wert direkt Auswirkungen - in dem Fall - auf die Helligkeit der LEDs haben (ohne noch extra einen Submit Button zu betätigen).

Dafür habe ich folgenden Code:

sResponse += "<input type="range" min="0" max="50" value="0" step="5" onchange="showValue(this.value)" />";
sResponse += "<span id="range">0</span>";
sResponse += "<script type="text/javascript">";
sResponse += "function showValue(newValue)";
sResponse += "{";
sResponse += "  var newValue = document.getElementById("range").innerHTML;";
sResponse += "}";
sResponse += "</script>";

In JavaScript habe ich den Wert des Schiebereglers nun in newValue. Aber wie bekomme ich den in eine Arduino Variable(ähnlich: helligkeit=newValue) ?

Wenn das ganze in HTML5, Ajax oder Jquery besser geht, dann kann ich auch dies verwenden.

Ansonsten, gibt es andere Möglichkeiten mein Vorhaben umzusetzen oder benötige ich zwingend einen Submit Button?

Wie wäre es mit dem Submit einer Form?

Gruß Tommy

Sorry bin mit JavaScript nicht so bewandert.
Meinst du vlt. so:
Bei jedem onchange des Schiebereglers ein submit() machen damit die Werte geposted werden. So kann der Webserver das Ergebnis empfangen und ich kann es als Variable verwenden?

Wie finde ich heraus was beim submit() gesendet wird, damit ich im Webserver das entsprechende phrasen und darauf reagieren kann?

Dein Javascript ist ja in einer HTML-Seite drin. In der sollte es einen Form-Bereich geben, in dem Steht, wo der Browser das Ganze hin schicken soll.
Diese Form sollst Du abschicken.

Die HTML-Seite musst Du selbst schreiben bzw. hast Du wohl schon.

Gruß Tommy

hi,

ich möchte jetzt nicht an Deinem sketch weiterbasteln, aber ich kann Dir zeigen, wie ich es mache:

in der zip-datei ist die webduino-library, die mußt Du zu Deinen libraries kopieren (falls Du die nicht schon verwendest).

dann sind da zwei ino-dateien.
webserver_led schaltet nur eine led an pin 3.
webserver_dimmen hat ebenso zwei buttons zum schalten und einen slider, der sofort beim ziehen “feuert”.

Du mußt also eine led an pin 3 (mit widerstand) anschließen, den sketch an Dein netzwerk anpassen (IP-adresse), hochladen und dann in einem browser mit:

ip_adresse/rgb

aufrufen.

beim ein- und ausschalten wird der slider auch an den anfang oder das ende “mitgezogen”.

Du kannst NICHT erwarten, daß Du den slider wirklich ziehen kannst und dann dimmt die LED schön rauf und runter. besser ist es, an die richtige stelle zu tippen (klicken). das liegt daran, daß bei einer normalen http-verbindung für jeden wert des sliders, über den Du “drüberziehst”, eine neue verbindung aufgebaut, der wert gesendet, und die verbindung wieder getrennt wird.
das geht also nicht flüssig und der arduino verschluckt sich irgendann schon mal.

wenn Du das willst, mußt Du einen raspberry pi mit websockets (node.js) verwenden. anleitung:

http://playground.arduino.cc/PmWiki/Haustechnik-Eisebaer

gruß stefan

EDIT: habe grad die dateien neu hochgeladen, war vielleicht eine alte version…

wiki2.zip (43.8 KB)

Die jQueryLibs vom Ursprung einzubinden spart unheimlich Platz, ist aber nicht mit jeder Browsereinstellung kompatibel. Für die eigene Steuerung muss man dann Ausnahmen in die Browserkonfiguration einbauen.
Ich sehe gerade der Code liegt nicht mehr unter google.com. Da wird er von Adblockern wohl auch nicht mehr ausgesperrt.

Das ist aber ein gutes Fundament, auf dem man aufbauen kann.
Schön wäre es, wenn man auf einem ESP8266 einen node.js-Server aufziehen könnte. Da habe ich aber noch nichts gesehen.

Danke für die Beispiele, die kannte ich noch nicht.

Evtl. könnte man im Javascript noch einbauen, dass der Slider erst absendet, wenn er den Focus verliert oder x - Millisekunden nicht bewegt wurde, um den Traffic zu verringern.

Gruß Tommy

hi,

naja, blockiert wird das standardmäßig von keinem browser. das muß schon so eingestellt worden sein (jedenfalls bei mozilla, IE, dolphin und chrome).

und klar, die beispiele konntest Du nicht kennen, ich hab heute meine alte lichtsteuerung ein wenig umgebaut, weil solche fragen immer wieder mal kommen und mir in der firma langweilig war. :slight_smile:

was Du mit focus verlieren oder zeit abwarten meinst, ist noch viel einfacher: bei neueren jquery-mobile-versionen gibt es den event "slidestop", der feuert, wenn man den slider losläßt (bzw. den finger vom touchscreen nimmt). aber dann ist auch ein neuer style dabei und ein bißchen was muß angepasst werden. da ist mir die zeit ausgegangen, genauer gesagt: ich wollte nach hause...

websocket sollte auf einem ESP auch laufen, ich habe beispiele gefunden, aber nicht ausprobiert, weil mir kabellösungen lieber sind und den ESP zu programmieren mit dem ewigen upload viel komplizierter ist als meine jetzige lösung mit raspi.

aber Du kannst Dich ja mal schlau machen und hoffentlich bericht erstatten:

gruß stefan

Danke für die Info.Ich habe meinen ESP seit 2 Tagen und werde irgendwie die Tage anfangen, mich mit ihm zu beschäftigen (wenn die Feiertage und die Besuche rum sind - also eher im neuen Jahr :wink: ).
Das wird also noch etwas dauern. Ich werde aber Bericht erstatten.

Gruß Tommy

hi,

hast Du die zwei beispiele auch ausprobiert? so richtig mit LED? oft hat man auf den eigenen rechnern doch noch was drauf, was einem anderen dann fehlt (ich hab’ zb. heute die beispiele reingestellt und bin dann erst auf einem anderen rechner draufgekommen, daß die webduino-version mit der IDE 1.6.x nicht funktioniert, drum hab’ ich’s dann mit einer neueren version neu reingestellt).

gruß stefan

Ich habe mit dem ESP noch nicht angefangen. Das wird wohl erst nach Neujahr werden.
Jetzt sind erst mal Familintermine in der Prio.

Gruß Tommy

hi,

ich hab' eigentlich gemeint, ob Du MEINE sketches ausprobiert hast. aber egal, wird schon funktionieren.

ein schönes fest mit Deinen lieben,
stefan

Danke für die Beispiele! Konnte sie zwar noch nicht ausprobieren, ist aber ein neuer Denkansatz.
Allerdings hat mein esp01 keine Verbindung zum Internet. Somit müsste ich die ganzen .js Dateien auf den esp01 laden. Damit habe ich noch keine Erfahrung und muss mich erst darin einarbeiten. Hoffe der Platz auf dem esp reicht dafür.
Bevor ich mich daran wage, werde ich doch erst mal noch eine andere Variante versuchen die ohne .js auskommt. Kann ja letztendlich nicht so schwer sein ein Webinterface zu erstellen um ein paar rgb LEDs zu steuern :slight_smile: Größtes Problem stellen die Slider für Geschwindigkeit und Helligkeit dar.

Ich bin derzeit dabei damit zu experimentieren:

<html>
<body>
<input type="range" min="0" max="50" value="0" step="5" onchange="showValue(this.value)" />
<span id="range">0</span>
<script type="text/javascript">
function showValue(newValue)
{
 document.getElementById("range").innerHTML=newValue;
}
</script>
</body>
</html>

Hier das Original: HTML 5 Slider Bar Tutorial

Der Wert des Sliders wird dort erst nach dem loslassen aktualisiert. Wäre doch perfekt für eine rgb led oder?
Muss jetzt nur den Sliderwert in den Arduino Code bekommen. Dazu muss ich wohl bei jedem onchange des Schiebereglers ein submit() machen damit die Werte geposted werden. So kann der Webserver das Ergebnis empfangen und ich kann es als Variable verwenden. Allerdings sind meine Buttons derzeit kein Form, dass muss dann auch erst geändert werden. Für ein Laie in sachen JavaScript und get/post ist das nicht so einfach.

Noch als Ergänzung: Um die jQuery.js-Libs aus dem Netz einzubinden, braucht Dein Arduino keine Internetverbindung.
Der Browser lädt sich die Sachen von code.jquery.com runter. Nur der braucht eine Verbindung zum Internet - was er wohl haben wird :wink:

Gruß Tommy

Stimmt auch wieder 8)

Eisebaer:
hi,

ich hab' eigentlich gemeint, ob Du MEINE sketches ausprobiert hast. aber egal, wird schon funktionieren.

ein schönes fest mit Deinen lieben,
stefan

Hallo Stefan,

da habe ich Dich missverstanden. Ich habe sie jetzt ausprobiert. Sie laufen beide mit IDE 1.6.5.

Gruß Tommy

hi,

danke, man weiß ja nie. und mir ist lieber, jemand wie Du probiert es aus, als ein newbie, der mich dann verflucht, weil ich blöden code reinstelle...

gruß stefan

Ich habe nur 2 Sachen geändert: meine Standard-MAC (damit die Box ihn wieder erkennt) und Ethernet.begin(mac) für DHCP.
Am Anfang bekam ich auch keine Verbindung, aber da saß das Problem wieder mal vorm Monitor - man sollte das Netzwerkkabel rein stecken :wink:

Gruß Tommy

ja, ich find reinstecken auch gut...