Pages: 1 2 [3]   Go Down
Author Topic: Ethernet-Shield und PHP  (Read 5041 times)
0 Members and 1 Guest are viewing this topic.
Wien
Online Online
Edison Member
*
Karma: 27
Posts: 1849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

bei meinem code (der eben auf einem arduino direkt gehostet ist) wird beim drücken des buttons geschalten. da gibt es kein eigenes "senden".

Quote
Wie macht man es mit Jquery, wenn ich eine Option gewählt habe, dass ich dann nicht auf Senden oder Set klicken muss? Dass es schon gleich gesendet wird wenn andere Option gewählt wurde. Kann jemand ein Beispiel geben?

oder meinst Du mit "option" auswahlfelder  in html? oder radiobuttons?
in solchen fällen mußt Du in meiner seite dort ansetzen>
Code:
"$('#halb, #alles, #tisch, #schreibtisch, #tv, #aus').bind('click', function(event, ui)
an die buttons ist der event "click" angebunden, bei optionsfeldern egal welcher art mußt Du den event "change" verwenden. ob "click" auch bei option-tags funktioniert, kann ich nicht sagen...

gruß stefan

gruß stefan
Logged

Cloppenburg
Offline Offline
Edison Member
*
Karma: 28
Posts: 1082
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Genau, dein Arduino ist der Server, ich will den Arduino möglichst frei halten für andere funktionen deswegen soll der html code auf dem Lokalen Server hin. Mit option meine ich radiobutton oder auswahlfelder.
« Last Edit: March 12, 2013, 08:01:56 pm by skorpi08 » Logged

Nicht Mensch, nicht Tier: Programmierer halt...

Cloppenburg
Offline Offline
Edison Member
*
Karma: 28
Posts: 1082
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Moin Stefan. Kannst du mir hier weiterhelfen?! Wenn man bei Licht den Schalter betätigt, passiert da noch nix weil die Abfrage nicht gesendet wurde. Dieses echo "checked" in php code da wo der Schalter erstellt ist, gibt ja nur ein Signal, da ist es egal ob checked oder change steht, richtig? In deinem Fall hast du so ein .click, hier ist es aber nicht. Wie kann man es hinkriegen dass die Abfrage ohne Bestätigung abgeschickt wird?

Code:

<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'><meta name='apple-mobile-web-app-capable' content='yes' />
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
<meta name='viewport' content='width=device-width, user-scalable=no'>
<title>Haus-Steuerung</title>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css" />
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
<?php

$arduino_ip
="192.168.178.177";
$arduino_port="23";

function 
arduino_send($ip,$port,$command) {
    
$res fsockopen($ip,$port);
    if(
$res) {
        
fwrite($res,$command);
        
$ret =fread($res,1);
        echo 
"arduino_send() returned = $ret <br>\n";
        return 
$ret;
    } else {
        echo 
"Fehler, Kommando konnte nicht abgesetzt werden";
    }
}

if(isset(
$_POST['led1'])) {
    
//übergebenen Wert speichern.
    
$led1 $_POST['led1'];
    
//Wert an Arduino (Pin 9) senden
    
arduino_send($arduino_ip,$arduino_port,chr(7).chr($led1));
} else {
    
//else-Zweig wird aufgerufen, wenn keine Daten per POST übermittelt wurden.
   //daher daten vom Arduino (Pin 9) lesen und in $led1 speichern
    
$led1 arduino_send($arduino_ip,$arduino_port,chr(7).chr(0));
}

?>


</head>
<body>

<div data-role="page" id="page">
<div data-role="header">
<h1>Wohnzimmer</h1>
</div>
  <div data-role="content">
<ul data-role="listview">
<li><a href="#page2">Licht</a></li>
            <li><a href="#page3">Heizung</a></li>
<li><a href="#page4">Rolladen</a></li>
</ul>
</div>
<div data-role="footer">
 <h4>Küche</h4>
  </div>
</div>
<div data-role="page" id="page2">
  <div data-role="header">
    <h1>Licht</h1>
  </div>
      <div data-role="content"></div>
      <form method="POST" action="<?php echo $PHP_SELF ?>">
    <select name="led1" id="led1" data-role="slider">
      <option value="0">Aus</option><?php if($led1==0) echo "checked" ?>
      <option value="1">Ein</option><?php if($led1==1) echo "checked" ?>
    </select>
      <input type="submit" name="submit" value="Abschicken">
