Ethernet-Shield und PHP

öööö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! :slight_smile:

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>

hi,

bitte nicht jquery mit php gleichsetzen.
jquery ist eine library, die auf dem CLIENT (PC, tablet, smartphone) viele dinge vereinfacht, unter anderem auch XMLHttpRequests, in den letzten jahren oft AJAX genannt.

php ist eine sprache, die SERVERSEITIG (PC) dinge auf eben diesem server ausführt.
was Dir an ajax gefällt, ist die möglichkeit, requests an den server zu senden, ohne daß danach die seite auf dem tablet neu aufgebaut wird (das ging schon, lange bevor jquery ein baby war, aber damit ist es halt einfacher). außerdem bietet jquery den einfachen aufbau von seiten, die speziell auf mobiles abgestimmt sind. aber auch das ist keine sache, die jquery benötigt, es wird nur einfacher.

auf jeden fall brauchst Du einen server, der reagiert und eventuell antwortet. das kann ein pc sein, auf dem ein webserver läuft und zb php installiert ist, oder eben einen arduino, der auch ein webserver sein kann (wie in dem beispiel von mir in diesem thread).
auf dem arduino läuft eine ähnliche sache wie php, nur hat das halt keinen namen.
Du mußt Dir wirklich darüber klar werden, was was ist und was wo läuft, sonst rennst Du immer wieder gegen unnötige wände.

gruß stefan

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

Ethernet Shield zu teuer? Guck mal bei eBay. Da gehen die ab 8EUR (inkl Versand) los. Ok - ist aus China, muss man ein bischen warten

Moin Stefan. Was php ist weiß ich da ich eine Wordpress Website habe. Wie ich jetzt verstanden habe, gibt es keine Möglichkeit Jquery ohne php zu nutzen? Webduino habe ich getestet, da wird ja der html code in dem Sketch geschrieben, was viel platz einnimmt. Deswegen will ich die datei auf meinem Webserver hochladen. Momentan benutze ich MAMP Pro. Wenn man Arduino als Webserver nutzen will, nimmt es schon 2/3 des Speichers ein ohne dass der Arduino was getan hat was ich ja eigentlich will. Gibt es eine Möglichkeit dass Arduino von der MicroSD den Sketch liest? Ich weiß garnicht wie man mit dem Arduino UNO vieles anstellen kann, der hat doch nur 32.256 Bytes?! Wie kann man da viele Funktionen einbauen? Allein das LCDMenu2 verbraucht schon 10k Bytes ohne jeglicher funktion.