Programmier Probleme mit Schalter

Guten Tag,

ich möchte mit meinem Schalter bei jedanmal drücken um 1 höher Zählen lassen.
Das problem ist das die Variable nicht gespeichert wird, wo durch sie sich selbst immer auf 0 zurücksetzt.

int i = 0;
if (digitalRead(4) == HIGH){
i = i+1;
Serial.print(i);
delay(1000);
}
else (i > 9);{
i = 0;
}

kann mir bitte wer helfen?

Zeige uns bitte den kompletten Sketch (in Codetags). Das Verhalten ist abhängig vom Ort der Deklaration der Variablen.

Gruß Tommy

Falls das deine Loop sein sollte, setzt du mit dem Befehl int i = 0; die Variable jede Sekunde (bzw. jeden Durchlauf) wieder auf 0. Der Befehl gehört in den Deklarationsteil.

Hi

Da Du i VOR dem IF auf Null setzt - was erwartest Du sonst, als die Setzung auf Null. Dann die IF und so vll. die Zählung bis 1.

SO kompiliert das Zeug? Kann ich mir eigentlich gar nicht vorstellen, daß die Klammer beim ELSE erlaubt ist ... Ööh ... jetzt wird's nur noch seltsamer - die Klammer IST der Else-Zweig - dürfte wohl ausgewertet und verworfen werden, sofern Das keinen Error wirft. Drunter, das i=0, ist nur ein eigener Block - worin lokale Variablen gekapselt wären.

Drück Mal in der IDE STRG+T - Das rückt den Kram auf Klammer-Ebene ein - man sieht, was zusammen gehört.

Gerne den Sketch auch in Code-Tags.

MfG

kann mir bitte wer helfen?

Wie stellst du dir das vor?

So: ?!?!?

#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>

using Combie::Tools::FlankenErkennung;
using Combie::Timer::EntprellTimer;


using EingabeTaster = Combie::Pin::TasterGND<4>; // Taster zwischen Pin und GND(invertierend)
using Counter       = Combie::Tools::Counter<uint16_t>;

EingabeTaster     taster; 
EntprellTimer     entprellen(20);
FlankenErkennung  flankenerkennung;
Counter           counter;


void setup() 
{
  Serial.begin(9600);
  taster.initPullup();
  counter.onCount([](Counter &counter){Serial.println(counter);});
}

void loop() 
{
  counter = flankenerkennung = entprellen = taster;
}

CombieLib.zip (68.6 KB)

Hallo,

habe mal meinen “Monoflop” aus meiner Lib herausoperiert. Die Besonderheit ist, dass der Taster 4x aller Entprellzeit durch 4 +/- 4 ms abgefragt wird. Der Taster ist damit nicht nur entprellt sondern auch enstört. Durch das +/- 4ms kann auch kein zufällig passender Störtakt ein falsches Tastersignal auslösen.

/*
  Doc_Arduino - german Arduino Forum
  IDE 1.8.10
  avr-gcc 9.2.0
  Arduino Mega2560
  23.12.2019
*/

const byte pinTaster = 2;
byte counter;

void setup(void) {
  Serial.begin(9600);
  pinMode(pinTaster, INPUT_PULLUP);
}

void loop(void) {

  bool state = updateNoRetrigger(pinTaster, 30);

  if (state) {
    counter++;
    Serial.println(counter);
  }
}


// ****** Funktionen ******

bool updateNoRetrigger(const byte pin, const unsigned int debounce)
{
  bool state {false};
  static bool oldRead {true};

  bool read = updateDetect(pin, debounce);

  if (read && (oldRead == LOW) ) {
    state = true;
  }
  oldRead = read;

  return state;
}


bool updateDetect (const uint8_t pin, const uint16_t debounce)
{
  uint16_t compare {debounce / 4 + 2};
  static uint32_t lastMillis {0};
  static int8_t count {0};
  static bool state {false};

  enum class Detect : uint8_t {one, two};
  static Detect mode {Detect::one};

  uint32_t ms = millis();

  if (ms - lastMillis > compare)
  {
    lastMillis = ms;

    // pendelt in nicht syncronen Zeitabständen (debounce/4 (+/-) x) und fragt den Taster ab, ob gedrückt oder nicht,
    // wenn innerhalb der Entprellzeit 4x der Tastendruck erkannt wurde, kann 'count' bis 4 inkrementieren,
    // ansonsten wird dekrementiert
    switch (mode)
    {
      case Detect::one:   if (!digitalRead(pin) ) {
          count++;
        }
        else {
          count--;
        }
        compare -= 4;
        mode = Detect::two;
        break;

      case Detect::two:   if (!digitalRead(pin) ) {
          count++;
        }
        else {
          count--;
        }
        compare += 4;
        mode = Detect::one;
        break;
    }

    // wenn Tastendruck sicher erkannt wurde, gibt es ein 'true' zurück, ansonsten 'false'
    if (count >= 4) {
      count = 4;
      state = true;
    }
    else if (count <= 0) {
      count = 0;
      state = false;
    }

  }
  return state;
}