Funktionen verbinden

Liebes Arduino-Community,

ich bin leider ein ziemlicher Arduino-Neuling und brauche dringend Eure Hilfe.
Ich möchte ein Objekt gestalten, bei dem vier Funktionen unabhängig voneinander funktionieren. Für jede Funktion habe ich einen eigenen Sketch erstellt allerdings scheitere ich komplett an der Zusammenführung dieser, dass diese unabhängig voneinander ablaufen können. Gibt es da einen Tipp? Ich habe schon in anderen Foren gelesen, verstehe es aber leider nicht.
Die Funktionen sind beispielsweise, Temperatur steigt und die LED geht ab 25 Grad an oder der Taster wird gedrückt und eine LED geht an.

Ich wäre Euch sehr dankbar, wenn ihr mich unterstützen könnte.
Viele Grüße und einen schönen Abend!
Anna

Deine bisherigen Bemühungen sehen wir leider nicht. Etwas Vorarbeit ist schon nötig

Klasse, Struktur oder was meinst Du?

Bitte zeigen!

Zeichne es auf Papier!

soll heißen, einen einfachen Ablaufplan. Was soll in welcher Reihenfolger passieren.
Es gibt auf einem kleinen Arduino kein "Gleichzeitig" ... also musst du es nacheinander machen.
Idealerweise klappt das aber so schnell dass der Anwender davon nichts merken muss. Loop wird ja einige Tausend mal pro Sekunde durchlaufen ... solange du den loop nicht mit blockierenden delay() aufhältst...

Ich verbinde hier das blinken der LED auf dem Board mit dem drücken der Taste und dem auslösen einer angeschlossen LED.


const byte tastePin = 2;
const byte ledPin = 3;


void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(tastePin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  tasteFragen();
  herzschlag();
}
void herzschlag()
{
  static unsigned long lastmillis = 0;
  if (millis() - lastmillis > 500)
  {
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    lastmillis = millis();
  }
}
void tasteFragen()
{
  digitalWrite(ledPin, !digitalRead(tastePin));
}

Was brauchst Du als Anregung?

Der Tipp heißt "Blockadefreies Programmieren".
Dann kann man beliebig viele Funktionen gleichzeitig ablaufen lassen, und muss sich nicht ein multitasking-Betriebssystem zusätzlich bauen/suchen (was dann auch eher für mehrere unabhängige Objekte als für ein einzelnes Objekt mit parallel-Funktionen geeignet wäre).

Was du unter einem "Objekt" verstehst, ist wohl erstmal egal, nehme ich an...

Das kann keiner lesen. Lies Dir mal durch, wie man Sketche hoch lädt.
Vorher bitte ordentlich formatieren. Strg+T in der IDE hilft Dir dabei.

Gruß Tommy

int LED=8;
int schalter=7;
int schalterstatus=0;

void setup()
{
pinMode(LED, OUTPUT);
pinMode(schalter, INPUT);
}

void loop()
{
schalterstatus=digitalRead(schalter);
if (schalterstatus == HIGH)
{
digitalWrite(LED, HIGH);

}
else
{
digitalWrite(LED, LOW);
}
}

Bitte in Code-Tags posten. </>

Oh Entschuldigung! Sind die Sketche jetzt im richtigen Format hochgeladen? Der erste und der zweite Sketch sind sehr ähnlich mit zwei verschiedenen Tastern.
Vielen Dank
Anna

Teile vor dem Setup, gehören vor das Setup.

Das was im Setup steht, muss alles in ein Setup.

Das was in den Loops steht, gehört in ein Loop, evtl. in Funktionen ausgelagert.

Doppelte Namen von Variablen funktionieren nicht, diesen dann neue Namen geben.

Ohne Anspruch auf irgendwas - ich hab nur ne andere Baustelle, daher ungetestet

const byte ledPin[] = {8, 12};
const byte schalterPin[sizeof(ledPin)] = {7, 13};

const byte warnLed = 10;
const byte triggerPin = 6;
const byte echoPin = 2;
unsigned long dauer = 0;
float entfernung = 0;

