[gelöst] void loop frühzeitig beenden und neu starten (Befehl) (gelöst)

hey, ich will die void loop() fuktion in einer if schleife frühzeitig neu starten (per Befehl). Von dem goto Befehl den ich anderen Beiträgen gefunden habe wird nur abgeraten.

Habt ihr gute Ideen?

Beispielcode:

if (uidvergleich()) //change here the UID of the card/cards that you want to give access
    
  {
    digitalWrite(green_led, HIGH);
    delay(1000);
    digitalWrite(green_led,LOW);
    delay(1000
// Hier soll Void loop neugestartet werden 
  }

Dein Ansatz ist grundsätzlich falsch.
Die loop muss weiterlaufen, aber deine eigenen Funktionen kannst du entsprechend neu ansteueren.

Einfach alles, was Du nicht ausführen wilst in ein if oder zugehöriges else packen, ist der saubere Weg.
Du kannst es auch mit return versuchen.

Gruß Tommy

Hallo
probier mal asm "jmp 0";

probier mal asm "jmp 0";

... wenn du "fast" einen Reset machen willst.
Alle Globalen Variablen sind weg, aber die Hardware wird nicht richtig zurückgesetzt. Davon wird daher in der Regel abgeraten. Der Sketch startet wieder vor setup().

michael_x:
... wenn du "fast" einen Reset machen willst.
Alle Globalen Variablen sind weg, aber die Hardware wird nicht richtig zurückgesetzt. Davon wird daher in der Regel abgeraten. Der Sketch startet wieder vor setup().

moin
probieren geht über studieren :slight_smile:

if schleife

If schleife
Zudem kannst du die loop Funktion jederzeit mit return beenden.
Neu gestartet, wird sie sofort danach, voll automatisch.

Ansonsten:
Deine Ideen sind so seltsam, dass ich annehmen muss, dass dir ein modernes C++ Buch richtig gut tun würde.


moin
probieren geht über studieren :slight_smile:

Nööö, das ist doch nur eine Durchhalteparole für Nicht- leser/denker

@combie

if schleife

ohha der link ist gut :wink:

Heinz

Danke hat geklappt. Das Thema kann geschlossen werden. Hab euch alle lieb

ahhd456:
Danke hat geklappt. Das Thema kann geschlossen werden. Hab euch alle lieb

Dann solltest du auch hier deine Lösung präsentieren. Das ist hier so allgemein üblich und hilft anderen Usern, so wie wir dir helfen konnten.

Und danke für deine Rückmeldung.

#include <SPI.h> // Inklusion der Bibeleothek
#include <MFRC522.h>// Inklusion der Bibeleothek

#define RST_PIN   9     // SPI Reset Pin
#define SS_PIN    10    // SPI Slave Select Pin

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Instanz des MFRC522 erzeugen



int a = 0; // Durchgang erste uid 1 abfrage
int b = 0; // durgang zweite uid 2 abfrage
byte uid1[] = {0xC0, 0xDA, 0xC6, 0x35}; //uid^1
byte uid2[] = {0x6C, 0xD1, 0xDD, 0x21}; //uid^2
byte uid3[] = {0xD2, 0xFB, 0x2C, 0x5B}; //uid^3
byte geleseneuid[] = {0x00, 0x00, 0x00, 0x00}; //gelesene Uid




int green_led = 3; // Pin der blauen LED
int red_led = 5; // Pin der roten LED
int relais = 4; // Pin des Relais
int dauerueberfahrtsek = 10; // Dauer der Überfahrt in sek
int d = 0; //Testvariable


void setup() {
  // Diese Funktion wird einmalig beim Start ausgeführt
  Serial.begin(9600);  // Serielle Kommunikation mit dem PC initialisieren
  SPI.begin();         // Initialisiere SPI Kommunikation
  mfrc522.PCD_Init();  // Initialisiere MFRC522 Lesemodul
  pinMode(green_led, OUTPUT); // Defenierung der Pins
  pinMode(red_led, OUTPUT);// Defenierung der Pins
  pinMode(relais, OUTPUT); //Defenierung der Pins
}

void loop() {


  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    delay(50); //schauen ob karte da ist
    return;
  }

  // Now a card is selected. The UID and SAK is in mfrc522.uid.

  // Dump UID
  Serial.print(F("Card UID:"));
  for (byte i = 0; i < mfrc522.uid.size;  i++) {                               // Auslesen der Karte
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    geleseneuid[i] = mfrc522.uid.uidByte[i];

  }
  Serial.println();
  Serial.println(geleseneuid[1], HEX);
  Serial.println(uid1[1], HEX);




  if (uidvergleich1() ) //change here the UID of the card/cards that you want to give access

  {
    digitalWrite(green_led, HIGH);
    digitalWrite(relais, HIGH);
    delay(dauerueberfahrtsek * 1000);                 // wenn erste uid true ist
    digitalWrite(green_led, LOW);
    digitalWrite(relais, LOW);
    delay(1000);
    // Hier soll Void loop neugestartet werden
  }
  else {
    if (uidvergleich2()) //change here the UID of the card/cards that you want to give access

    {
      digitalWrite(green_led, HIGH);
      digitalWrite(relais, HIGH);
      delay(dauerueberfahrtsek * 1000);             // wenn zweite uid true ist und erste false
      digitalWrite(green_led, LOW);
      digitalWrite(relais, LOW);                 
      delay(1000);
      // Hier soll Void loop neugestartet werden
    }
    else {
      digitalWrite(red_led, HIGH);
      delay(1000);                                // wenn uid 1 und uid2 false sind
      digitalWrite(red_led, LOW);
    }
  }

  delay(1000);
}

