Hallo allerseits,
hier mal der Sketch und das PHP-Script welches die Arduino Ausgänge per Zeitvorgabe
über ein Webinterface Steuert. Das PHP-Script ist einfach gehalten, so kann es jeder
nach seinen Vorstellungen verändern, bei mir sieht es komplexer aus.

Ich hoffe das ist gut genug beschrieben, habe das mal auf die schnelle zusammen gestellt.
Sketch:
/*
Arduino Ausgang per PHP-Webinterface schalten
written by mkl0815 and Cetax
Date 21.05.2012
Cetax at bk-s dot de
*/
#include <SPI.h>
#include <Ethernet.h>
// MAC und IP Konfiguration
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xEE, 0xF3 };
IPAddress ip(192,168,178,216);
IPAddress gateway(192,168,178,1);
IPAddress subnet(255, 255, 255, 0);
// warten auf port 23
EthernetServer server(23);
unsigned long previousMillis = 0;
#define NUMTIMER 6 // 6 Timer können kommen
int TI; // Variable für Timer
int timerpin[NUMTIMER]; // Variable für Ausgangs-Pin
int timerlength[NUMTIMER]; // Variable für übergebene Zeit
void setup() {
//Ethernet initialisieren
Ethernet.begin(mac, ip, gateway, subnet);
// Server starten
server.begin();
// serielle konsole öffnen (debug)
Serial.begin(9600);
}
void loop() {
//prüfen ob eine Sekunde vergangen ist
if(millis()-previousMillis >= 1000) {
//aktuelle Zeit merken
previousMillis = millis();
//alle timer auswerten
for(int t=0; t<NUMTIMER;t++) {
//nur timer beachten, die auch verwendet werden sollen (positive PIN nummer)
if(timerpin[t] > 0 ){
//bei aktuellem timer eine sekunde abziehen, wenn "0", dann abgelaufen
if( --timerlength[t] == 0) {
//Ausgang umschalten ( HIGH -> LOW oder LOW -> HIGH)
digitalWrite(timerpin[t],!digitalRead(timerpin[t]));
//timer deaktivieren ( timer mit pin "-1" sind inaktiv)
timerpin[t] = -1;
//debug
Serial.print("T Kommando empfangen, Timer ");
Serial.print(t);
Serial.println(" abeglaufen.");
}
}
}
}
// auf eine eingehende Verbindung warten
EthernetClient client = server.available();
if (client) {
char command =client.read();
byte pinnumber =client.read();
byte pinvalue =client.read();
byte returnvalue = 0;
//Kommando auswerten
switch(command) {
case 'S':
Serial.print("S Kommando empfangen, setze Pin ");
Serial.print(pinnumber);
Serial.print(" auf ");
Serial.println(pinvalue);
pinMode(pinnumber,OUTPUT);
digitalWrite(pinnumber,pinvalue);
//gesetzten wert auch zurückliefern
returnvalue=pinvalue;
break;
case 'R':
returnvalue = digitalRead(pinnumber);
Serial.print("R Kommando empfangen, lese Pin ");
Serial.print(pinnumber);
Serial.print(". Wert = ");
Serial.println(returnvalue);
break;
case 'U':
TI = client.read(); // Timer Nr.
Serial.print("U Kommando empfangen, lese Timer ");
Serial.print(TI);
Serial.print(" Wert = ");
Serial.println(timerlength[TI] /60);
client.print(timerlength[TI] /60);
break;
case 'T':
TI = client.read(); // Timer Nr.
timerlength[TI] = client.read(); // zeit für ventil öffnung
timerpin[TI] = pinnumber; // zu schaltender Pin
timerlength[TI] = timerlength[TI] *60; // die empfangenen sec*60 = min
Serial.print("T Kommando empfangen, ");
Serial.print("Timer ");
Serial.print(TI);
Serial.println(" gestartet");
Serial.print("T Kommando empfangen, setze Pin ");
Serial.print(timerpin[TI]);
Serial.print(" auf ");
Serial.println(pinvalue);
pinMode(timerpin[TI],OUTPUT);
digitalWrite(timerpin[TI],pinvalue);
Serial.print("T Kommando empfangen, setze Time auf ");
Serial.print(timerlength[TI]);
Serial.print(" sec");
Serial.println(" ");
returnvalue=pinvalue; //gesetzten wert auch zurückliefern
break;
default:
Serial.println("Fehler, unbekanntes Kommando");
break;
}
// 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();
}
}
PHP-Code:
<!--
Arduino Ausgang per PHP-Webinterface schalten
written by mkl0815 and Cetax
Date 21.05.2012
Cetax at bk-s dot de
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Bewässerung</title>
<?php
$arduino_ip = "192.168.178.216";
$arduino_port = "23";
function arduino_send($ip,$port,$command) {
$res = fsockopen($ip,$port);
if($res) {
fwrite($res,$command);
$ret =fread($res,10);
//echo "Ventil = $ret <br>\n";
//echo "1 = Zu | 0 = Auf <br>\n";
return $ret;
} else {
echo "Fehler, kein kontakt.<br>Kommando konnte nicht abgesetzt werden";
}
}
// Ventil 1 start
// hier werden 5 byte gesendet ( T ; chr(4) ; chr(0) ; chr(0) ; chr($V1) )
// Case ; PinNr ; Zustand ; Timer1 ; Ventil1
if(isset($_GET['V1'])) {
$V1 = $_GET['V1']; //PinNR. AUF Timer1 Ventil1
arduino_send($arduino_ip,$arduino_port,"T".chr(4).chr(0).chr(0).chr($V1));
}
if(isset($_GET['V1stop'])) {
$V1stop = $_GET['V1stop'];
arduino_send($arduino_ip,$arduino_port,"S".chr(4).chr(1));
}
else {
$V1stop = arduino_send($arduino_ip,$arduino_port,"R".chr(4).chr(1));
}
// Ventil 1 ende
?>
</head>
<body>
<h1><div align="center">Bewässerung</div></h1>
<div align="center">
<table border="0" bgcolor="#808080">
<tr>
<td><div align="center"><b>Ventil 1</b></div></td>
</tr>
<tr>
<td>
<form action="">
<p><div align="center"><select name="V1">
<option value=""> Zeit</option>
<option value="15">15 min</option>
<option value="30">30 min</option>
<option value="45">45 min</option>
<option value="60">60 min</option>
</select></div></p>
<p><input type="checkbox" name="V1stop" value="1"><font size=
"-1">Schließen</font></p>
<p></p>
<div align="center"><input type="submit" name="submit" value=
"Senden"></div>
<p></form>
<?php if($V1stop==1){
echo "<div align='center'> Geschlossen </div>\n";
} else {
echo "<div align='center'> Offen </div>\n";}
?>
</td>
</tr>
<tr>
<td>
<?php
$V1 = arduino_send($arduino_ip,$arduino_port,"U".chr(4).chr($V1).chr(0));
$restzeit = $V1;
if($restzeit!=0){
echo '<div align="center">Restzeit<br /> <b>' .gmdate("i:s", $V1). ' min</b></div>';
} else {
echo " "; }
?>
</td>
</tr>
</table></div>
</body>
</html>
Geht bestimmt schöner und aufgeräumter...