Hi,
Einen Verbesserungsvorschlag hätte ich aber trotzdem. Da die Funktionalität "Pin schalten" und "Pin auslesen" bereits vorhanden ist und funktioniert (Kommando "S" und "R") würde ich einfach neue Kommandos definieren, die zusätzlich die Funktion "T" -> Timer für Pin x auf n Minuten setzen und z.B. "U" -> liefere die Zeit die der Timer für Pin x noch läuft abbildet. Das sind dann einfach nur weitere Blöcke im switch-case Konstrukt im Arduino-Code. Den größten Teil kannst Du sogar von "R" und "S" klauen und nur um die Timer-Geschichte erweitern.
meinst du so (bekomme Fehlermeldungen beim kompilieren,verstehe nicht was ich ändern muss, sorry ):
#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);
long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
void setup() {
//Ethernet initialisieren
Ethernet.begin(mac, ip, gateway, subnet);
// Server starten
server.begin();
// serielle konsole öffnen (debug)
Serial.begin(9600);
}
void loop() {
// auf eine eingehende Verbindung warten
EthernetClient client = server.available();
//wenn verbindung, dann 3 bytes lesen;
if (client) {
char command =client.read();
byte pinnumber =client.read();
byte pinvalue =client.read();
byte pintime =client.read(); //öffnungszeit Ventil zb. 15min
long timerlength = client.read();
byte returnvalue = 0;
byte timerpin[] = pinnumber; //<-- hier hagt es :-( Keine Ahnung was da hin mus...
//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("Timer ");
Serial.print(t);
Serial.println(" abeglaufen.");
}
}
}
}
//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':
Serial.print("T Kommando empfangen, setze Pin ");
Serial.print(pinnumber);
Serial.print(" auf ");
Serial.println(pinvalue);
pinMode(pinnumber,OUTPUT);
digitalWrite(pinnumber,pinvalue);
Serial.print(" für ");
Serial.print(pintime);
Serial.print(" min");
//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();
}
}
Hier die Fehlermeldungen:
Mario_1.cpp: In function 'void loop()':
Mario_1:39: error: initializer fails to determine size of 'timerpin'
PHP_Ausgang_schalten_Mario_1:53: error: invalid types 'long int[int]' for array subscript
Ich verstehe die Zuordnungen nicht ... arg.. ;-(
NUMTIMER ?
timerpin ? <-- soll der aktive Pin sein?
timerlength ? <-- länge wie lange das Ventil geöffnet sein soll ?