Ethernet-Shield und PHP

Hi, ich habe leider nichts nützliches zu meiner Frage gefunden. Ich habe folgendes Ethernet-Shield für den Mega: http://www.ebay.de/itm/400397352919 Ich habe schon zum Testen den Quellcode einer Seite im Serial-Monitor anzeigen lassen und einen kleinen Webserver gehostet.

Wie kann ich nun z.B. per HTML-Formular auf dem Webserver eine LED an und aus machen?

hi,

auf den arduino laden, vorher eventuell die IP anpassen. geht nur mit internetzugang und sieht auf einem smartphone/tablet gut aus, weil jquery mobile.

downloaden und installieren der library: http://code.google.com/p/webduino/downloads/list

mit 192.168.2.153/rgb (oder angepasst) aufrufen. die oberen beiden knöpfe schalten die led auf dem arduino ein und aus. mußt unter den ethernetshield reingucken.

gruß stefan

Danke schonmal, aber welches Beispiel meinst du?

ööööhh…

steuerung_test13.ino (4.17 KB)

Cool, danke funktioniert. Haste zufällig noch ein ganz einfaches Beispiel ohne JQuery?

hi,

nein, ich wollte jquery, weil es zuverlässig auf verschiedenen browsern läuft und eine bibliothek für mobiles hat (die in diesem beispiel seltsam implementiert ist, hab ich auch nur übernommen, muß ich bei gelegenheit mal sauber umschreiben. aber wenn was funktioniert, fehlt halt der antrieb). ajax war mir wichtig, weil ich keine formulare mit neuem seitenaufbau nach jedem senden wollte.

gruß stefan

Achso. Kennt jemand ne Möglichkeit wie man mit ganz normalen PHP-Datein und Formularen, die man dann auf der MicroSD abspeichert, arbeiten kann?

PHP gibt es für den Arduino nicht. PHP ist ein mehrere MB großer Interpreter, der in der Regel als Modul und einen noch größeren Webserver eingebettet ist. Dein Arudino Mega hat gerade mal 8 KB RAM und 256KB Flash. Oder willst Du PHP Scripte auf einem externen Webserver haben, der dann dem Arduino sagt, was genau er schalten soll? Falls Du das meinst, dann schau Dir mal folgenden Thread an: http://arduino.cc/forum/index.php/topic,102817.0.html Da ging es nämlich genau darum, wie ein PHP-Script möglichst effektiv einen Arduino per TCP steuern kann. Mario.

Ich habe am letzten Sonntag noch per Netzwerk meine LED Strip angesteuert. Dazu habe ich auf meinem Heimrechner einen kleinen Webserver am laufen:

Bei dem Beispiel muss man beachten das ich kein Ethernet-Shield verwende (zu teuer) sondern einen Ethernet-Seriell Wandler für 15 €

PHP/HTML Code:

<?php
//gültige kombinationen der internetseite
$ary = array("kino=fade_on", "kino=fade_off"); 

//socket verbindung
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 
socket_connect($socket, '192.168.178.50', 20108) or die("connect!");

// get parameter von der internetseite
if(isset($_GET['mode']) && in_array($_GET['mode'], $ary)) 
{
    //parameter an arduino übertragen
    socket_write($socket, $_GET['mode']."\0") or die("write"); 
    //antwort abwarten, (der controller sendet ein 'ack' als bestätigung)
    $data = @socket_read($socket, 1024, PHP_NORMAL_READ); 
}

// antwort aus testzwecken ausgeben
echo $data.'
';
//socket schließen
socket_close($socket);
?>
<html>
<head>

</head>
<body style="background-color: #111;">
<center>
<p style="width:100%; height:400px; border: 1px solid #999; background-color:#555; color: #ccc; font-family: verdana; font-size: 56px;">
<b><u>Home Kontrol Version 0.1</u></b>




<a href="?mode=kino=fade_off">Kino Film start</a>

<a href="?mode=kino=fade_on">Kino Film ende</a>

</p>

</center>

</body>
</html>

Arduino Code zum auslesen der Seriellen schnittstelle

//globals
String netData_input = "";
boolean netData_ready = false;

void net_setSettings(String var, String value)
{  
  if(var == "kino") {
    
    if(value == "fade_on") {
      //mach irgendwas um das licht einzuschalten
    }
    else if(value == "fade_off") {
      // mach irgendwas um das licht auszuschalten
    }
  } 
}
void net_workWithNewData()
{  
  boolean  var_mode = true;
  String   var_name = "";
  String   var_content = "";
  var_name.reserve(50);
  var_content.reserve(50);
    
  for(int i=0; i<netData_input.length();i++) 
  {    
    char charAt = netData_input.charAt(i);
   
    switch(charAt)
    {
      case '&':
        if(var_name.length() > 0) {
          net_setSettings(var_name, var_content);          
        }
        
        var_name = "";
        var_content = "";
        var_mode = true;
        
        break;
      case '=':
        
        var_mode = false;
        
        break;
      default:
        
        if(var_mode == false) {
          var_content += charAt;
        } else {
          var_name += charAt;
        }
        break;
    }
  }
  if(var_name.length() > 0) {
    net_setSettings(var_name, var_content);          
  } 
  
  Serial.println("ack");
  netData_input = "";
  netData_ready = false;   
}



