Go Down

Topic: Ausgang per Web schalten mit PHP (Read 13 times) previous topic - next topic

mkl0815

Guten Morgen,
Quote
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.

Wo hast Du es denn eingetragen? Und was hat nicht funktioniert? Entschuldige wenn ich so direkt frage, aber hast Du einfach nur probiert, oder überlegt wo es passen könnte? Das ist nicht böse gemeint, aber ich glaube Du verfolgst bei der Programmierung immer noch einen falschen Ansatz. Erstmal irgendwelchen Code schreiben und dann schauen was der macht ist keine gute Taktik. Es hat einen Grund warum ich Dich schon zwei Mal versucht habe zu überzeugen erstmal die Schritte die in Deinem Programm passieren sollen in Worten als kleine Liste aufzuschreiben. Wenn Du da schon ein Problem mit dem Verständnis zum Ablauf hast, wird das beim Programmieren nicht besser, weil Du Dich dort noch zusätzlich auf die Syntax von C und die semantisch korrekte Umsetzung Deines Konzepts konzentrieren musst.
Am Beispiel der Umrechnung der Dauer in Minuten:

  • PHP sendet die Dauer als 4. Parameter in Minuten

  • Sketch liest im switch-case Block den zusätzlichen 4. Parameter, wenn Kommando "T" erkannt wurde in die Variable timerlength[0]

  • timerlength[0] muss aber in Sekunden angegeben werden, daher muss der gerade übermittelte Werte umgerechnet werden

  • Um auf Sekunden zu kommen, muss der Wert mit 60 multipliziert werden -> timerlength[0] = timerlength[0] *60



Quote
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:
Code:
int NUMTIMER[] = {0,1};
0 für V1 und 1 für V2 , Dachte ich smiley-sad

Wann welches Ventil geöffnet ist, ist für die Programmierung an der Stelle erstmal völlig uninteressant. Warum?
1) Weil man immer möglichst allgemeine Lösungen baut, in diesem Fall also mit der Möglichkeit "Ventile" (also Pins) unabhängig voneinander mit unterschiedlichen Timern zu schalten. Wie das dann von einer konkreten Anwendung genutzt wird, ist eine ganz andere Sache.
2) Ein PHP- und HTML-Script ist schnell geändert, dort steckt ja die eigentliche Anwendungslogik drin, den Arduino später neu zu flashen ist deutlich mehr Aufwand. Den Arduino interessiert ja im Prinzip auch nicht um "was" es eigentlich geht. Der bekommt nur "Kommandos" wie "schalte Pin 3 ein" , "lese Pin 4 aus", oder "Schalte Pin 9 für 15 Minuten auf HIGH, danach wieder auf LOW" und das sollte alles unabhängig voneinander funktionieren.

Du hast geschrieben, das Du das mit dem "#define NUMTIMER 3" verstanden hast, schreibst aber trotzdem wieder sowas : int NUMTIMER[] = {0,1};? Das ist das, was ich mit dem rumprobieren meine. Das führt leider in den seltensten Fällen zum Erfolg. Und selbst wenn, dann nur aus Glück und man versteht meistens am Ende trotzdem nicht warum es plötzlich funktioniert. Ergo -> kein guter Ansatz.

Du hast in Deinem Code ein
#define NUMTIMER 2 stehen. Das bedeutet, das die beiden Arrays timerlength und timerpin je 2 Einträge haben können. Du hast also schon 2 Timer zur Verfügung, die Du für V1 und V2 nutzen kannst (timerlength[0] und timerlength[1]. Was fehlt ist nur die Zuordnung. Dein Sketch muss ja irgendwo die Information herbekommen, welcher Timer für welches Pin verwendet werden soll.
Hier hast Du auch wieder zwei Möglichkeiten.
1) Die einfache Variante wäre einfach zu sagen wenn Pin 4 übergeben wird, nutze Timer 0 und bei Pin 5 nutze Timer 1. Das ist aber schlechter Stil, denn Du verlagerst damit Teile Deiner Anwendungslogik in den allgemeinen Arduino-Sketch. Die Gefahr besteht, das Du irgendwann im PHP-Code plötzlich Pin 6 übergibst, weil sich Deine Schaltung geändert hat und dann der Code nicht mehr greift.
2) Die allgemeinere Variante. Du übergibst mit dem Kommando "T" einfach noch ein zusätzliches Byte, das bestimmt, welcher Timer verwendet werden soll. Dieses wird dann, genauso wie timerlength per client.read() gelesen. Allerdings musst Du aufpassen, denn Du solltest ersten die Timer-Nummer übergeben, ehe Du mit timerlength[timernummer] = client.read() die Länge liest. (Du kannst Dir natürlich auch eine einfache "byte" Variable als "Zwischenspeicher" deklarieren.

Achso, ich bin auch nicht "verärgert". Leider versuchst Du immer noch den zweiten Schritt vor dem Ersten zu machen und stolperst dabei regelmäßig. Das ist, sagen wir mal eine kleine Gedulds-Herausforderung für mich  :D, gehört aber einfach dazu, wenn man jemanden etwas wirklich verständlich machen will. "Echtes" Lernen bedeutet nun mal, das man Prinzipien versteht und nicht einfach nur "auswendig" lernt. Damit habe ich mir als Tutor immer zusätzliche Arbeit gemacht und auch so machens "Opfer" zur Verzweiflung getrieben. Du bist also in guter Gesellschaft  ]:D

mkl0815

Code: [Select]
int ledPin[] = {7,8,9}; // LED-Array mit Pin-werten

Ist korrekt, aich Dein
Code: [Select]
int NUMTIMER[] = {0,1};
war, zumindest für diese Zeile, erstmal snytaktischkorrekt.
Allerdings wird im Sketch selbst das NUMTIMER nicht als Variable oder Array verwendet, sonder nur als Platzhalter für die Zahl 3 oder 5 oder 2 oder welche Anzahl von Timern Du haben willst. NUMTIMER ist also NICHT der Timer selbst sonder nur der Wert für die Anzahl der Timer die es geben soll.
timerlength[] und timerpin[] sind die beiden Arrays, die den eigentlichen Timer bilden, denn diese speichern ja die Länge der Laufzeit und den Pin für einen spezifischen timer, sprich Index der Arrays.

Schön, das Dein Projekt jetzt funktioniert. Du hast Dir natürlich für den Anfang auch ein recht komplexes Projekt ausgesucht. Aus meiner Sicht etwas zu komplex für eine sinnvolle Lernkurve, denn zu viele Baustellen und Prinzipien gleichzeitig mit denen man sich auseinandersetzen muss, überfordern einen doch leicht.
Nur nicht aufgeben und dran bleiben, irgendwann lichtet sich der Nebel :-)

Cetax

Hallo allerseits,
also Projekt läuft.
Nochmal vielen Dank an "mkl0815" für die tolle Hilfe und Unterstützung :D

Arduino Ausgänge werden mittels PHP für eine Vorgegeben Zeit geöffnet und dann automatisch geschlossen.
Den Code liefer ich später nach, muss den noch kommentieren.
Sollte jemand den schon vorher haben wollen, kurze PN.
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Guten Morgen,

kann es sein, das aus diesem Thread Beiträge verschwunden sind? Speziell zwischen meinem letzten Post und dem vorletzten fehlt irgendwie der "es klappt jetzt" Post von Cetax. Daher mutet der Thread jetzt etwas seltsam an :-)

Cetax

Moin,
ja also wie soll ich sagen... :smiley-red:
Ups.. Ich habe den falschen Button angeklickt und da war es wech..
Sorry !
*greatz*

 CeTax

www dot blinkmann dot de

Go Up