Counter Code mehrfach verwenden

Guten Morgen liebe Community.
Ich bin mal wieder am rum probieren.
Letztes mal wurde mir schon mal bei sowas ähnlichem geholfen und ich dachte, dass ich es verstanden habe, dem war aber nicht so.
Ich habe ein „counter“ den ich öfter benutzen möchte und es will einfach nicht funktionieren.
Woran liegt es, was habe ich da noch nicht ganz verstanden ?

Danke an euch und liebe Grüße

byte counter_1 = 0;
byte statusAltCounter_1 = 0;
byte dataPin_1= 6;

byte counter_2 = 0;
byte statusAltCounter_2 = 0;
byte dataPin_2= 7;

void setup() 
{
Serial.begin(9600);
pinMode(dataPin_1, INPUT);
pinMode(dataPin_2, INPUT);
}

void loop()
{

counter_area(statusAltCounter_1,counter_1,dataPin_1); 
counter_area(statusAltCounter_2,counter_2,dataPin_2);
Serial.println(counter_1);
Serial.println(counter_2);
}

void counter_area(byte dataStatusAlt, byte counter, byte data)
{
 if(dataStatusAlt !=data)
{
  if(data==1)
{
  counter++;
}
  }
dataStatusAlt =data;
counter = counter % 2;

return counter;

}

Hallo,
nehme dir ein bißchen Zeit und studiere die An- und Verwendung vun struct´s und array´s. Das magische Wort dazu lautet: User Defined Data Types - UDT.

Ich rate dir nicht so viel zu probieren!
Sondern vorher ein C++ Buch zu lesen.
Dann die dort beschriebenen Verfahren probieren, mit dem Ziel sich selber zu prüfen ob man/frau es kapiert hat.

Tipps:
Gleichartige Daten gehören in ein Array. Verschiedenartige Daten in eine Struktur.
Durchnummerieren von Variablen ist böse.
Es gibt 3 Verfahren Daten in eine Funktion zu bekommen.
Per Value, per Pointer, oder per Referenz.

1 Like

Sehr gut und Danke dann weiß ich schon mal wonach ich suchen muss.

Hallo
Ich buddel nachher mal in meiner Sketchkiste um dafür ein Beispiel zum Studieren zu finden.

1 Like

Hier mal eine Variante:
KA, ob sie das tut was du willst....
Vermutlich muss es noch "repariert" werden.

class Counter
{
  private:
    const byte pin;
    byte status;
    byte value;

  public:
    Counter(const byte pin): pin(pin), status(0), value(0) {}
    void begin()
    {
      pinMode(pin, INPUT);
    }

    byte count()
    {
      bool data = digitalRead(pin);
      if(status != data)
      {
        if(data) value++;
      }
      status = data;
      value %= 2;
      return value;
    }
    
    operator byte() const
    {
      return value;
    }
};


Counter counter[] {6, 7};

void setup()
{
  Serial.begin(9600);
  for(Counter &c : counter) c.begin();
}

void loop()
{
  Serial.println("---------");
  for(Counter &c : counter)
  {
    c.count();
    Serial.println(c);
  }
}

1 Like

Oh man.. ich merke gerade, dass es doch nicht so schnell und ein einfach geht, wie ich dachte.

Und dann soll das Ganze auch erweiterbar sein, wenn ich ein "input 3" verwenden möchte. Das ist ganz schon harter Tobak bis jetzt für mich (das was ich bis jetzt darüber gelesen habe).

Ich mein.... der Counter an sich funktioniert ja schon :laughing:

@ardouinee
ich glaube du sollst zunächst mal ein wenig googeln & lesen

"c++ array" und "arduino array"
damit es eben nicht counter_1, counter_2, counter_3 braucht.
Übrigens, c++ beginnt gerne mit dem Zählen bei 0. Gewöhne dich daran.

Zweiter Suchbegriff:

"c++ struct"

1 Like

@noiasca
Moin, auf was ist das bezohen ? Auf arrays ?

indirekt.
ich stoße mich aber an DEINEN Variablennamen:

byte counter_1 = 0;
byte counter_2 = 0;

a) --> Array
b) --> bei Arrays beginnt der Index mit 0.

Moin
Die Zuordung von Namen läßt sich so lösen:

enum {Counter_1, Counter_2, Counter_3}; // Namen der Counter zuorden 

Ja, so ist das Leben....
Kaum macht man ein Türchen auf, verstecken sich dahinter ganze Weltanschauungen.