</form>
    </div>
 
</div>



<div data-role="page" id="page3">
<div data-role="header">
<h1>Heizung</h1>
</div>
<div data-role="content">
Inhalt
</div>
<div data-role="footer">
<h4>Fußzeile</h4>
</div>
</div>

<div data-role="page" id="page4">
<div data-role="header">
<h1>Rolladen</h1>
</div>
<div data-role="content">
      <div data-role="fieldcontain">
        <label for="selectmenu" class="select">Optionen:</label>
        <select name="selectmenu" id="selectmenu">
          <option value="option1">OPTION 1</option>
          <option value="option2">OPTION 2</option>
          <option value="option3">OPTION 3</option>
        </select>
      </div>
    </div>
<div data-role="fieldcontain">
 <label for="slider">Wert:</label>
 <input type="range" name="slider" id="slider" value="0" min="0" max="100" />
  </div>
<div data-role="fieldcontain">
 <fieldset data-role="controlgroup">
   <legend>OPTION</legend>
   <input type="checkbox" name="checkbox1" id="checkbox1_0" class="custom" value="" />
   <label for="checkbox1_0">OPTION</label>
   <input type="checkbox" name="checkbox1" id="checkbox1_1" class="custom" value="" />
   <label for="checkbox1_1">OPTION</label>
   <input type="checkbox" name="checkbox1" id="checkbox1_2" class="custom" value="" />
   <label for="checkbox1_2">OPTION</label>
      </fieldset>
  </div>
<div data-role="fieldcontain">
 <label for="flipswitch2">OPTION:</label>
 <select name="flipswitch2" id="flipswitch2" data-role="slider">
   <option value="off">Aus</option>
   <option value="on">Ein</option>
      </select>
  </div>
    
<div data-role="footer">
 <h4>Fußzeile</h4>
</div>
</div>


</body>

</html>

Sketch:
Code:
#include <SPI.h>
#include <Ethernet.h>

// MAC und IP Konfiguration
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xEE, 0xF3 };
IPAddress ip(192,168,178,177);
IPAddress gateway(192,168,178, 1);
IPAddress subnet(255, 255, 255, 0);
// warten auf port 23
EthernetServer server(23);

byte returnvalue;

void setup() {
  //Ethernet initialisieren
    Ethernet.begin(mac, ip, gateway, subnet);
  // Server starten
  server.begin();
  // serielle konsole öffnen (debug)
 
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);

}

void loop()
{
// auf eine eingehende Verbindung warten
  EthernetClient client = server.available();
  
  if (client)
  {
  
    byte pinnumber = client.read();
    byte pinvalue = client.read();
    byte returnvalue = 0;
    
    //Kommando auswerten
    
      if(pinnumber!=0)
      {
        if(pinvalue==0)
        {
          digitalWrite(pinnumber,LOW);
          returnvalue = 0;
        }
        else if(pinvalue==1)
        {
          digitalWrite(pinnumber,HIGH);
          returnvalue = 1;
        }
      }
      
    
    // rückantwort senden (1 byte) die "+48" sorgen dafür das der Wert 0 oder 1
    // als Zeichen "0" oder "1" übertragen werden.
    //das vereinfacht die verarbeitung in php.
    client.write(returnvalue+48);
    
    //übertragung erzwingen
    client.flush();
    
    //10ms delay damit daten sicher gesendet werden.
    delay(10);
    
    //wichtg! client verbindung beenden
    client.stop();
  }
}
« Last Edit: March 12, 2013, 08:46:50 pm by skorpi08 » Logged

Nicht Mensch, nicht Tier: Programmierer halt...

Wien
Online Online
Edison Member
*
Karma: 27
Posts: 1849
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

so, jetzt wird beim starten des sliders beim licht eine javascript-function angestossen, die die überschrift ändert.
sollte sich auch mit php machen lassen, aber dazu fehlt mir der server.

gruß stefan

Code:
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'><meta name='apple-mobile-web-app-capable' content='yes' />
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
<meta name='viewport' content='width=device-width, user-scalable=no'>
<title>Haus-Steuerung</title>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css" />
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
<?php

$arduino_ip
="192.168.178.177";
$arduino_port="23";

