Projekte und Tutorials für Arduino › Foren › StartHardware-Forum › Unabhänige Loops Programmieren
Schlagwörter: Loop; merhere unabhänige Loops
- Dieses Thema hat 7 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 2 Jahre, 8 Monaten von Franz-Peter.
-
AutorBeiträge
-
DoubleDeeTeilnehmer
Hi, ich bin noch Anfänger und benötige ein Skatch wo ich verschiedene LED´s nacheinander für eine bestimmte Zeit leuchten lasse. Nun hätte ich gern nebenbei einen Motor laufen der sich ein Stück dreht und dann wieder anhält und dies dann widerholt.
Mein Skatch sieht bisher so aus:
int ledRot=5;
int ledGruen=4;
int ledBlau=3;
int Motor=2;void setup() {
pinMode(ledRot, OUTPUT);
pinMode(ledGruen, OUTPUT);
pinMode(ledBlau, OUTPUT);
pinMode(Motor, OUTPUT);
}void loop() {
digitalWrite(ledRot, HIGH);
digitalWrite(ledGruen, LOW);
digitalWrite(ledBlau, LOW);
delay(5000);
digitalWrite(ledRot, LOW);
digitalWrite(ledGruen, HIGH);
digitalWrite(ledBlau, LOW);
delay(5000);
digitalWrite(ledRot, LOW);
digitalWrite(ledGruen, LOW);
digitalWrite(ledBlau, HIGH);
delay(5000);
digitalWrite(ledRot, HIGH);
digitalWrite(ledGruen, HIGH);
digitalWrite(ledBlau, LOW);
delay(5000);
digitalWrite(ledRot, HIGH);
digitalWrite(ledGruen, LOW);
digitalWrite(ledBlau, HIGH);
delay(5000);
digitalWrite(ledRot, LOW);
digitalWrite(ledGruen, HIGH);
digitalWrite(ledBlau, HIGH);
delay(5000);
digitalWrite(ledRot, HIGH);
digitalWrite(ledGruen, HIGH);
digitalWrite(ledBlau, HIGH);
delay(5000);
}void loop() {
digitalWrite(Motor, HIGH);
delay(30);
digitalWrite(Motor, LOW);
delay(500);
}Die jeweiligen LED´s bzw die Kombinationen aus den LED´s sollen dann mal für jeweils eine Halbe Stunde leuchten. Wenn ich den Motor mit in den Loop der LED´s einbinde würde das ja heißen das er erst nach 3,5 Stunden seine angewiesenen Parameter ausfürt. Ich hätte es aber gern das er Ständig diesen Loop durchläuft, so als ob man nur diesen Loop Programmiert hat, wärend die LED´s ihren eigenen Loop durchlaufen.
Ich hoffe ich konnte es so erklären das man versteht was ich gern mit der Programmierung ereichen will.
Danke schon mal im vorraus, Gruß DD
P.S.: Ich benutze einen Arduino Nano.
Franz-PeterTeilnehmerEs gibt immer nur einen loop. Um zu realisieren, was Du vorhast, musst Du ‘blockadefrei’ programmieren. D.h. vor allem, dass Du keine delay verwenden darfst. Der loop muss ständig durchlaufen.
Für meine Modellbahnkollegen habe ich mal ein Tutorial geschrieben, wie das mit meiner Lib ‘MobaTools’ geht. Vielleicht hilft es dir auch. Eine kleine Eisenbahn im Kreis laufen zu lassen, hat ja fast jeder schonmal gemacht ;).In den Beispielen der Lib ist auch eines dabei. wie man 2 Led’s unabhängig voneinander blinken lassen kann. Das wäre auch schonmal ein Einsieg.
DoubleDeeTeilnehmerOkay, ich hab mir jetzt mal diesen Quellcode zusammen gebastelt:
int MotstepPin= 7;
int MotdirPin= 6;
int RegSens= 14;
int Schalter= 5;
int wRegSensZustand= 1;void setup() {
Serial.begin(9600);pinMode(MotstepPin, OUTPUT);
pinMode(MotdirPin, OUTPUT);
pinMode(RegSens, INPUT);}
void loop() {
switch (wRegSensZustand) {
case 1:
int RegSens = analogRead(14);
Serial.println(RegSens);
if (RegSens >= 1015){for (int x = 0; x < 200; x++){
digitalWrite(MotdirPin, HIGH);
digitalWrite (MotstepPin, HIGH);
delayMicroseconds (800);
digitalWrite (MotstepPin, LOW);
delayMicroseconds (800);wRegSensZustand = 2;
}
}
break;Serial.println(“case 2”);
case 2:
RegSens = analogRead(14);Serial.println(RegSens);
delay (500);if (RegSens <1015) {
for (int x= 0; x= 10; x++){
digitalWrite(MotdirPin, LOW);
digitalWrite (MotstepPin, HIGH);
delayMicroseconds (600);
digitalWrite (MotstepPin, LOW);
delayMicroseconds (600);
}wRegSensZustand = 1;
}
else {wRegSensZustand = 3;
}break;
case 3:
if ( digitalRead(Schalter) == HIGH) { // Code prüfendigitalWrite(MotdirPin, LOW) ;
for (int x= 0; x= 10; x++)
{
digitalWrite (MotstepPin, HIGH);
delayMicroseconds (600);
digitalWrite (MotstepPin, LOW);
delayMicroseconds (600);
}delay (30000) ;
wRegSensZustand = 1;
}
else {
wRegSensZustand = 2;
}
break;
} //Ende switch
} // Ende loopIn diesem Code soll ein Fenster geöffnet werden wenn es trocken ist bzw geschlossen werden wenn es Regnet.
Im Fall 1 gehe ich davon aus das dass Fenster geschlossen ist.
Es soll über den RegSens geprüft werden ob es Regnet oder nicht, wenn nicht soll Fenster mit einem Steppermotor geöffnet werden.
Bis hier hin funktioniert es so wie ich es will, Wenn dann das Fenster geöffnet ist, soll er mit Fall 2 weiter machen und nachsehen ob es Regnet, wenn nicht soll er zu Fall 3 gehen und prüfen ob ein Taster gedrückt wurde. Der Taster dient zum “manuellen” schließen des Fensters falls es draußen noch trocken ist und das Fenster nich automatisch zu geht.
Mein Problem ist, das er nach dem Fall 1 nicht in den Fall 2 Wechselt.Den code den ich geschrieben habe, hab ich mir zum Teil aus diesem Tutorial abgeleitet. https://www.stummiforum.de/viewtopic.php?f=21&t=163493
Vieleicht findet jemand den Fehler der mit unterlaufen ist.
(Der fall 3 ist noch nicht vollständig, ich habe den Schalter noch nicht implementiert! Will erstmal erreichen, dass er in die Fälle springt in die er soll.)Danke MfG DD
DoubleDeeTeilnehmerWarum wirde meinen letzter Eintrag nicht veröffentlicht?
DoubleDeeTeilnehmerOkay, ich hab mir jetzt mal diesen Quellcode zusammen gebastelt:
int MotstepPin= 7;
int MotdirPin= 6;
int RegSens= 14;
int Schalter= 5;
int wRegSensZustand= 1;void setup() {
Serial.begin(9600);pinMode(MotstepPin, OUTPUT);
pinMode(MotdirPin, OUTPUT);
pinMode(RegSens, INPUT);}
void loop() {
switch (wRegSensZustand) {
case 1:
int RegSens = analogRead(14);
Serial.println(RegSens);
if (RegSens >= 1015){for (int x = 0; x < 200; x++){
digitalWrite(MotdirPin, HIGH);
digitalWrite (MotstepPin, HIGH);
delayMicroseconds (800);
digitalWrite (MotstepPin, LOW);
delayMicroseconds (800);wRegSensZustand = 2;
}
}
break;Serial.println(“case 2”);
case 2:
RegSens = analogRead(14);Serial.println(RegSens);
delay (500);if (RegSens <1015) {
for (int x= 0; x= 10; x++){
digitalWrite(MotdirPin, LOW);
digitalWrite (MotstepPin, HIGH);
delayMicroseconds (600);
digitalWrite (MotstepPin, LOW);
delayMicroseconds (600);
}wRegSensZustand = 1;
}
else {wRegSensZustand = 3;
}break;
case 3:
if ( digitalRead(Schalter) == HIGH) { // Code prüfendigitalWrite(MotdirPin, LOW) ;
for (int x= 0; x= 10; x++)
{
digitalWrite (MotstepPin, HIGH);
delayMicroseconds (600);
digitalWrite (MotstepPin, LOW);
delayMicroseconds (600);
}delay (30000) ;
wRegSensZustand = 1;
}
else {
wRegSensZustand = 2;
}
break;
} //Ende switch
} // Ende loopIn diesem Code soll ein Fenster geöffnet werden wenn es trocken ist bzw geschlossen werden wenn es Regnet.
Im Fall 1 gehe ich davon aus das dass Fenster geschlossen ist.
Es soll über den RegSens geprüft werden ob es Regnet oder nicht, wenn nicht soll Fenster mit einem Steppermotor geöffnet werden.
Bis hier hin funktioniert es so wie ich es will, Wenn dann das Fenster geöffnet ist, soll er mit Fall 2 weiter machen und nachsehen ob es Regnet, wenn nicht soll er zu Fall 3 gehen und prüfen ob ein Taster gedrückt wurde. Der Taster dient zum “manuellen” schließen des Fensters falls es draußen noch trocken ist und das Fenster nich automatisch zu geht.
Mein Problem ist, das er nach dem Fall 1 nicht in den Fall 2 Wechselt.Den code den ich geschrieben habe, hab ich mir zum Teil aus diesem Tutorial, welches mir Franz-Peter im vorherigen post gezeigt hat, abgeleitet.
Vieleicht findet jemand den Fehler der mit unterlaufen ist.
(Der fall 3 ist noch nicht vollständig, ich habe den Schalter noch nicht implementiert! Will erstmal erreichen, dass er in die Fälle springt in die er soll.)Danke MfG DD
Franz-PeterTeilnehmerWoher weist Du, dass er nicht in case 2 springt?
Dein Serial.println wird nie ausgeführt:break; Serial.println(“case 2”); case 2:
da es zwischen dem break; und dem case 2: steht, steht es sozusagen im ‘Niemandsland’ und wird nie ausgeführt.
DoubleDeeTeilnehmerDanke für die Hilfe, hab mittlerweile alles so hin bekommen wie ich es wollte. Mein Fehler war ein falsch gesetztes oder ein fehlendes Semikolon.
Franz-PeterTeilnehmerDann ist ja alles ok.
-
AutorBeiträge