Go Down

Topic: Ethernet-Shield und PHP (Read 6183 times) previous topic - next topic

Eisebaer

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: [Select]
"$('#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

skorpi08

#31
Mar 10, 2013, 06:51 pm Last Edit: Mar 13, 2013, 02:01 am by skorpi08 Reason: 1
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.
Nicht Mensch, nicht Tier: Programmierer halt...

skorpi08

#32
Mar 13, 2013, 02:00 am Last Edit: Mar 13, 2013, 02:46 am by skorpi08 Reason: 1
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: [Select]


<!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: [Select]
#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();
 }
}
Nicht Mensch, nicht Tier: Programmierer halt...

Eisebaer

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: [Select]

<!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>



skorpi08

Hmm... dass es zusammen mit PHP arbeitet hab ich noch nicht hinbekommen, fals jemand ein Vorschlag hat, einfach Posten  XD
Nicht Mensch, nicht Tier: Programmierer halt...

skorpi08

#35
Mar 13, 2013, 11:17 pm Last Edit: Mar 13, 2013, 11:39 pm by skorpi08 Reason: 1
Soooo.... fals es mal jemand gebrauchen kann....

Code: [Select]

<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: [Select]
$(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?
Nicht Mensch, nicht Tier: Programmierer halt...

Moko


Das ist doch das Beispiel hier:

Code: [Select]
#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. :(

Bin langsam am Verzweifeln

skorpi08

http://forum.arduino.cc/index.php?topic=56928.15
Nimm hier das Beispiel * BlinkLed5_new.zip
Nicht Mensch, nicht Tier: Programmierer halt...

Moko

#38
Oct 15, 2013, 10:37 pm Last Edit: Oct 16, 2013, 07:36 am by Moko Reason: 1

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: [Select]
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]

Go Up