Hilfe, Anfänger, LED soll erst nach zweimal tasten kurz angehen

Hallo ich bin nicht fähig... :confused: ich muss einen Reedkontakt am Digitaleingang so abfragen das er nur bei jedem zweiten impuls einen ausgang für, ich sage mal 500ms auf HIGH setzt. Ziel ist mit ganz geringem aufwand die Radgröße meines Ergometers auf eine Fahrradapp anzupassen (REED 2x = einmal Impuls an den Tachoeingang am (schliesser Kontakt am Ergometer bzw. BT empfänger) oder einfacher Impuls halbieren oder anpassen halt.

Vielleicht gibts ja nen netten Menschen der mir da mal nen Sketch verfassen könnte, DANKE

MfG Markus

Erzähl deiner App doch, dein Fahrrad hätte kleinere Räder.

Moin,

ich weiß nicht genau, ob es das ist, was Du brauchst und es ist denke ich auch nicht die eleganteste Lösung, doch probieren kannst du das:

int i = 0;

void setup() {
  pinMode(5, INPUT);  //dort schließt du den reed-Kontakt an
  pinMode(6, OUTPUT); // für deine APP, der Ausgang wird jede 2. Umdrehung auf HIGH gesetzt
  digitalWrite(6, LOW);

}

void loop() {
  if(5 == HIGH && i == 0){
    i++;
    delay(100);         //hier musst du den skatch etwas anpassen, die ms müssen etwas mehr sein, als die Zeit, die dein reed Kontakt an ist.
    
  }
  if(5 == HIGH && i == 1){
    digitalWrite(6, HIGH);
    i = 0;
    delay(500);       //solange dein Ausgang 5V haben soll, ich schätze, deine 500ms sind zu viel.
    digitalWrite(6, LOW);
  }
}

VG
Finn

Hi

versuch Mal Das:

bool merker;  //global werden die Variablen ohne Angabe mit 0 angelegt - wir brauchen nur 0 oder 1 ) bool(ean)

const byte reedPin=5;     //Die benutzten Anschlüsse - im Sketch mit Name anzusprechen - bis zur Pin-Nummer 255 reicht BYTE
const byte appPin=6;      //keine 'magic numbers' - also feste Zahlen, wo Keiner weiß, woher Diese kommen

void setup() {
  pinMode(reedPin, INPUT_PULLUP);  //dort schließt du den reed-Kontakt an, anderes Ende an GND
  pinMode(appPin, OUTPUT); // für deine APP, der Ausgang wird jede 2. Umdrehung auf HIGH gesetzt
}

void loop() {
  if (digitalRead(reedPin)!=merker){
    delay(50);                    //Reed-Kontakt 'entprellen'
    digitalWrite(appPin,merker);  //Zustand auf Ausgangs-Pin
    merker=1-merker;              //Zustand umdrehen
  }
}

MfG

/* Nach zwei Impulsen am Input-Pin erfolgt ein Impuls am Output-Pin.
   Impuls-Dauer (Output): onTime

   Eine Kombination der Beispiele zur Flankenerkennung (StateChangeDetection):
   https://www.arduino.cc/en/Tutorial/StateChangeDetection
   und BlinkWithoutDelay:
   https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/

const byte INPUT_PIN  =  5;     // Reed Kontakt. Anderes Ende an GND.
const byte OUTPUT_PIN = 13;  // Die eingebaute LED - nach eigenen Gegebenheiten ändern.

bool reedState = true;
bool lastReedState = true;

const unsigned long onTime = 100;
unsigned long currentMillis;
unsigned long lastMillis;

int zaehler;

void setup() {
  pinMode(INPUT_PIN, INPUT_PULLUP);
  pinMode(OUTPUT_PIN, OUTPUT);
}

void loop() {
  // Eingabe:
  reedState = digitalRead(INPUT_PIN);
  currentMillis = millis();

  // Verarbeitung: Flankenerkennung (state change detection)
  if (reedState != lastReedState) {
    delay(30);                 // Entprellen, quick & dirty
    if (reedState == LOW) {    // Reed-Kontakt wurde geschlossen
      zaehler++;
      lastMillis = currentMillis;
    }
    if (reedState == HIGH) {   // Reed-Kontakt wurde geöffnet
      // Einstweilen passiert hier nichts...
    }
    lastReedState = reedState;
  }

  // Ausgabe:
  if (zaehler >= 2) {
    digitalWrite(OUTPUT_PIN, HIGH);
    if (currentMillis - lastMillis >= onTime) {
      digitalWrite(OUTPUT_PIN, LOW);
      zaehler = 0;
    }
  }
}