Arduino steuerung mit millis?
Hallo liebe comunety,
Habe ein Programm zur Rolladensteuerung geschrieben leider weißt das Programm noch Fehler auf und ich kann diese nicht finden.
Hab das erste mal mit millis programmiert und nicht mit delay.
Bitte um nachsicht ich versuche noch zu lernen.
const int buttonPin = 7;
int RolloAb = 3;
int RolloAuf = 4;
int Hupe = 5;
int Lampe = 6;
int myTimer = 0;
int myTimer2 = 0;
int myTimer3 = 0;
long myTimeout = 20000;
long myTimeout2 = 20000;
long myTimeout3 = 2000;
void setup() {
pinMode (buttonPin, INPUT_PULLUP);
pinMode (RolloAb, OUTPUT);
pinMode (RolloAuf, OUTPUT);
pinMode (Hupe, OUTPUT);
pinMode (Lampe, OUTPUT);
}
void loop() {
digitalRead(buttonPin);
delay(20);
if(buttonPin == HIGH); {
myTimer2 = millis();
digitalWrite(Lampe, HIGH);
if(millis() < myTimer + myTimeout) {
digitalWrite(RolloAb, HIGH);
if(millis() < myTimer3 + myTimeout3) {
myTimer3 = millis();
if(Hupe == LOW) {
digitalWrite(Hupe,HIGH);
}
if(Hupe == HIGH) {
digitalWrite(Hupe,LOW);
}
}
}
}
if(buttonPin == LOW); {
myTimer = millis();
if(millis() < myTimer2 + myTimeout2) {
digitalWrite(RolloAuf, HIGH);
}
}
}
Zum Ablauf des Programmes:
bei betätigung des schalters soll der Rollo nach unten fahren.
Zeitgleich soll eine Hupe schalten und ein getaktetes akustisches Signal ausgeben.
Die Warnleuchte soll auch während der fahrt nach unten Läuchten.
Beim rücksetzen des Tasters soll der Rollo wieder noch oben fahren dabei sind Lampe und Hupe NICHT aktiv.
Danke für Ihre Hilfe
Mit freundlichen Grüßen
Paul
2 Antworten
Habe gerade nicht viel Zeit. Aber es gibt mehrere Fehler. Taster einlesen und speichern wurde schon genannt...
millis() ist unsignedlong... Du kannst also millis() nicht in eine int übergeben... Die Hupe hat keine weitere Abhängigkeit. Sobald sie ein ist, wird sie wieder ausgeschaltet... Und mit Sicherheit noch weiteres, wo ich gerade nicht drauf eingehen kann... Jeder Schritt und jede Abhängigkeit muss ganz genau definiert werden, da anders wie bei Delay das Programm nicht anhält, sondern alle Schritte nacheinander zyklusweise abgearbeitet werden. Bei Delay kann man es sich einfach machen, da der nächste Schritt erst folgen kann, wenn Delay abgelaufen ist. Das ist der Vorteil von millis(), da man auch parallel noch andere Aufgaben steuern kann.
Oh man... könntest du mir vielleicht helfen das ganze mit einem Taster richtig zu Programmieren? Ich habe einen 1Phasen Kondensatormotor ohne endlage. Das ganze ist kein Rolladenmotor.
Ich würde das ganze auf ein Taster umbauen wenn das so leichter funktioniert.
Einen fehler habe ich gleich gefunden. Du hast den Wert, den du mit digitalRead einließt nicht gespreichert. Der Befehl müsste wie folgt lauten: int taster = digitalRead(buttonPin); (Die Variable kannst du auch oben deklarieren und natürlich anders nennten).
Noch ein paar Verständnisfragen:
- Verwendest du einen Taster oder einen Schalter (also rastet der ein oder gibt der nur ein Signal solange du draufdrückst)?
- Sobald man auf den Taster drückt soll der Rollo 20000 Millisekunden nach unten, bzw. nach fahren, oder? Wären da nicht auch jeweils ein Endschalter sinnvoll?
Wenn du mir diese Fragen beantworten könntest, würde ich das Programm mal so schreiben, wie ich es machen würde.
Hallo,
zunächst ein dickes DANKE für die schnellen Antworten.
Ich verwende einen Schalter also er rastet ein.
Ich möchte das der Rollo die 20000 millisekunden nach unten fährt, da ich leider keinen Endschalter habe und das ganze ein low-budget Projekt ist.
Danke für deine Hilfe ich bin schon am verzweifeln und kenne leider niemanden der mir weiterhelfen kann.
Also ich hatte nicht viel Zeit, hab es daher noch nicht ausprobiert, aber das kannst ja du machen. Musst halt die Pins noch anpassen. Kann auch sein, dass das Programm so überhaupt nicht funktioniert, hab es auch nicht nochmal durchgeschaut. Es gibt sicher auch elegantere Lösungen. Wenn du noch Fragen hast, schreib einfach:
unsigned long start = 0;
unsigned long ende = 0;
unsigned long diff = 0;
unsigned long tmpdiff = 0;
int auf = 2;
int ab = 3;
int buttonPin = 4;
int warnsignal = 5;
bool schalter = false;
int pos = 1; //1 ist oben, 0 ist unten
void setup() {
pinMode(auf, OUTPUT);
pinMode(ab, OUTPUT);
pinMode(warnsignal, OUTPUT);
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void loop() {
schalter = digitalRead(buttonPin);
if (schalter == 1 && pos == 1 && diff == 0){
start = millis();
while(schalter == 1 && diff < 20001){
digitalWrite(ab, HIGH);
digitalWrite(warnsignal, HIGH);
delay(100);
ende = millis();
diff = ende - start;
schalter = digitalRead(buttonPin);
}
digitalWrite(ab, LOW);
digitalWrite(warnsignal, LOW);
pos = 0;
diff = 0;
}
else if ((schalter == 0) && (pos == 0) && (diff = 0)) {
start = millis();
while (schalter == 0 && diff < 20001) {
digitalWrite(auf, HIGH);
delay(100);
ende = millis();
diff = ende - start;
schalter = digitalRead(buttonPin);
}
digitalWrite(auf, LOW);
pos = 1;
diff = 0;
}
else if (schalter == 0 && pos == 0 && diff != 0) {
tmpdiff = diff;
while (schalter == 0 && diff< tmpdiff) {
digitalWrite(auf, HIGH);
delay(100);
ende = millis();
diff = ende - start;
schalter = digitalRead(buttonPin);
}
digitalWrite(auf, LOW);
pos = 1;
diff = 0;
tmpdiff = 0;
}
else if (schalter == 0 && pos == 0 && diff != 0) {
tmpdiff = diff;
while(schalter == 1 && diff < 20001){
digitalWrite(ab, HIGH);
digitalWrite(warnsignal, HIGH);
delay(100);
ende = millis();
diff = ende - start;
schalter = digitalRead(buttonPin);
}
digitalWrite(ab, LOW);
digitalWrite(warnsignal, LOW);
pos = 0;
diff = 0;
tmpdiff = 0;
}
else {
}
delay(100);
}
Oh, dann geht das mächtig schief... Wenn der Schalter betätigt bleibt, startet sich der Vorgang immer wieder neu. Da muss noch eine Ablaufverriegelung rein, dass der jeweilige Vorgang nur einmal ausgeführt wird, nachdem der Schalter umgeschaltet wurde. Zudem darf ein umschalten zwischendrin den Vorgang nicht resetten und die Zeit neu laufen. Was auch noch hinzu kommt, ist eine unterschiedliche Laufzeit zwischen auf/abwärts... Wenn der Motor länger braucht um hoch zu fahren, dann kommst Du nie mehr bis ganz oben, und so immer tiefer... Ohne Endschalter wird das ganze sehr riskant, dass es irgendwann zu Fehlpositionen kommt oder sogar zu Beschädigungen, da die Positionierungen immer weiter abweichen... LowBudget ist ja schön, aber Endschalter würde ich trotzdem realisieren...
Welchen Motor nutzt Du denn, dass der keine Endlagenerkennung hat? Eig hat das jeder simple Rollomotor...