# Mehrere Funktionen an einem Arduino

**URL:** <https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704>\
**Category:** Deutsch\
**Created:** [August 4, 2017, 6:01am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704 "2017-08-04T06:01:51Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![challenger](https://avatars.discourse-cdn.com/v4/letter/c/c6cbf5/32.png) [@challenger](https://forum.arduino.cc/u/challenger)\
**Post date:** [August 4, 2017, 6:01am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/1 "2017-08-04T06:01:51Z")

</div>

Guten Morgen  
Ich wollte für mein Hobby, das Geocachen, einen richtig guten Cache machen. (Wer nicht weiss was dass ist hier ein Link: [Geocaching](https://www.geocaching.com/play) )  
Dafür habe ich an so etwas wie eine grosse Box gedacht wo man mit einem LCD-Display aufgaben bekommt und die an der Box ausführen muss. Beispiele solcher Aufgaben sind: Mit einer Tachenlampe ein Lichtsenor zum durchaltenzu brigen, die Box auf eine bestimmte höhe bringen (Ultraschall-Distanzmesser), mit einem Batch etwas öffnen und vlt noch mehr.  
Ich habe mir extra für dieses Projekt einen Mega2560 gewählt da er mehr Pin-Plätze hat.  
SO zu meiner Frage:  
Kann ich überhaubt so viele Funktionen an einem Arduino ausführen??  
Wenn Ja wie??

Vielen Dank für eure Hilfe

Challenger

---

<div class="post-metadata">

**Author:** ![Moko](https://avatars.discourse-cdn.com/v4/letter/m/b38774/32.png) [@Moko](https://forum.arduino.cc/u/Moko)\
**Post date:** [August 4, 2017, 6:11am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/2 "2017-08-04T06:11:49Z")

</div>

Schau mal hier:  
[http://forum.arduino.cc/index.php?topic=491462.0](http://forum.arduino.cc/index.php?topic=491462.0)

---

<div class="post-metadata">

**Author:** ![HotSystems](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hotsystems/32/219785_2.png) [@HotSystems](https://forum.arduino.cc/u/HotSystems)\
**Post date:** [August 4, 2017, 6:13am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/3 "2017-08-04T06:13:03Z")

</div>

Ja, das wird funktionieren. Allerdings brauchst du dazu nicht unbedingt einen Mega.  
Du kannst jeden Arduino mit einem Port-Expander auf eine große Anzahl von Pins erweitern.  
Wichtig dabei ist, jede deiner gewählten Funktionen wird sehr schnell hintereinander abgearbeitet, wenn es dein Sketch zulässt.

---

<div class="post-metadata">

**Author:** ![challenger](https://avatars.discourse-cdn.com/v4/letter/c/c6cbf5/32.png) [@challenger](https://forum.arduino.cc/u/challenger)\
**Post date:** [August 4, 2017, 6:20am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/4 "2017-08-04T06:20:29Z")

</div>

Ich hoffe es wir auch klappen aber wie kann ich so viele Funktionen in einem Programm haben so dass mehreres gleichzeitig funktioniert??

Challenger

---

<div class="post-metadata">

**Author:** ![HotSystems](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hotsystems/32/219785_2.png) [@HotSystems](https://forum.arduino.cc/u/HotSystems)\
**Post date:** [August 4, 2017, 6:24am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/5 "2017-08-04T06:24:31Z")

</div>

> challenger:  
> Ich hoffe es wir auch klappen aber wie kann ich so viele Funktionen in einem Programm haben so dass mehreres gleichzeitig funktioniert??
> 
> Challenger

Wie ich oben schon schrieb.  
Nicht gleichzeitig, sondern schnell hintereinander.  
Das sieht für dich wie gleichzeitig aus.

Oder wie verstehst du gleichzeitig ?

---

<div class="post-metadata">

**Author:** ![challenger](https://avatars.discourse-cdn.com/v4/letter/c/c6cbf5/32.png) [@challenger](https://forum.arduino.cc/u/challenger)\
**Post date:** [August 4, 2017, 6:27am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/6 "2017-08-04T06:27:14Z")

</div>

Dass das LCD-Dislay an ist und eine dass eine Funktion erfüllt werden muss so gleichzeitig.

---

<div class="post-metadata">

**Author:** ![HotSystems](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/hotsystems/32/219785_2.png) [@HotSystems](https://forum.arduino.cc/u/HotSystems)\
**Post date:** [August 4, 2017, 6:29am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/7 "2017-08-04T06:29:59Z")

</div>

> challenger:  
> Dass das LCD-Dislay an ist und eine dass eine Funktion erfüllt werden muss so gleichzeitig.

Wenn du dir die zahlreichen Beispiele hier im Forum oder im Web ansiehst, wirst du feststellen, das ist kein Problem und funktioniert bei richtiger Programmierung immer.

Edit:  
Du hast es doch in deinem letzten Thread auch gesehen.  
Der US-Sensor misst eine Entfernung und zeigt diese kurz darauf im Monitor an.  
Bzw. leuchtet deine Led.  
Fast gleichzeitig.

---

<div class="post-metadata">

**Author:** ![guntherb](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/guntherb/32/215276_2.png) [@guntherb](https://forum.arduino.cc/u/guntherb)\
**Post date:** [August 4, 2017, 6:52am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/8 "2017-08-04T06:52:38Z")

</div>

> challenger:  
> Kann ich überhaubt so viele Funktionen an einem Arduino ausführen??

ja. Kannst du.

> challenger:  
> Wenn Ja wie??

Das hängt davon ab, was du tun willst.  
Es gibt viele Möglichkeiten, Programmabläufe zu strukturieren. Z.B. über switch/case Anweisung:

```arduino
byte Aufgabe = 1;
int Startknopf = 3; // Pin, an dem der Startknopf
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  
switch(Aufgabe){
  case 1: 
    Aufgabe1();
    Aufgabe = 2;
    break;
  case 2: 
    Aufgabe2();
    Aufgabe = 3;
    break;
  case 3: 
    Aufgabe3();
    Aufgabe = 4;
    break;
  case 4: 
    Serial.println("Alle Aufgaben gelöst!");
    Aufgabe = 0;
    break;
  case 0: 
    Serial.println("START drücken um Aufgaben zu beginnen");
    if (digitalRead(Startknopf) == LOW) Aufgabe = 0;
    break;
  
}// end switch

}// end loop

void Aufgabe1(){
  // hier ist der Code für Aufgabe1
}
void Aufgabe2(){
  // hier ist der Code für Aufgabe2
}
void Aufgabe3(){
  // hier ist der Code für Aufgabe3
}

```

Man kann die Aufgaben sequenziell abarbeiten lassen, oder, über irgendeine Eingabe, die Aufgaben frei wählbar machen.

Aber vor dem Programmieren steht erst mal die Überlegung: Was soll die Kiste den eigentlich genau tun?  
am besten du malst oder schreibst dir Schritt für Schritt auf, was passieren soll. Zu erst auf einer höheren Ebene ("Taster abfragen; WEnn Taster X gedrückt, Aufgabe X"), dann für die einzelnen Aufgaben.

---

<div class="post-metadata">

**Author:** ![challenger](https://avatars.discourse-cdn.com/v4/letter/c/c6cbf5/32.png) [@challenger](https://forum.arduino.cc/u/challenger)\
**Post date:** [August 4, 2017, 7:17am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/9 "2017-08-04T07:17:39Z")

</div>

Vielen Dank aber ich glaube ich bleibe bei einer if Bedingung ;D  
Jetzt bin ich schon beim programmieren hab aber jetzt ein Problem wo ich schon befürchtet habe.  
Ich habe zuerst die Aufgabe das man einen Gegenstand 10cm vom Ultraschallsensor haben muss dann geht die erste LED an. Wenn die erste LED an ist kommt der Lichtsesnor ins Spiel den muss man über einen Wert 1000 bringen, schafft man wenn man eine Taschenlampe daran hält. Mein Problem ist jetzt aber dass beim "Serial Monitor" immer zwei Werte geschrieben werden. Wie kann ich bei der ersten Funktion nur den ersten Wert schreiben lassen und bei der zweiten die zweite??

Hier der Code:

```cpp
#include "SR04.h"0.
#define TRIG_PIN 3
#define ECHO_PIN 2
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;
int LED = 4;
int Wert = 0;

void setup() {
  Serial.begin(9600);
  delay(3000);
  pinMode(LED,OUTPUT);
}

void loop() {
  a=sr04.Distance();
  Serial.print(a);
  Serial.println("cm");
  delay(3000);
    if (a >= 10 && a<= 12){
digitalWrite(LED,HIGH);
  }
if (LED = HIGH) { // ab hier kommt der Lichtsensor ins Spiel
  pinMode
  Wert = analogRead(A0);
Serial.println(Wert);
delay(15);
if(Wert>1000){
  digitalWrite(5,HIGH);
  delay(100);
}
  if(Wert<1000){
    digitalWrite(5,LOW);
    delay(100);}
}

}

```

Danke Challenger

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [August 4, 2017, 7:23am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/10 "2017-08-04T07:23:25Z")

</div>

**Ablaufsteuerung**  
Meine Standardantwort zu Ablaufsteuerungen:

> ## Eine Stichworte Sammlung für Google Suchen: Endlicher Automat, State Machine, Multitasking, Coroutinen, Ablaufsteuerung, Schrittkette, BlinkWithoutDelay,
> 
> ## [Blink Without Delay](https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay) [Der Wachmann](https://forum.arduino.cc/index.php?topic=423688.0)
> 
> [Multitasking Macros](https://forum.arduino.cc/index.php?topic=415229.msg2859554)  
> [Intervall Macro](https://forum.arduino.cc/index.php?topic=413734.msg2848523)

---

<div class="post-metadata">

**Author:** ![challenger](https://avatars.discourse-cdn.com/v4/letter/c/c6cbf5/32.png) [@challenger](https://forum.arduino.cc/u/challenger)\
**Post date:** [August 4, 2017, 7:45am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/11 "2017-08-04T07:45:57Z")

</div>

Ich habe jeden Link angeklickt und durchgelesen, verstanden habe ich aber nur wenig... :-[ Besser gesagt das mit dem taskBegin und taskEnd hat recht vielversprechen geklungen hab es aber wahrscheinlich am falschen Ort eingesetzt daher hat sich nichts getan.....

Wo müsste man denn die Befehle einfügen???

Danke

Challenger

---

<div class="post-metadata">

**Author:** ![ElEspanol](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/elespanol/32/1034891_2.png) [@ElEspanol](https://forum.arduino.cc/u/ElEspanol)\
**Post date:** [August 4, 2017, 7:52am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/12 "2017-08-04T07:52:59Z")

</div>

Nimm lieber das INTERVAL.h

Das gibt weniger Knoten im Hirn, wenn du verstehen willst, wie das ganze funktioniert

---

<div class="post-metadata">

**Author:** ![challenger](https://avatars.discourse-cdn.com/v4/letter/c/c6cbf5/32.png) [@challenger](https://forum.arduino.cc/u/challenger)\
**Post date:** [August 4, 2017, 7:59am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/13 "2017-08-04T07:59:06Z")

</div>

Ich glaube die Aufgabe ist noch zu schwer für mich ☹ weil ich verstehe fast alle Komentare nicht oder zumindest die Links die Beinhaltet sind. ☹

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [August 4, 2017, 8:02am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/14 "2017-08-04T08:02:13Z")

</div>

> Wo müsste man denn die Befehle einfügen???

Leider sehe ich deine Versuche nicht.  
Darum kann ich auch nicht sagen, was du falsch gemacht hast.

Hast du die Beispiele gefunden?

> Ich habe jeden Link angeklickt und durchgelesen, verstanden habe ich aber nur wenig...

20 Minuten, für ein Thema, für welches ich Jahre brauchte.....  
Eine ganz schön hohe Erwartungshaltung (an dich selber), hast du da....

Tipp:  
Nur weil es es weit vorgekaut wurde, ist es doch kein einfaches Thema.

Nachtrag:

> Ich glaube die Aufgabe ist noch zu schwer für mich

Das meinte ich...  
Gehe in kleinen Schritten.

---

<div class="post-metadata">

**Author:** ![challenger](https://avatars.discourse-cdn.com/v4/letter/c/c6cbf5/32.png) [@challenger](https://forum.arduino.cc/u/challenger)\
**Post date:** [August 4, 2017, 8:05am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/15 "2017-08-04T08:05:04Z")

</div>

Das war ein falscher Komentar bitte lest den nächten von mir

---

<div class="post-metadata">

**Author:** ![challenger](https://avatars.discourse-cdn.com/v4/letter/c/c6cbf5/32.png) [@challenger](https://forum.arduino.cc/u/challenger)\
**Post date:** [August 4, 2017, 8:10am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/16 "2017-08-04T08:10:39Z")

</div>

Sorry hab die Frage falsch verstande :-[  
Der letzte Komentar von mir ist falsch.

Die Antwort jetzt:  
Ich habe einfach der taskBegin-Befehl bei der ersten Funktion gemacht.(Ultraschall-Distanz)  
und wenn man die Funktion erfüllt hat den taskEnd-Befehl.  
Danach geht es weiter mit der nächsten Funktion und ich habe das gleiche gemacht am Anfang und am Ende.:

```cpp
#include "SR04.h"0.
#include <TaskMacro.h>
#define TRIG_PIN 3
#define ECHO_PIN 2
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;
int LED = 4;
int Wert = 0;

void setup() {
  Serial.begin(9600);
  delay(3000);
  pinMode(LED,OUTPUT);
}

void loop() {
  taskBegin()
  a=sr04.Distance();
  Serial.print(a);
  Serial.println("cm");
  delay(3000);
    if (a >= 10 && a<= 12){
digitalWrite(LED,HIGH);
  }
  taskEnd()
if (LED = HIGH) { // ab hier kommt der Lichtsensor ins Spiel
  taskBegin()
  Wert = analogRead(A0);
Serial.println(Wert);
delay(15);
if(Wert>1000){
  digitalWrite(5,HIGH);
  delay(100);
}
  if(Wert<1000){
    digitalWrite(5,LOW);
    delay(100);}
    taskEnd()
}

}

```

Vielen Dank für die Unterstützung

Challenger

---

<div class="post-metadata">

**Author:** ![ElEspanol](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/elespanol/32/1034891_2.png) [@ElEspanol](https://forum.arduino.cc/u/ElEspanol)\
**Post date:** [August 4, 2017, 8:59am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/17 "2017-08-04T08:59:41Z")

</div>

LED = HIGH Macht nicht, was du denkst. Und sogar schon im Ansatz falsch

müsste es heissen, if(LED==HIGH)  
Aber was du willst, ist if(digitalRead(LED)==HIGH)

Meckert der Compiler nicht bei:  
#include "SR04.h"0.

Das 0. am Schluss sieht mir doch ser merkwürdig aus

Was soll das delay im Setup?

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [August 4, 2017, 9:12am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/18 "2017-08-04T09:12:27Z")

</div>

> Ich habe einfach der taskBegin-Befehl bei der ersten Funktion gemacht.(Ultraschall-Distanz)  
> und wenn man die Funktion erfüllt hat den taskEnd-Befehl.

taskBegin und taskEnd dürfen jeweils nur einmal pro Funktion auftauchen.  
Nicht mehrmals, so wie bei dir.  
Bitte verwende nicht den Begriff Funktion für die falschen Zwecke.  
loop() ist eine Funktion.  
Und innerhalb dieser Funktion gibt es bestenfalls Blöcke, oder Funktionsaufrufe, aber keine weiteren Funktionen.  
Deine Verwendung des Begriffes Funktion führt dich in die Irre.

Ich bevorzuge eine Endlosschleife zwischen taskBegin und taskEnd  
So wird es auch bei vollwertigen Multitaskingsystemen abgehandelt.  
Hat also einen gewissen Wiedererkennungswert.

Auch brauchst du bei der Verwendung der TasMakros keine Delays mehr.  
Diese werden durch TaskPause ersetzt.  
Denn Delay blockiert das ganze System.  
TaskPause lässt die Verarbeitung anderer Dinge zu.

---

<div class="post-metadata">

**Author:** ![challenger](https://avatars.discourse-cdn.com/v4/letter/c/c6cbf5/32.png) [@challenger](https://forum.arduino.cc/u/challenger)\
**Post date:** [August 4, 2017, 10:26am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/19 "2017-08-04T10:26:00Z")

</div>

Hab jetzt nur noch eine task-Befehl pro Funktion und alle delay durch taskPausen ausgetauscht und jetzt funktioniert gar nichts mehr....

```cpp
#include <TaskMacro.h>
#include "SR04.h"0.
#define TRIG_PIN 3
#define ECHO_PIN 2
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;
int LED = 4;
int Wert = 0;

void setup() {
  Serial.begin(9600);
  delay(3000);
  pinMode(LED,OUTPUT);
}

void loop() {
taskBegin()
  a=sr04.Distance();
  Serial.print(a);
  Serial.println("cm");
taskPause(3000);
    if (a >= 10 && a<= 12){
digitalWrite(LED,HIGH);
  }
if(digitalRead(LED)==HIGH) {
  Wert = analogRead(A0);
Serial.println(Wert);
taskPause(15);
if(Wert>1000){
  digitalWrite(5,HIGH);
  delay(100);
}
  if(Wert<1000){
    digitalWrite(5,LOW);
taskPause(100);
taskEnd()
}
}
}

```

Ich hätte gedacht es wäre leicheter einfacher zwei Werte auf dem Serial Monitor zu trennen....

Trotzdem Danke

Challenger

---

<div class="post-metadata">

**Author:** ![combie](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/combie/32/217369_2.png) [@combie](https://forum.arduino.cc/u/combie)\
**Post date:** [August 4, 2017, 11:09am UTC](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704/20 "2017-08-04T11:09:48Z")

</div>

Leider kann ich den Code nicht testen.  
Habe keine sr04.h

> #include "SR04.h"0.

Was das 0. da soll, hast du auch weder gesagt, noch es entfernt.  
Hmmm.....

Der Code sieht sieht sehr unaufgeräumt aus.  
Verstehe auch nicht wirklich, was er tun soll....

PS:  
Das taskEnd() steht an der falschen stelle.  
Bei ordentlicher Einrückung sieht man das auch.

[Next page](https://forum.arduino.cc/t/mehrere-funktionen-an-einem-arduino/473704.md?page=2)