function 
arduino_send($ip,$port,$command) {
    
$res fsockopen($ip,$port);
    if(
$res) {
        
fwrite($res,$command);
        
$ret =fread($res,1);
        echo 
"arduino_send() returned = $ret <br>\n";
        return 
$ret;
    } else {
        echo 
"Fehler, Kommando konnte nicht abgesetzt werden";
    }
}

if(isset(
$_POST['led1'])) {
    
//übergebenen Wert speichern.
    
$led1 $_POST['led1'];
    
//Wert an Arduino (Pin 9) senden
    
arduino_send($arduino_ip,$arduino_port,chr(7).chr($led1));
} else {
    
//else-Zweig wird aufgerufen, wenn keine Daten per POST übermittelt wurden.
   //daher daten vom Arduino (Pin 9) lesen und in $led1 speichern
    
$led1 arduino_send($arduino_ip,$arduino_port,chr(7).chr(0));
}

?>

<script type="text/javascript">
$().ready(function(){
$('#slider1').bind({
    slidestart  : function(event,ui) {
document.getElementById("hh").innerHTML="www";
}

}).slider();
});
</script>
</head>
<body>

<div data-role="page" id="page">
<div data-role="header">
<h1>Wohnzimmer</h1>
</div>
  <div data-role="content">
<ul data-role="listview">
<li><a href="#page2">Licht</a></li>
            <li><a href="#page3">Heizung</a></li>
<li><a href="#page4">Rolladen</a></li>
</ul>
</div>
<div data-role="footer">
<h4>Küche</h4>
  </div>
</div>
<div data-role="page" id="page2" style="background-color='#555555'">
  <div data-role="header" id="hh">
    Licht
  </div>
    <div data-role="content"></div>
    <select id="slider1" data-role="slider">
      <option value="0">Aus</option>
      <option value="1">Ein</option>
    </select>
    </div>
 
</div>



<div data-role="page" id="page3">
<div data-role="header">
<h1>Heizung</h1>
</div>
<div data-role="content">
Inhalt
</div>
<div data-role="footer">
<h4>Fußzeile</h4>
</div>
</div>

<div data-role="page" id="page4">
<div data-role="header">
<h1>Rolladen</h1>
</div>
<div data-role="content">
      <div data-role="fieldcontain">
        <label for="selectmenu" class="select">Optionen:</label>
        <select name="selectmenu" id="selectmenu">
          <option value="option1">OPTION 1</option>
          <option value="option2">OPTION 2</option>
          <option value="option3">OPTION 3</option>
        </select>
      </div>
    </div>
<div data-role="fieldcontain">
<label for="slider">Wert:</label>
<input type="range" name="slider" id="slider" value="0" min="0" max="100" />
  </div>
<div data-role="fieldcontain">
<fieldset data-role="controlgroup">
   <legend>OPTION</legend>
   <input type="checkbox" name="checkbox1" id="checkbox1_0" class="custom" value="" />
   <label for="checkbox1_0">OPTION</label>
   <input type="checkbox" name="checkbox1" id="checkbox1_1" class="custom" value="" />
   <label for="checkbox1_1">OPTION</label>
   <input type="checkbox" name="checkbox1" id="checkbox1_2" class="custom" value="" />
   <label for="checkbox1_2">OPTION</label>
      </fieldset>
  </div>
<div data-role="fieldcontain">
<label for="flipswitch2">OPTION:</label>
<select name="flipswitch2" id="flipswitch2" data-role="slider">
   <option value="off">Aus</option>
   <option value="on">Ein</option>
      </select>
  </div>
   
<div data-role="footer">
<h4>Fußzeile</h4>
</div>
</div>


</body>

</html>

Logged

Cloppenburg
Offline Offline
Edison Member
*
Karma: 28
Posts: 1082
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hmm... dass es zusammen mit PHP arbeitet hab ich noch nicht hinbekommen, fals jemand ein Vorschlag hat, einfach Posten  smiley-lol
Logged

Nicht Mensch, nicht Tier: Programmierer halt...

Cloppenburg
Offline Offline
Edison Member
*
Karma: 28
Posts: 1082
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Soooo.... fals es mal jemand gebrauchen kann....

Code:
<script type="text/javascript">

$(document).ready(function () {
    $("#slider1").change(function () {
        var led1 = $("#slider1").val();
        if (led1 == "1") {
$("#slider1").submit();
        } else {
          $("#slider1").submit();
        }
    });
});
</script>