void net_checkNewData()
{
  while(Serial.available()) 
  {    
    char inChar = (char)Serial.read(); 
    if(inChar == '\0') 
    {            
      netData_ready = true;
      break;      
    }
    if(netData_input.length() < 199) {        
      netData_input += inChar;      
    } else {
      break;
    }  
  }

  if (netData_ready == true) {   
    
    
    net_workWithNewData();
  }
}


void loop()
{
    net_checkNewData();
}

Ja, so ließe es sich gut lösen. Danke. Ich werd mal versuchen, im Laufe der nächsten Woche eine eigene Variante zu entwickeln.

Hi. Ich habe dasselbe Shield gekauft. Heute wollte ich es ausprobieren aber ich komme da nicht weiter. Ich habe Beispiel Sketch probiert und andere aus dem Netz aber nix funktioniert. Wenn ich im Browser 192.168.178.177 eingebe, kann keine Verbindung hergestellt werden. Beim Rj45 anschluss müsste ja auch gelbe LED leuchten, passiert aber nichts. Wie kann ich herausfinden welche MAC adresse ich nehmen soll?

Ich habe auch webduino probiert und nix geht

Welche lokale IP hat dein Rechner denn? Ich würde abhängig von deiner Router-Konfiguration eine IP wie z.B. 192.168.x.y nehmen, wobei x die gleiche Zahl wie bei deiner lokalen IP sein muss und y eine noch nicht verwendete Zahl in dem im Router eingestellten Wertebereich (max. 0-255).

Fritzbox hat die 192.168.178.1

Rechner hat .175

Die Gelbe Led sollte leuchten sobald du das Netzwerkkabel mit der Fritzbox verbindest. Wenn hier etwas nicht leuchtete, stimmt etwas mit der Hardware oder dem Netzwerkstack nicht. Überprüf das zuerst.

hi,

wenn sonst keine geräte dranhängen, die 177 haben könnten, ist das ok.
unter windows mußt Du die firewall abschalten.
wenn die verbindung dann geht, kannst Du sie wieder aufdrehen und versuchen, sie so zu konfigurieren, daß es geht. aber erstmal verbindung ohne firewall, um andere fehler auszuschließen.

gruß stefan

Es leuchtet die Grüne LED. Wenn aber Datentransfer besteht, dann sollte eine Gelbe LED blinken oder leuchten, oder etwa nicht?

Ich benutze Mac und Arduino 1.0.3

Ich habe ein Router als Repeater eingerichtet, über PC läuft das ganze auch. Muss es dann auch mit dem Shield gehen?

Ich habe die Methode mit der Kommunikation über den Port 23 verwendet. Klappt gut. Danke! :)

Jomelo:
Ich habe am letzten Sonntag noch per Netzwerk meine LED Strip angesteuert. Dazu habe ich auf meinem Heimrechner einen kleinen Webserver am laufen:

Bei dem Beispiel muss man beachten das ich kein Ethernet-Shield verwende (zu teuer) sondern einen Ethernet-Seriell Wandler für 15 €

PHP/HTML Code:

<?php

//gültige kombinationen der internetseite
$ary = array(“kino=fade_on”, “kino=fade_off”);

//socket verbindung
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die(“Could not create socket\n”);
socket_connect($socket, ‘192.168.178.50’, 20108) or die(“connect!”);

// get parameter von der internetseite
if(isset($_GET[‘mode’]) && in_array($_GET[‘mode’], $ary))
{
   //parameter an arduino übertragen
   socket_write($socket, $_GET[‘mode’]."\0") or die(“write”);
   //antwort abwarten, (der controller sendet ein ‘ack’ als bestätigung)
   $data = @socket_read($socket, 1024, PHP_NORMAL_READ);
}

// antwort aus testzwecken ausgeben
echo $data.’
';
//socket schließen
socket_close($socket);
?>

Home Kontrol Version 0.1

Kino Film start

Kino Film ende

> ``` > > > > Arduino Code zum auslesen der Seriellen schnittstelle > > > ``` > //globals String netData_input = ""; boolean netData_ready = false;

