Eine Funktion innerhalb eines Loops nur einmal ausführen

Moin zusammen.
Hab noch recht wenig Erfahrung mit der Arduino Sprache und deswegen jetzt ne Frage.
Es geht um folgendes: Ich habe mir was gebaut um 2 Servos via Blynk mit meinem Handy steuern zu können. Ich habe mir an meinem Raspberry Pi angewöhnt mit Blynk irgendeinen Pin anzusteuern um dann diesen auf High bzw Low zu testen und dann demzufolge Aktionen auszuführen. Lange Rede kurzer Sinn, hier also mein Code (Ich entschuldige mich schonmal dafür, dass der so stümperhaft ist… :D) :

#define BLYNK_PRINT Serial

#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial SwSerial(10, 11); // RX, TX
    
#include <BlynkSimpleSerialBLE.h>
#include <SoftwareSerial.h>

char auth[] = "3T6fIgHyLmR_sfsP7gXpGSrAWljxuA7b";
int inPin = 13;
int val = 0;

Servo onSwitch;
Servo offSwitch;

SoftwareSerial SerialBLE(10, 11); // RX, TX

void setup()
{
  pinMode(inPin, INPUT);
  onSwitch.attach(5);
  offSwitch.attach(4);
  
  Serial.begin(9600);

  SerialBLE.begin(9600);
  Blynk.begin(SerialBLE, auth);

  Serial.println("Waiting for connections...");
}

void loop()
{
  Blynk.run();
  
  val = digitalRead(inPin);

  if (val == HIGH) {
    onSwitch.write(0);
    offSwitch.write(180);
    }
  else {
    onSwitch.write(180);
    offSwitch.write(0);
  }
}

Der ein oder andere mag es kennen. Servos haben dieses zittern wenn sie dauerhaft den Befehl für ein und die selbe Position haben. Dies liese sich ja mit " servoName.write(LOW) " deaktivieren. Würde ich das allerdings überall unten mit ran hängen ergäbe das ja recht wenig Sinn, da die Zeilen ja trotzdem kontinuirlich durchlaufen. Hier in Kurzform die Situation und was ich brauche:

  • es soll dauerhaft der Status des Test Pins (inPin) getestet werden
  • kommt es zu einer Veränderung an diesem, sollen die zugehörigen Zeilen exakt einmal ausgeführt werden und dann wieder in den “Standby” gegangen werden

Ich hoffe mein Anliegen ist verständlich :smiley:
Vielen Dank schonmal im Voraus

MfG

Arduino Sprache

Die Arduino Sprache ist C++
Es könnte sinnvoll sein, ein Buch anzuschaffen, so ein schönes dickes, mit über 1000 Seiten.

Ich hoffe mein Anliegen ist verständlich

Halbwegs.
BLYNK ist mir fremd.

Mir scheint, du möchtest eine Ablaufsteuerung bauen, mit Flankenerkennung, endlichen Automaten, usw.

Moin,

das was Du suchst ist ein mitführen einer boolchen statusvariablen.

Ausm Kopf:

 if (val == HIGH)
   {
   if Status == HIGH)
   {
   Status = LOW
   }
 }
else
  {
   if Status == LOW)
  {
 Status == HIGH
  }
 }

Deine Codezeilen müssen bei der Statuszuweisung rein.

Du hast doch schon aufgeschrieben was eigentlich zu tun ist.

Fehlt nur noch die Übersetzung nach C/C++ - Schritt für Schritt jede Teilaufgabe einzeln:

int status;

void setup()
{
  ...
  // initialen Wert feststellen
  status = digitalRead(inPin);
}

void loop()
{
  // "es soll dauerhaft der Status des Test Pins (inPin) getestet werden"
  int val = digitalRead(inPin);

  // "kommt es zu einer Veränderung an diesem"
  if (val != status)
  {
    if (val == HIGH)
    {
      // "sollen die zugehörigen Zeilen exakt einmal ausgeführt werden"
      // hier den Übergang von LOW nach HIGH behandeln
    }
    else
    {
      // "sollen die zugehörigen Zeilen exakt einmal ausgeführt werden"
      // hier den Übergang von HIGH nach LOW behandlen
    }

    // "dann wieder in den 'Standby'
    // aktuellen Zustand merken
    status = val;
  }
}

(auch aus dem Kopf)

Nebenbei bemerkt:
Der inPin wird sich nicht ändern, also const int.
Dein "val" muss nicht global sein; Vereinbarung in loop() reicht, denn Du brauchst das nirgends sonst.
Für einen Pin (Nummer inPin, Wert val und Status status) braucht es eigentlich kein int, ein byte reicht. Aber das steht halt schon ewig so in den Beispielen.

Gruß Walter

wno158:
Der inPin wird sich nicht ändern, also const int.

Besser const byte. Soviele Pins hast Du nicht :wink:

Gruß Tommy