So gehts auch...
Code:
$(document).ready(function () {
    $("#slider1").change(function () {
        $("#slider1").submit();
    });
});

Und die nächste Frage.... Wenn man da auf ON oder OFF umschaltet, ladet der ja die seite neu und springt wieder zur Startseite, was nicht der sinn der sache ist. Wenn man die Seite neu ladet, sind die Einstellungen nicht gespeichert. Jemand dazu ein Vorschlag?
« Last Edit: March 13, 2013, 05:39:12 pm by skorpi08 » Logged

Nicht Mensch, nicht Tier: Programmierer halt...

Stendal, D
Offline Offline
Newbie
*
Karma: 4
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ist doch das Beispiel hier:

Code:
#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"

static uint8_t mac[6] = { 0x02, 0xAA, 0xBC, 0xCC, 0x11, 0x22 };
static uint8_t ip[4] = { 192, 168, 2, 153 };

#define PREFIX "/rgb"
WebServer webserver(PREFIX, 80);

int licht = 0;
const int latchPin = 5;
const int clockPin = 7;
const int dataPin = 6;
const int led13 = 13;
bool neu = true;
byte register1 = 0;
byte register2 = 0;
byte register3 = 0;
byte register4 = 0;

void rgbCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  if (type == WebServer::POST)
  {
    bool repeat;
    char name[16], value[16];
    do
    {
      repeat = server.readPOSTparam(name, 16, value, 16);
      if (strcmp(name, "licht") == 0)
      {
        neu = true;
        licht = strtoul(value, NULL, 10);
      }
    } while (repeat);
   
    server.httpSeeOther(PREFIX);
    return;
  }

  server.httpSuccess();

  if (type == WebServer::GET) {
    P(message) =
"<!DOCTYPE html><html>\n"
"<head>\n"
"<meta charset='utf-8'><meta name='apple-mobile-web-app-capable' content='yes' />\n"
"<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>\n"
"<meta name='viewport' content='width=device-width, user-scalable=no'>\n"
"<title>Webduino RGB</title>\n"
"<link rel='stylesheet'href='http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.css' />\n"
"<script src='http://code.jquery.com/jquery-1.6.4.min.js'></script>\n"
"<script src='http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.js'></script>\n"
"<style> body, .ui-page { background: black; } .ui-body { padding-bottom: 1.5em; } div.ui-slider { width: 88%; } #halb, #alles, #tisch, #schreibtisch, #tv, #aus { display: block; margin: 10px; } </style>\n"
"<script>\n"
    "$(document).ready(function(){ \n"
"$('#halb, #alles, #tisch, #schreibtisch, #tv, #aus').knopf; \n"
"$('#halb, #alles, #tisch, #schreibtisch, #tv, #aus').bind('click', function(event, ui) { \n"
"jQuery.ajaxSetup({timeout: 110}); \n"
"var id = $(this).attr('id'); \n"
"if (id == 'halb')          $.post('/rgb', { licht: '1' } ); \n"
"if (id == 'alles')         $.post('/rgb', { licht: '2' } ); \n"
"if (id == 'tisch')         $.post('/rgb', { licht: '3' } ); \n"
"if (id == 'schreibtisch')  $.post('/rgb', { licht: '4' } ); \n"
"if (id == 'tv')            $.post('/rgb', { licht: '5' } ); \n"
"if (id == 'aus')           $.post('/rgb', { licht: '6' } ); \n"
"}); \n"
"});\n"
"</script>\n"
"</head>\n"
"<body>\n"
  "<div data-role='header' data-position='inline'><h1>Licht Wohnzimmer</h1></div>\n"
    "<div class='ui-body ui-body-a'>\n"
      "<input type='button' name='knopf' id='halb' value='Halb' />\n"
      "<input type='button' name='knopf' id='alles' value='Alles' />\n"
      "<input type='button' name='knopf' id='tisch' value='Tisch' />\n"
      "<input type='button' name='knopf' id='schreibtisch' value='Schreibtisch' />\n"
      "<input type='button' name='knopf' id='tv' value='TV' />\n"
      "<input type='button' name='knopf' id='aus' value='Aus' />\n"
    "</div>\n"
  "</body>\n"
"</html>\n";
server.printP(message);
  }
}

void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT); 
pinMode(clockPin, OUTPUT);
pinMode(led13, OUTPUT);

Ethernet.begin(mac, ip);
webserver.setDefaultCommand(&rgbCmd);
webserver.begin();
}

void loop()
{
  webserver.processConnection();
  if (neu == true) {
if (licht == 1) {
        digitalWrite(led13, HIGH);
}
if (licht == 2) {
        digitalWrite(led13, LOW);
}
if (licht == 3) {
register1 = 0b00000111;
register2 = 0b00110101;
register3 = 0b00000000;
register4 = 0b00000001;
}
if (licht == 4) {
register1 = 0b11000101;
register2 = 0b00000000;
register3 = 0b00000000;
register4 = 0b00000001;
}
if (licht == 5) {
register1 = 0b00010000;
register2 = 0b00010110;
register3 = 0b00010001;
register4 = 0b00100100;
}
if (licht == 6) {
register1 = 0b00000000;
register2 = 0b00000000;
register3 = 0b00000000;
register4 = 0b00000000;
}
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, register4);
shiftOut(dataPin, clockPin, MSBFIRST, register3);
shiftOut(dataPin, clockPin, MSBFIRST, register2);
shiftOut(dataPin, clockPin, MSBFIRST, register1);
digitalWrite(latchPin, HIGH);

neu = false;
  }
}

Hat es schon jemand hinbekommen das Ganze auf die SD-Karte auszulagern, mit den entsprechenden JS- und CSS-Dateien, so dass das auch noch ohne Internet funktioniert und dass auch noch POST-Anfragen gesendet werden wenn die Html-Datei von Karte geladen wird?

Daran scheitert es bei mir.
Sitze jetzt schon fast ne Woche an allen möglichen Kombinationen, bekomme es aber einfach nicht hin.
Entweder wird der Style nachgeladen, aber es wird nichts zum Arduino gesendet beim Drücken der Buttons,
oder der Style sieht nach "normalem" Html aus und es werden Anfragen gepostet...
oder eben.... "normales" Html und keine Anfragen. smiley-sad

Bin langsam am Verzweifeln
Logged

Cloppenburg
Offline Offline
Edison Member
*
Karma: 28
Posts: 1082
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

http://forum.arduino.cc/index.php?topic=56928.15
Nimm hier das Beispiel * BlinkLed5_new.zip
Logged

Nicht Mensch, nicht Tier: Programmierer halt...

Stendal, D
Offline Offline
Newbie
*
Karma: 4
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://forum.arduino.cc/index.php?topic=56928.15
Nimm hier das Beispiel * BlinkLed5_new.zip

Kann es sein dass mit meinen Libs was nicht stimmt? :

Code:
core.a(wiring_digital.c.o):(.progmem.data+0x94): multiple definition of `digital_pin_to_bit_mask_PGM'
Pins_arduino\pins_arduino.c.o:(.progmem.data+0x94): first defined here
m:/hardware/arduino/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions
core.a(wiring_digital.c.o):(.progmem.data+0x4e): multiple definition of `digital_pin_to_port_PGM'
Pins_arduino\pins_arduino.c.o:(.progmem.data+0x4e): first defined here
core.a(wiring_digital.c.o):(.progmem.data+0x0): multiple definition of `port_to_mode_PGM'
Pins_arduino\pins_arduino.c.o:(.progmem.data+0x0): first defined here
core.a(wiring_digital.c.o):(.progmem.data+0x1a): multiple definition of `port_to_output_PGM'
Pins_arduino\pins_arduino.c.o:(.progmem.data+0x1a): first defined here
core.a(wiring_digital.c.o):(.progmem.data+0xda): multiple definition of `digital_pin_to_timer_PGM'
Pins_arduino\pins_arduino.c.o:(.progmem.data+0xda): first defined here
core.a(wiring_digital.c.o):(.progmem.data+0x34): multiple definition of `port_to_input_PGM'
Pins_arduino\pins_arduino.c.o:(.progmem.data+0x34): first defined here


[Nachtrag] Habs herausgefunden: Ich muss das "<pins_arduino.h>" durch "Arduino.h" ersetzen.[/Edit]
« Last Edit: October 16, 2013, 12:36:29 am by Moko » Logged

Pages: 1 2 [3]   Go Up
Jump to: