Mehrere Funktionen an einem Arduino

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 )
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

Schau mal hier:

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.

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

Challenger

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 ?

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

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.

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:

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.

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:

#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

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:

Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Der Wachmann

Multitasking Macros
Intervall Macro

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

Nimm lieber das INTERVAL.h

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

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

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.

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

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.:

#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

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?

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.

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

#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

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.