Arduino steuerung mit millis?

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.

RareDevil  19.05.2021, 13:45
Ich verwende einen Schalter also er rastet ein.

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...

1
Paul2402 
Fragesteller
 21.05.2021, 14:17
@RareDevil

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.

0
RareDevil  22.05.2021, 17:42
@Paul2402

Ob Taster oder Schalter spielt dabei keine große Rolle... So bald die Laufgeschwindigkeiten zwischen beiden Richtungen nicht zusammen passen, wirst Du ständig ein Versatz drin haben, die immer schlimmer wird. Ohne Endschalter wird das nie vernünftig laufen...

0

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.

Paul2402 
Fragesteller
 19.05.2021, 10:53

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.

1
Jonima0  19.05.2021, 15:00
@Paul2402

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);

}

0
Jonima0  19.05.2021, 15:02
@Paul2402

Hab gerade gelesen was RareDevil noch kommentiert hat. Das fehlt bei mir auch noch.

0