void setup()
{
  Serial.begin (9600);
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    digitalWrite(ledPin[b], LOW);
    digitalWrite(schalterPin[b], LOW);
    pinMode(ledPin[b], OUTPUT);
    pinMode(schalterPin[b], INPUT_PULLUP);
  }
  pinMode(warnLed, OUTPUT);
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop()
{
  pegel();
  schalter();
}

void schalter()
{
  for (byte b = 0; b < sizeof(schalterPin); b++)
  {
    digitalWrite(ledPin[b], !digitalRead(schalterPin[b]));
  }
}
void pegel()
{
  digitalWrite(triggerPin, LOW);
  delay(5);
  digitalWrite(triggerPin, HIGH);
  delay(10);
  digitalWrite(triggerPin, LOW);
  dauer = pulseIn(echoPin, HIGH);
  entfernung = (dauer / 2) * 0.03432;
  if (entfernung >= 500 || entfernung <= 0)
  {
    Serial.println("Kein Messwert");
  }
  else
  {
    Serial.print(entfernung);
    Serial.println(" cm");
  }
  warnen(entfernung);
}

void warnen (const uint8_t auswertung)
{
  static uint32_t lastmillis = 0;
  static bool status = false;
  if (entfernung <= 3)
  {
    if (!status)
    {
      digitalWrite(warnLed, HIGH);
      lastmillis = millis();
      status = true;
    }
    if (status)
    {
      if (millis() - lastmillis > entfernung * 3)
      {
        digitalWrite(warnLed, digitalRead(warnLed));
        lastmillis = millis();
      }
    }
  }
    else
    {
      digitalWrite(warnLed, LOW);
      status = false;
    }
}

Hallo
Hier kommt ein Bespielsketch zum Verbinden von Sketchen, das du einfach erweitern kannst.

merge_sketches-220105a.zip (8.3 KB)

Ich wünsche einen geschmeidigen Abend und viel Spass beim Programmieren in C++.

Au schick.
Versionen zurück bis Mai 2021.
Und nein, ich werde Deinem PaypalKonto nichts geben.
Nicht mal für ne Pizza.
Schon rein aus Prinzip nicht.

Aber spannend, wie eine Community-Idee missbraucht wird.
Schade drum.

Mach mal aus

das hier:

void loop() 
{ 
funktion1();
funktion2();
}
1 Like

Wenn Du die Pins auf INPUT definierst, musst Du entsprechende Widerstände montieren.

Wenn Du keine Widerstände mit aufgebaut hast, benutze INPUT_PULLUP und den schalter / tatster zwischen GND und dem PIN.

1 Like

Naja:

E:\Programme\arduino\portable\sketchbook\sketch_jan06c\sketch_jan06c.ino: In function 'void loop()':
E:\Programme\arduino\portable\sketchbook\sketch_jan06c\sketch_jan06c.ino:45:3: warning: statement is a reference, not call, to function 'funktion1' [-Waddress]
   45 |   funktion1;
      |   ^~~~~~~~~
E:\Programme\arduino\portable\sketchbook\sketch_jan06c\sketch_jan06c.ino:45:3: warning: statement has no effect [-Wunused-value]
E:\Programme\arduino\portable\sketchbook\sketch_jan06c\sketch_jan06c.ino:46:3: warning: statement is a reference, not call, to function 'funktion2' [-Waddress]
   46 |   funktion2;
      |   ^~~~~~~~~
E:\Programme\arduino\portable\sketchbook\sketch_jan06c\sketch_jan06c.ino:46:3: warning: statement has no effect [-Wunused-value]

Sollte man evtl. nicht so oft aufrufen, zumal darin auch ein Serial.print passiert. So schnell kann man gar nicht mitlesen.

Wenn der Pegel sich tatsächlich schnell -innerhalb weniger Millisekunden- ändern kann, wäre eine Änderungsüberwachung nett:
Nur was ausgeben, wenn der Wert sich signifikant (wie immer man das definiert) ändert.

Beide Funktionen nutzen schalterstatus
Wozu brauchst du reedstatus?

funktion2 ist wohl so gemeint

Variablen, die nur lokal gebraucht werden, sollten auch nur lokal definiert werden.
Am besten da, wo sie auch ihren Wert erhalten.
Dann ist es auch egal, wenn zwei verschiedene jeweils lokale Variable aus Versehen denselben Namen haben.