Hallo,
Ich möchte eine Jalousiesteuerung per Web Interface aufbauen.
Auf einer HTML Seite soll man dann zwischen "Vollständig offen", "1/4",
"1/2", "3/4", "Nur Schlitze" und "Vollständig geschlossen" wählen
können. Dazu passe ich dann einfach den Sollwert an. Dieser Teil
funktioniert bisher auch.
Um in der Testphase alles etwas übersichtlicher zu halten, habe ich die
Steuerung erstmal in einem eigenen Sketch geschrieben und ich passe zum
Simulieren einfach vor dem Hochladen die SollWerte für die Jalousie an.
Ich will die Position durch Zeitberechnung bestimmen und leider bekomme
ich das nicht hin. Die 20.000 millisekunden, die ich als soll eingegeben
habe, laufen in ca einer Sekunde durch.
Der Rest des Programms funktioniert bisher.
Da dies nur ein kleiner Teil von einer kleinen Hausautomatiesierung ist,
kommt später alles auf einen Arduino Mega.
Kann mir bitte jemand helfen? Ich kann den Fehler einfach nicht finden.
Ich muss dazu auch sagen, dass ich noch kaum Erfahrung mit Programmieren
und Arduinos habe.
Es handelt sich um 2 Wechsel Relais:
- Relais 1 Schaltet die Phase
- Relais 2 Schaltet Auffahren oder Zufahren
Ich hoffe ich habe es ausreichend Dokumentiert.
Danke im voraus.
Gruß
Jonny
1
intJalEA1=30;// Jalousie 1 Relais Ein/Aus an Pin 30
2
intJalR1=31;// Jalousie 1 Relais Richtung an Pin 31
3
unsignedlongpreviousMillisAuf1=0;// Startwert für Jalousie 1 Auffahren
4
unsignedlongpreviousMillisZu1=0;// Startwert für Jalousie 1 Zufahren
Ich würde da eine Zustandsmaschine bauen. Einen endlichen Automaten.
Mit eindeutig benannten Zuständen und klaren übersichtlichen
Transformationen.
Es soll ja wohl mehr als eine Jalousie werden. Also die Variablen nicht
durchnummerieren, sondern in Strukturen/Arrays verpacken.
Am Rande:
Dieses erzeugt ein kurzes Relais Zucken
1
voidsetup()
2
{
3
Serial.begin(9600);
4
pinMode(JalEA1,OUTPUT);// Relais als Ausgänge deklarieren
5
pinMode(JalR1,OUTPUT);// Relais als Ausgänge deklarieren
6
digitalWrite(JalEA1,HIGH);
7
digitalWrite(JalR1,HIGH);
8
9
}
Besser:
1
voidsetup()
2
{
3
Serial.begin(9600);
4
digitalWrite(JalEA1,HIGH);
5
digitalWrite(JalR1,HIGH);
6
pinMode(JalEA1,OUTPUT);// Relais als Ausgänge deklarieren
7
pinMode(JalR1,OUTPUT);// Relais als Ausgänge deklarieren
Arduino F. schrieb:> Am Rande:> Dieses erzeugt ein kurzes Relais Zucken void setup()> Besser:
kannst du das mal erklären?
für mich sieht es nach einem Designfehler aus.
im Zuckfall, erst out -> low dann set high kann zucken wenn ein pullup
verbaut ist!
gibt high low high und muss zucken,
in dem Falle wäre ein pulldown die bessere Wahl
gibt low low high aus ohne zucken.
Joachim B. schrieb:> kannst du das mal erklären?
Auch wenn es nicht explizit im Eingangsposting steht, "sehe" ich da
invers angesteuerte Relaiseingänge. (lasse mich gerne korrigieren)
pinMode(JalEA1, OUTPUT); // zieht den Pin auf Low
digitalWrite (JalEA1, HIGH); // zieht den Pin auf High
Der Pin geht durch eine kurze Low Phase
digitalWrite (JalEA1, HIGH); // aktiviert den Pullup
pinMode(JalEA1, OUTPUT); // zieht den Pin auf High
Kein Low Pulse
Hallo Jonny,
was soll das genau bezwecken ?
IstJal1M = IstJal1;
IstJal1 = IstJal1M + currentMillisJal - previousMillisZu1
Da deine Mainloop ja wesentlich schneller läuft als die Millis, addierst
du dir hier doch ständig den Istwert mit dem Istwert, muliplizierst ihn
als mal 2 ohne das sich die Millis geändert haben. Kein Wunder das der
Sollwert ruck zuck errecht wird!
Verwende lieber einen Timer mit 1ms, der dir den itswert in Abhängigkeit
von der Richtung hoch oder runter zählt. In Main vergleichst du dann
ober der gewünschte Wert erreicht wurde.
Die Verwendung von Millis ist nicht ganz so einfach, denn auch die long
Variable läuft mal über und dann stimmt die Berechnung nicht mehr.
Sascha
Arduino F. schrieb:> Auch wenn es nicht explizit im Eingangsposting steht,
eben drum hab ich das nicht gelesen!
Arduino F. schrieb:> "sehe" ich da> invers angesteuerte Relaiseingänge. (lasse mich gerne korrigieren)
jetzt sehe ich das auch
Jonny H. schrieb:> digitalWrite (JalEA1, LOW); // Relais Schalten
er schaltet low aktiv, dann ist das
Arduino F. schrieb:> pinMode(JalEA1, OUTPUT); // Relais als Ausgänge> deklarieren> pinMode(JalR1, OUTPUT); // Relais als Ausgänge> deklarieren> digitalWrite (JalEA1, HIGH);> digitalWrite (JalR1, HIGH);
oder auch dies
Arduino F. schrieb:> digitalWrite (JalEA1, HIGH);> digitalWrite (JalR1, HIGH);> pinMode(JalEA1, OUTPUT); // Relais als Ausgänge> deklarieren> pinMode(JalR1, OUTPUT); // Relais als Ausgänge> deklarieren
total überflüssig!
es reicht zum Setzen der Relais
pinMode(JalEA1, OUTPUT); // gibt ja low
zum Rücksetzen der Relais
pinMode(JalEA1, INPUT); // gibt ja high durch einen pullup, vermutlich
schon eingebaut.
> total überflüssig!
Im Grunde ja.
Wobei das Schalten des Relais mit digitalWrite() dem "Prinzip der
geringsten Verwunderung" entspricht.
Und darum halte ich meinen Weg für besser, auch wenn es vielleicht ein
paar Extratakte kostet.
Joachim B. schrieb:> im Zuckfall, erst out -> low dann set high kann zucken wenn ein pullup> verbaut ist!> gibt high low high und muss zucken,> in dem Falle wäre ein pulldown die bessere Wahl> gibt low low high aus ohne zucken.
Lass zucken Kumpel, das wird schon :-)
Sascha W. schrieb:> Hallo Jonny,>> was soll das genau bezwecken ?>> IstJal1M = IstJal1;> IstJal1 = IstJal1M + currentMillisJal - previousMillisZu1>> Da deine Mainloop ja wesentlich schneller läuft als die Millis, addierst> du dir hier doch ständig den Istwert mit dem Istwert, muliplizierst ihn> als mal 2 ohne das sich die Millis geändert haben. Kein Wunder das der> Sollwert ruck zuck errecht wird!> Verwende lieber einen Timer mit 1ms, der dir den itswert in Abhängigkeit> von der Richtung hoch oder runter zählt. In Main vergleichst du dann> ober der gewünschte Wert erreicht wurde.> Die Verwendung von Millis ist nicht ganz so einfach, denn auch die long> Variable läuft mal über und dann stimmt die Berechnung nicht mehr.>> Sascha
Stimmt, da habe ich zu kompliziert gedacht.
Ich weiss leider nicht wie ich da die Timer anwenden soll.
Meinst du die Bibliothek "Timer.h"?
In die komplette Steuerung soll auch noch eine RealTimeClock für eine
Zeitschaltuht integriert werden. Wäre die Laufzeitberechnung damit viel
komplexer als über die Timer funktion?
Arduino F. schrieb:> Ich würde da eine Zustandsmaschine bauen. Einen endlichen Automaten.> Mit eindeutig benannten Zuständen und klaren übersichtlichen> Transformationen.>> Es soll ja wohl mehr als eine Jalousie werden. Also die Variablen nicht> durchnummerieren, sondern in Strukturen/Arrays verpacken.>> Am Rande:> Dieses erzeugt ein kurzes Relais Zucken
Ja stimmt, eine Zustandmaschine wäre übersichtlicher. Werde ich
umsetzen, sobald ich das Problem mit der Zeitberechnung hinbekommen
habe.
Das Zucken habe ich hiermit auch behoben, Danke.