Zum Inhalt springen

Unabhänige Loops Programmieren

Projekte und Tutorials für Arduino Foren StartHardware-Forum Unabhänige Loops Programmieren

Ansicht von 8 Beiträgen - 1 bis 8 (von insgesamt 8)
  • Autor
    Beiträge
  • #7514 Antworten
    DoubleDee
    Teilnehmer

    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.

    #7516 Antworten
    Franz-Peter
    Teilnehmer

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

    #7678 Antworten
    DoubleDee
    Teilnehmer

    Okay, 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üfen

    digitalWrite(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 loop

    In 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

    #7679 Antworten
    DoubleDee
    Teilnehmer

    Warum wirde meinen letzter Eintrag nicht veröffentlicht?

    #7680 Antworten
    DoubleDee
    Teilnehmer

    Okay, 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üfen

    digitalWrite(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 loop

    In 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

    #7846 Antworten
    Franz-Peter
    Teilnehmer

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

    #7847 Antworten
    DoubleDee
    Teilnehmer

    Danke für die Hilfe, hab mittlerweile alles so hin bekommen wie ich es wollte. Mein Fehler war ein falsch gesetztes oder ein fehlendes Semikolon.

    #7848 Antworten
    Franz-Peter
    Teilnehmer

    Dann ist ja alles ok.

Ansicht von 8 Beiträgen - 1 bis 8 (von insgesamt 8)
Antwort auf: Antwort #7679 in Unabhänige Loops Programmieren
Deine Information: