Hallo Mario,
sorry wenn ich verärgert habe, aber ich habe es nicht verstanden.
Ich habe es jetzt so verändert wie du es geschrieben hast und es funktioniert.
Um das erstmal zum Laufen zu bekommen, ändere folgendes in Deinem Sketch:
- Das "byte" vor timerlength und timerpin in dem Block wo die Daten gelesen werden muss weg.
- Innerhalb von loop() änderst Du alle Vorkommen von timerlength in timerlength[0]
- Innerhalb von loop() änderst Du alle Vorkommen von timerpin in timerpin[0]
Habe ich getan, es läuft. <Danke!>
Im übrigen zählt Dein Sketch die timer in Sekunden nicht in Minuten. Damit es Minuten werden solltest Du den übergebenen Wert noch mit 60 multiplizieren.
Auch hier muss ich wieder passen, ich versuche seit 3 std heraus zu finden wo ich das eintragen muss, aber ohne erfolg. Egal wo ich es eintrage, nix, die Zeit wird nicht multipliziert.
Leider ist Deine Lösung aber generell für eine Verwendung von mehreren Timern ungeeignet, da Du in Deinem Aufruf nicht übergibst welcher Timer verwendet werden soll. Sobald Du mehr als ein Ventil schalten willst, bekommst Du Probleme.
Ok, aber es soll auch immer nur ein Ventik zur Zeit geöffnet sein,niemals zwei.
Auch hier stehe ich auf dem Schlauch, meinst du mit mehreren TIMERN z.b. V1, V2, V3 für Ventil1, Ventil2 usw. ? So wie im PHP angegeben?
Wenn ich es so versuche, gibt er Fehlermeldungen raus:
int NUMTIMER[] = {0,1};
0 für V1 und 1 für V2 , Dachte ich
Ich habe jetzt mal die PHP Seite erweitert, es funktioniert, aber wie du schon sagst, im SerialMonitor, wird immer nur Timer 0 angezeigt.
Hier der Sketch:
#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 2
int timerpin[NUMTIMER];
int timerlength[NUMTIMER];
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 'T':
timerlength[0] = client.read(); // zeit für ventil öffnung
timerpin[0] = pinnumber;
Serial.print("T Kommando empfangen, setze Pin ");
Serial.print(timerpin[0]);
Serial.print(" auf ");
Serial.println(pinvalue);
pinMode(timerpin[0],OUTPUT);
digitalWrite(timerpin[0],pinvalue);
Serial.print("T Kommando empfangen, setze Time auf ");
Serial.print(timerlength[0]);
Serial.print(" sec");
Serial.println(" ");
//gesetzten wert auch zurückliefern
returnvalue=pinvalue;
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();
}
}
und hier der PHP-Code:
<html>
<head>
</head>
<body>
<h1>Test</h1>
<?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,1);
echo "arduino_send() returned = $ret
\n";
return $ret;
} else {
echo "Fehler, Kommando konnte nicht abgesetzt werden";
}
}
if(isset($_GET['led1'])) {
$led1 = $_GET['led1'];
arduino_send($arduino_ip,$arduino_port,"S".chr(4).chr($led1));
} else {
$led1 = arduino_send($arduino_ip,$arduino_port,"R".chr(4).chr(0));
}
if(isset($_GET['V1'])) {
$V1 = $_GET['V1'];
arduino_send($arduino_ip,$arduino_port,"T".chr(4).chr(1).chr($V1));
} else {
$V1 = arduino_send($arduino_ip,$arduino_port,"R".chr(4).chr(0));
}
if(isset($_GET['V2'])) {
$V2 = $_GET['V2'];
arduino_send($arduino_ip,$arduino_port,"T".chr(5).chr(1).chr($V2));
} else {
$V2 = arduino_send($arduino_ip,$arduino_port,"R".chr(5).chr(0));
}
?>
<form action="">
<p>
LED 1 :
<input type="radio" name="led1" value="0" <?php if($led1==0) echo "checked" ?> >aus -
<input type="radio" name="led1" value="1" <?php if($led1==1) echo "checked" ?> >an
</p>
<input type="submit" name="submit" value="Senden">
</form>
<form action="">
<p>Timer 1
<select name="V1">
<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>
</p>
<input type="submit" name="submit" value="Senden">
</form>
<form action="">
<p>Timer 2
<select name="V2">
<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>
</p>
<input type="submit" name="submit" value="senden">
</form>
</body
</HTML>