boolean uidvergleich1() {                 // uid 1 vergleich unterprogramm
  switch (a) { // Für die erste UID
    case 0:
      if (mfrc522.uid.uidByte[a] != uid1[a]) {
        return false;
        Serial.print(d);
      } else {
        a++;
      }
      break;
    case 1: if (mfrc522.uid.uidByte[a] != uid1[a]) {
        return false;
        Serial.print(d);
      } else {
        a++;
      }
      break;
    case 2: if (mfrc522.uid.uidByte[a] != uid1[a]) {
        return false;
        Serial.print(d);
      } else {
        a++;
      }
      break;
    case 3: if (mfrc522.uid.uidByte[a] != uid1[a]) {
        return false;
        Serial.print(d);
      } else {
        return true;
      }
      a = 0;

      break;
  }
}

boolean uidvergleich2() {       // uid 2 vergleich unterprogramm
  switch (b) { // Für die erste UID
    case 0:
      if (mfrc522.uid.uidByte[b] != uid2[b]) {
        return false;
        Serial.print(d);
      } else {
        b++;
      }
      break;
    case 1: if (mfrc522.uid.uidByte[b] != uid2[b]) {
        return false;
        Serial.print(d);
      } else {
        b++;
      }
      break;
    case 2: if (mfrc522.uid.uidByte[b] != uid2[b]) {
        return false;
        Serial.print(d);
      } else {
        b++;
      }
      break;
    case 3: if (mfrc522.uid.uidByte[b] != uid2[b]) {
        return false;
        Serial.print(d);
      } else {
        return true;
      }
      b = 0;

      break;
  }
}

Der gesamte Code ^^^

 if (uidvergleich1() ) //change here the UID of the card/cards that you want to give access

  {
    digitalWrite(green_led, HIGH);
    digitalWrite(relais, HIGH);
    delay(dauerueberfahrtsek * 1000);                 // wenn erste uid true ist
    digitalWrite(green_led, LOW);
    digitalWrite(relais, LOW);
    delay(1000);
    // Hier soll Void loop neugestartet werden
  }
  else {
    if (uidvergleich2()) //change here the UID of the card/cards that you want to give access

    {
      digitalWrite(green_led, HIGH);
      digitalWrite(relais, HIGH);
      delay(dauerueberfahrtsek * 1000);             // wenn zweite uid true ist und erste false
      digitalWrite(green_led, LOW);
      digitalWrite(relais, LOW);                 
      delay(1000);
      // Hier soll Void loop neugestartet werden
    }
    else {
      digitalWrite(red_led, HIGH);
      delay(1000);                                // wenn uid 1 und uid2 false sind
      digitalWrite(red_led, LOW);
    }
  }

^^^ Der erfragte Teil

Prima und danke.
Jetzt nur noch ein [gelöst] vor den Titel deines Einganspost setzen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.