Variable hochzählen wenn Ausgänge auf HIGH gesetzt werden

Hey ho in die Runde,
ich hab da ein Anliegen bezüglich eines kleinen Projektes.
Und zwar habe ich ein relativ langes Programm und ich brauche eine Möglichkeit wie ich eine Variable hochzählen lassen kann, wenn ein Ausgang Angesprochen wird.
Ich weiß von der Möglichkeit durch das ganze Projekt zu gehen und bei jedem Aufruf eines Ausganges, eine Variable zu setzten. Allerdings gefällt mir das irgendwie nicht. Ich wage mich zu erinnern das so etwas mit Klassen möglich ist, allerdings habe ich nichts dazu gefunden, wie das gehen soll.
Für Hilfe und Anregungen bin ich euch sehr dankbar, MfG Aurich.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Variable hochzählen wenn Ausgänge auf HIGH gesetzt werden

ist nicht das gleiche wie:

ich brauche eine Möglichkeit wie ich eine Variable hochzählen lassen kann, wenn ein Ausgang Angesprochen wird.

ich verstehe die Verwirrung, mir geht es um das 2. Thema.

Wo genau siehst du da ein Problem ?

  1. Eingang abfragen
  2. Wenn Änderung dann Variable hochzählen, evtl. +1 oder so.

Da braucht es keine Klasse.

Ein neues Ding für meine Wühlkiste, auf die schnelle zusammengedengelt:



using Count = unsigned[NUM_DIGITAL_PINS];
Count count;


void digitalWrite(Count &count, byte pin, bool value)
{
  ++count[pin];
  digitalWrite(pin, value);
}
 
void setup() 
{
  Serial.begin(9600);

  digitalWrite(count, 13, true);
  digitalWrite(count, 13, true);
  digitalWrite(count, 13, true);
  digitalWrite(count, 13, true);
  digitalWrite(count, 13, true);
  
  for(auto c:count) Serial.println(c);
}

void loop() 
{

}

das Problem ist, das ich dann das Programm immer erst ausführen müsste, welches die Zustände abruft. Das will ich aber nicht, da ih dadurch immer nur Momentaufnahmen der Zustände bekomme. Ich will aber das es Automatisch beim Aufruf eines Ausgangs, auch (faktisch wie ein Trigger) eine Funktion startet, in welcher die Variable erhöht wird.

Kannst das bitt mal so schreiben, das man es versteht.

Für ein Projekt mit Pneumatik Bauteilen möchte ich eine Funktion erstellen, welche anspringt sobald eine digitalwrite(...,HIGH) Anweisung Ausgeführt wird, um somit einen Zähler zu setzten, welcher über einen bestimmten Zeitraum die Ansteuerungen verschiedener Ausgänge zählen kann.

Und warum musst du da den Ausgang abfragen ?
Die Information hast du doch schon innerhalb deines Programmes.
Diese Information einfach nutzen.

Da Du davon sprichst, dass Du eine Variable hochzählen willst , wenn ein AUSGANg aktiviert wird : eigentlich solltest DU als ersteller Deines Programms doch wiissen, wann du einen Ausgang auf HIGH setzt. Also kannst Du doch jedesmal , wenn Du einen Ausgang auf HIGH setzt Deine Variable um 1 erhöhen. Es sei den , der Ausgang ist ein PWM oder sonst wie über nen Timer gesteuerter Ausgang. Dann müsstest Du diesen Ausgang zusätzlich überwachen.

// Forensketch
// https://forum.arduino.cc/

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming

//#define DEBUG              // Wenn aktiviert, werden Zwischenwerte ausgegeben

#ifdef DEBUG
  #define DBG_PRINTLN(...) Serial << __VA_ARGS__ << endl
#else
  #define DBG_PRINTLN(...)
#endif

constexpr byte PIN {LED_BUILTIN};
byte count;
bool lastRead;
void setup()
{
  Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
  delay(300);
#endif
  Serial << (F("\r\nStart...\r\n")) << endl;
  DBG_PRINTLN(__FILE__);
  DBG_PRINTLN( __TIMESTAMP__);
  pinMode(PIN, OUTPUT);
}

void  loop()

{
  setPinOne();
  checkPin();
  setPinTwo();
  checkPin();
  setPinThree();
  checkPin();
  setPinFour();
  Serial << count << endl;
  delay(100);
}

void checkPin()
{
  if (digitalRead(PIN) != lastRead)
  {
    if (lastRead == LOW)
    {
      count++;
    }
    lastRead = !lastRead;
  }
}
void setPinOne()
{
  digitalWrite(PIN, !digitalRead(PIN));
}
void setPinTwo()
{
  digitalWrite(PIN, !digitalRead(PIN));
}
void setPinThree()
{
  digitalWrite(PIN, !digitalRead(PIN));
}
void setPinFour()
{
  digitalWrite(PIN, !digitalRead(PIN));
}

Das geht so wunderbar, wenn DU Deinen Code schön fein säuberlich in Funktionen aufgeteilt hast.
Alternativ kannst Du anstelle vom Aufruf checkPin() im loop auch eine ISR anlegen und mit einem Timer auslösen lassen.

Hallo,
ich vermute mal Du setzt Den Ausgang an mehreren Stelle im Programm, z.B im Zusammenhang mit einer Schrittkette. Eigentlich ist das schlecht. Nutze besser eine Hilfsvariable, die Du anstelle des Ausgangs an den verschiedenen Stelle setzt. Und an einer Zentralen stelle setzt Du dann mit einer if Abfrage den Ausgang und setzt den Zähler mit der Flanke hoch.

übrigens man kann auch einen Ausgang abfragen. Das geht ganz normal mit

statusausgang = digitalRead(pin)

Heinz

Meine Stimme bekommt die Lösung aus #6 - eine eigene Version von digitalWrite() mit dem Array der Counter als zusätzlichem Parameter ist m.E. elegant und kann auch leicht auf die Anforderung zähle nur bei HIGH umgebaut werden.

Das einzige, was Puristen vielleicht stören könnte, wäre die globale Variable. Aber da die Pins auch global sind ist das für mich kein Ding.

1 Like

Hmmm.....
In setup() und loop() sind globale Variablen erlaubt, zumindest sehe ich das so.
Der Grund: Die beiden Funktionen sind Wegwerffunktionen. Eine Wiederverwendung ist nicht vorgesehen. Zudem ist es nicht möglich dort irgendwelche Parameter zu injizieren.

Ja!
Ich hattete extra deswegen nachgefragt, aber da wollte ihm keine HIGH zählen.
Jetzt ist es so, und wird auch nicht mehr (von mir) geändert.

Danke für die Blumen.

Sehr schöne Lösung, die die Flexibilität von C++ zeigt.
Einfach eine Standardfunktion mit einem anderen Parametersatz überladen und ansonsten "normal" weiter machen, wie bisher (zumindest von den Funktionsnamen).

Ein echter Combie. :wink:

Gruß Tommy

1 Like

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