Das habe ich dir immerhin schon fertig vorgekaut.

Jetzt blos nicht kneifen.

Glaube ich nicht.
Da du nirgendwo in deinem Code den Pin auswertest....
Entprellen wird auch noch notwendig werden.

1 Like

Das Stimmt.. in diesem code nicht aber in einer abgespeckten version wo nur ein counter ist .
Ja du hast Recht, hier ist keine Entprellung drin die kommt später. Bzw. die habe ich schon (bounce2)

Niemals!!! :sweat_smile:

Hallo,
hier kommt der versprochende Sketch, für das Studium, für die Anwendung in einfachen Sketchen unter der Verwendung von C++.

// BLOCK COMMENT
// https://www.learncpp.com/cpp-tutorial/
// https://forum.arduino.cc/t/counter-code-mehrfach-verwenden/903725
#define ProjectName "Counter Code mehrfach verwenden"
// CONSTANT DEFINITION
// you may need to change these constants to your hardware and needs
constexpr byte Input_[] {A0, A1, A2};  // button pins connect to GND
// VARIABLE DECLARATION AND DEFINTION
enum {Counter_1, Counter_2, Counter_3}; // Namen der Counter zuorden
unsigned long currentTime;
struct COUNTER {  // common structure for the counters with the following members
  byte pin;
  bool state_;
  int counter_;
  int mod;
  String text;
} counters[] {  // initialization of counter 1 to counter 3
  {Input_[Counter_1], 0, 0, 2, "Hänsel"},
  {Input_[Counter_2], 0, 0, 3, "Gretel"},
  {Input_[Counter_3], 0, 0, 4, "der böse Wolf"},
};
struct TIMER {
  unsigned long duration;
  unsigned long stamp;
};
TIMER scanButton{20, 0}; // initialization of button scan timer
// FUNCTIONS
bool checkTimer(TIMER & time_) {  // generic time handler function using TIMER struct
  if (currentTime - time_.stamp >= time_.duration) {
    time_.stamp = currentTime;
    return true;
  } else return false;
}
void setup() {
  Serial.begin(9600);
  Serial.println(F("."));
  Serial.print(F("File   : ")), Serial.println(__FILE__);
  Serial.print(F("Date   : ")), Serial.println(__DATE__);
  Serial.print(F("Project: ")), Serial.println(ProjectName);
  pinMode (LED_BUILTIN, OUTPUT);
  // now follows a very important instruction to minimize coding work.
  // this instruction is named Range-BasedForLoop and instructs the compiler to do the coding work.
  for (auto Input : Input_) pinMode(Input, INPUT_PULLUP);
}
void loop () {
  currentTime = millis();
  digitalWrite(LED_BUILTIN, (currentTime / 500) % 2);
  if (checkTimer(scanButton)) { // timer to scan buttons
    // now follows a very important instruction to minimize coding work.
    // this instruction is named Range-BasedForLoop and instructs the compiler to do the coding work.
    for (auto &counter : counters) {
      bool stateNew = !digitalRead(counter.pin); // read current button state
      if (counter.state_ != stateNew) {        // any changes?
        counter.state_ = stateNew;             // interlock
        if (stateNew) {                        // button pressed?
          counter.counter_++;                 // increment counter
          counter.counter_ = counter.counter_ % counter.mod;
          Serial.print(counter.text), Serial.print(F(" = ")), Serial.println(counter.counter_);
        }
      }
    }
  }
}
1 Like

Oh man.... ich steige da noch nicht ganz durch... es ähnelt aber dem von @combie
(so sieht es zumindest aus)

ich acker das heute Abend weiter durch ... ich brauche eine Pause

Ich bin mir nicht sicher, aber das [quote="ardouinee, post:1, topic:903725"]
counter = counter % 2;
[/quote] sollte eigentlich nur 0 oder 1 in counter speichern. Oder hab ich gerade ein Knoten im Hirn.

Wenn dem so ist, kann der Counter nicht größer werden.

Edit: Warum geht das Zitat nicht richtig? :roll_eyes:

Nein, hast Du nicht :wink:

Gruß Tommy

@Plumps
Das ist richtig :slight_smile:

Na dann ist es ja auch der Grund warum der Counter sich nicht erhöht.

Oder habe ich das falsch verstanden und es ist nicht das was nicht funktioniert?

Ach soo, ich möchte den Code-Schnipsel öffter verwenden.