Sachen nur einmal ausführen bzw wert digitalRead ändern

ich entschuldige mich schon im vorraus ich bin ein noob wie aus dem bilderbuch :slightly_frowning_face:
und zwar hab ich eine frage die mich jetzt schon 7 tage hinhält.
wie kann ich ich in einem loop eine if-schleife nur einmal ausführen obwohl der wert von digitalread noch immer true ist oder kann ich manuell den wert auf false machen?
also beuspiel: wert ist true servos bewegen sich, wert wird manuell auf false gesetzt(ist aber noch true), er wird dann false weil mein relay schaltet und dann wieder wirklich true ( servos bewegen sich)
falls nötig kann ich den code auch noch posten :+1:
vielen dank im vorraus

Dann mal los.

Gut formatiert, mit Kommentaren und in Codetags .

Gibt es nicht. Das ist eine Entscheidung.
Merke Dir in einer Variable, dass Du es ausgeführt hast und setze die mit in die Bedingung.

Gruß Tommy

// Forensketch Nur einmal auslösen im loop()
// https://forum.arduino.cc/t/sachen-nur-einmal-ausfuhren-bzw-wert-digitalread-andern/1114419


bool isAn = false;
const byte inputPin = 2;

void setup()
{
  Serial.begin(9600);
  Serial.println(F("sTART..."));
  pinMode(inputPin, INPUT_PULLUP); // Taste schaltet nach GND! Keine externe beschaltung
}

void  loop()
{
  if (digitalRead(inputPin) == LOW) // Taste gedrückt
  {
    if (isAn == false)
    {
      Serial.println(F("Diesen Text siehst Du nur einmal"));
      isAn = true;
    }
  }
}

Die Forderung sollte man wohl nicht so wörtlich nehmen

void  loop()
{
  if (digitalRead(inputPin) == LOW) // Taste gedrückt
  {
    if (isAn == false)
    {
      Serial.println(F("Diesen Text siehst Du nur einmal"));
      isAn = true;
    }
  } else 
      isAn = false; // Rücksetzen für den nächsten HIGH-LOW - Übergang
 delay(5); // Entprellen nicht vergessen
}

Hilf mir mal bitte - was habe ich übersehen?

Nix, bin nur zu schnell/aus Versehen auf die Absende-Taste gekommen

#include "HCPCA9685.h"


#define I2CAdd 0x40


HCPCA9685 HCPCA9685(I2CAdd);

bool button0read = false;
bool button0on = false;
bool switch0 = false;
bool relayRead = false;

unsigned long button0Millis = 0;

unsigned long relaiMillis = 0;

unsigned long relaiMillisDelay = 7000;


void setup() {
  pinMode(50, INPUT_PULLUP);
  pinMode(40, OUTPUT);
  pinMode(30, INPUT);
  HCPCA9685.Init(SERVO_MODE);
  HCPCA9685.Sleep(false);
}

void loop() {


  button0read = digitalRead(50);
  relayRead = digitalRead(30);
  unsigned int Pos;


  if (button0read == true) {
    button0Millis = millis();
  }

  if (button0read == false && button0on == false && millis() - button0Millis > 20) {
    button0on = true;
  }

  if (button0read == true && button0on == true) {
    button0on = false;
    switch0 = !switch0;
    relaiMillis = millis();
  }

  if (millis() - relaiMillis > relaiMillisDelay) {  
    switch0 = false;
  }
  if (switch0 == true) {
    digitalWrite(40, true);
  } else {
    digitalWrite(40, false);
  }


  if (relayRead == false) {  // das möchte ich nur einmal ausführen wenn er auf false ist 


    for (Pos = 10; Pos < 450; Pos++) {
      HCPCA9685.Servo(3, Pos);
      HCPCA9685.Servo(8, Pos);
    }

    for (Pos = 450; Pos >= 10; Pos--) {
      HCPCA9685.Servo(3, Pos);
      HCPCA9685.Servo(8, Pos);
      
    }
  }
}

der rest funktioniert eigentlich gut

ach ja und normal arbeite ich auf der baustelle :joy: also falls meine kreation bullsh*t ist ichhabe nur erfahrung mit beton :crazy_face:

Da gibts sicher noch das eine oder andere zu bauen, aber der hier macht wohl das, was Du willst.

#include "HCPCA9685.h"


#define I2CAdd 0x40


HCPCA9685 HCPCA9685(I2CAdd);

bool button0read = false;
bool button0on = false;
bool switch0 = false;
bool relayRead = false;

bool isAn = false;

unsigned long button0Millis = 0;

unsigned long relaiMillis = 0;

unsigned long relaiMillisDelay = 7000;


void setup()
{
  pinMode(50, INPUT_PULLUP);
  pinMode(40, OUTPUT);
  pinMode(30, INPUT);
  HCPCA9685.Init(SERVO_MODE);
  HCPCA9685.Sleep(false);
}

void loop()
{
  button0read = digitalRead(50);
  relayRead = digitalRead(30);
  unsigned int Pos;
  if (button0read == true)
  {
    button0Millis = millis();
  }
  if (button0read == false && button0on == false && millis() - button0Millis > 20)
  {
    button0on = true;
  }
  if (button0read == true && button0on == true)
  {
    button0on = false;
    switch0 = !switch0;
    relaiMillis = millis();
  }
  if (millis() - relaiMillis > relaiMillisDelay)
  {
    switch0 = false;
  }
  if (switch0 == true)
  {
    digitalWrite(40, true);
  }
  else
  {
    digitalWrite(40, false);
  }
  if (relayRead == false)    // das möchte ich nur einmal ausführen wenn er auf false ist
  {
    if (isAn == false)
    {
      isAn = true;
      for (Pos = 10; Pos < 450; Pos++)
      {
        HCPCA9685.Servo(3, Pos);
        HCPCA9685.Servo(8, Pos);
      }
      for (Pos = 450; Pos >= 10; Pos--)
      {
        HCPCA9685.Servo(3, Pos);
        HCPCA9685.Servo(8, Pos);
      }
    }
  }
  else
  { isAn = false; }
}

ich bin so dumm =( jetzt wi ich die lösung sehe hätte ich auch selber draufkommen können aber vielen lieben dank :smiley:

1 Like

Gut gemeinter Hinweis noch von mir:

Mach sowas nicht.
Benenne einen PIN, mach den Wert konstant und arbeite im gesamten Sketch nur mit dem Namen.
A) Weisst Du später nicht mehr, was der Pin wirklich für eine Zuordnung hat
B) Wenn sich der PIN ändert, suchst Du im gesamten Code jedes Vorkommen
Siehe mein Beispiel oben. :wink:
Na dann viele Grüße an den Betonwerker.

(Als ich jung war Zement gebrannt im Drehrohrofen...)

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