void net_setSettings(String var, String value)
{  
 if(var == “kino”) {
   
   if(value == “fade_on”) {
     //mach irgendwas um das licht einzuschalten
   }
   else if(value == “fade_off”) {
     // mach irgendwas um das licht auszuschalten
   }
 }
}
void net_workWithNewData()
{  
 boolean  var_mode = true;
 String   var_name = “”;
 String   var_content = “”;
 var_name.reserve(50);
 var_content.reserve(50);
   
 for(int i=0; i<netData_input.length();i++)
 {    
   char charAt = netData_input.charAt(i);
 
   switch(charAt)
   {
     case ‘&’:
       if(var_name.length() > 0) {
         net_setSettings(var_name, var_content);          
       }
       
       var_name = “”;
       var_content = “”;
       var_mode = true;
       
       break;
     case ‘=’:
       
       var_mode = false;
       
       break;
     default:
       
       if(var_mode == false) {
         var_content += charAt;
       } else {
         var_name += charAt;
       }
       break;
   }
 }
 if(var_name.length() > 0) {
   net_setSettings(var_name, var_content);          
 }
 
 Serial.println(“ack”);
 netData_input = “”;
 netData_ready = false;  
}

void net_checkNewData()
{
 while(Serial.available())
 {    
   char inChar = (char)Serial.read();
   if(inChar == ‘\0’)
   {            
     netData_ready = true;
     break;      
   }
   if(netData_input.length() < 199) {        
     netData_input += inChar;      
   } else {
     break;
   }  
 }

if (netData_ready == true) {  
   
   
   net_workWithNewData();
 }
}

void loop()
{
   net_checkNewData();
}

Hi. Ich habe mal den Sketch getestet, irgendwie funkt da nix.

#include <SPI.h>
#include <Ethernet.h>

#define led6 6
#define led5 5

// 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);
EthernetServer server(23); // port 23

void setup() {
  pinMode(led6, OUTPUT);
  pinMode(led5, OUTPUT);
  //Ethernet initialisieren
  Ethernet.begin(mac, ip, gateway, subnet);
  // Server starten
  server.begin();
}

//globals
String netData_input = "";
boolean netData_ready = false;

void net_setSettings(String var, String value)
{  
  if(var == "kino") {
    
    if(value == "fade_on") {
      //mach irgendwas um das licht einzuschalten
      digitalWrite(led5, HIGH);
      Serial.println("an");
    }
    else if(value == "fade_off") {
      // mach irgendwas um das licht auszuschalten
      digitalWrite(led5, LOW);
      Serial.println("aus");
    }
  } 
}
void net_workWithNewData()
{  
  boolean  var_mode = true;
  String   var_name = "";
  String   var_content = "";
  var_name.reserve(50);
  var_content.reserve(50);
    
  for(int i=0; i<netData_input.length();i++) 
  {    
    char charAt = netData_input.charAt(i);
   
    switch(charAt)
    {
      case '&':
        if(var_name.length() > 0) {
          net_setSettings(var_name, var_content);          
        }
        
        var_name = "";
        var_content = "";
        var_mode = true;
        
        break;
      case '=':
        
        var_mode = false;
        
        break;
      default:
        
        if(var_mode == false) {
          var_content += charAt;
        } else {
          var_name += charAt;
        }
        break;
    }
  }
  if(var_name.length() > 0) {
    net_setSettings(var_name, var_content);          
  } 
  
  Serial.println("ack");
  netData_input = "";
  netData_ready = false;   
}



void net_checkNewData()
{
  while(Serial.available()) 
  {    
    char inChar = (char)Serial.read(); 
    if(inChar == '\0') 
    {            
      netData_ready = true;
      break;      
    }
    if(netData_input.length() < 199) {        
      netData_input += inChar;      
    } else {
      break;
    }  
  }

  if (netData_ready == true) {   
    
    
    net_workWithNewData();
  }
}


void loop()
{EthernetClient client = server.available(); // auf eine eingehende Verbindung warten
    net_checkNewData();
    client.flush();
       //damit daten sicher gesendet werden.
    delay(10);
    //client verbindung beenden
    client.stop();
}

In test.php datei habe ich den Port auf 23 auch gesetzt. Verbindung ist zwar da aber die LED auf Pin 5 schaltet nicht. Warum?

Nimm das hier: http://arduino.cc/forum/index.php/topic,102817.45.html

Habe ich schon getestet, ich möchte aber kein php sondern Jquery benutzen. Sieht schöner aus auf dem iPhone. Gibt es eine Möglichkeit das ganze ohne php zu machen?

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

</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>
  <div data-role="fieldcontain">
    <label for="flipswitch">OPTION:</label>
    <select name="flipswitch" id="flipswitch" data-role="slider">
      <option value="off">Aus</option>
      <option value="on">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="footer">
		<h4>Fußzeile</h4>
	</div>
</div>


</body>

</html>