Arduino Sketch mit meheren Unterprogrammen

Hallo,

ist es möglich beim Arduino einen Sketch mit mehrern Unterprogrammen zu erstellen, die man mittels eines Taster auswählen kann und wenn ja wie müsste ich das realisieren?

MfG Marvin

Du meinst bestimmt "Funktionen".

Die kannst du per if-Anweisung oder per Switch/Case-Anweisung aufrufen.
Z.B.
If (taster1 == 1) {
Funktion1();
}

Okay vielen Dank,

ja ich meinte mit Unterprogrammen bestimmte Funktionen, wie müsste ich das realisieren, wenn ich die Switch/Case-Anweisung nehmen würde.

int modus=2;
switch (modus) {
  case 0: funktion_A(); break;
  case 1: funktion_B(); break;
  case 2: funktion_C(); break;
  case 3: funktion_D(); break;
}

Kannst auch einen default Fall hinzufügen, oder bei zwei cases dieselbe Funktion aufrufen, oder so...

Wie michael_x schon geschrieben hat.

Weiteres kannst du hier nachlesen.

Hallo,

das mit den Unterprogrammen habe ich nun geschaft.
Meine Frage nun wie lässt sich die Funktion, die gerade ausgerufen wurde im EEPROM speichern, so dass diese nach einem Neustart des Arduino, wenn dieser mal vom Netz getrennt war wieder mit der gleichen Funktion beginnt.

z.B. diese Fuktion als einfaches Beispiel

if (Taster==1){
digitalWrite(Pin9, HIGH)
}

Es gibt keine Unterprogramme, es sind Funktionen.

Du must den Wert im EEProm speichern und beim Neustart wieder auslesen und per if-Anweisung abfragen.
Du brauchst natürlich auch den Taster, den du als Wert im EEProm speicherst.

Welde Möglichkeiten du mit dem EEProm hast, kannst du hier nachlesen.

Eine ganze Anweisung oder Funktion kannst du nicht im EEprom speichern, das hatte ich dir im vorherigen Thread auch schon geschrieben.

Da gibt es einen Thread, der sogar den zur Frage passenden Titel hat (mehr oder weniger).

Hast du schonmal in der Referenz bei Libraries geguckt und da EEPROM.h gefunden ?
Ausprobiert ?

(Schreib ins EEPROM nur, wenn deine über Taster gesteuerte Variable geändert wurde)

Lesen vom EEPROM geht auch ?

@HotSystems: Eine Funktion die nichts (void) zurückliefert, kann man flapsigerweise auch als Unterprogramm bezeichnen. Ist zwar kein C - Begriff, aber nicht wirklich problematisch, finde ich :wink:

z.B. diese Fuktion als einfaches Beispiel

if (Taster==1){

digitalWrite(Pin9, HIGH);
}

die Funktion, die ich sehe ist digitalWrite(), im EEPROM speichern würde ich eine 1, bzw. den jeweiligen Wert von Taster.

michael_x:
@HotSystems: Eine Funktion die nichts (void) zurückliefert, kann man flapsigerweise auch als Unterprogramm bezeichnen. Ist zwar kein C - Begriff, aber nicht wirklich problematisch, finde ich :wink:

Aha...
ich habe es gerade hier :wink: anders gelernt.
Aber meinetswengens.

Hallo michael_x,

habe mir schon die EEPROM.h angeschaut jedoch möchte das bei mir nicht so funktionieren, wie ich es mir vorstelle

Meine Erste Funktion wäre diese (Ausschnitt aus dem Loop);

 if (Betriebsmodus == 1)                          // Wenn der Betriebsmodus 2 ausgeführt wird dann 
  {
    unsigned long aktuelleZeit = millis ();           // Greift die Zeit für den wechsel der LED ab

 if (aktuelleZeit - letzterWechsel > zeitproled) {    // Überprüft, wann die letzte LED eingeschaltet wurde, wenn die Differenz größer ist als Zeit pro LED, dann
  digitalWrite(LEDPins[aktuelleLED], LOW);           // Schaltet die LED die gerade an ist aus und die nächste ein
  aktuelleLED = (aktuelleLED + 1) % 5;              // Die Variable AktuelleLED wird um 1 hochgezählt und durch 5 geteilt
  digitalWrite (LEDPins[aktuelleLED], HIGH);       // Setzt den Pegel der aktuellen LED auf HIGH 
  letzterWechsel = aktuelleZeit;                  // Aktualisert den Zeitpunkt aktueller Wechsel es wird 200ms gewartet, bis die nächste LED an geht
 }
  }

könnten Sie mir villeicht helfen und sagen, wie ich dies für die erste Funktion realisieren müsste?

MfG Marvin

Was soll denn da jetzt ins EEprom geschrieben werden?

Viel hilfreicher wäre der komplette Sketch mit der ganz präzisen Angabe, was gemacht werden soll.

Im EEPROM ist höchstens eine 1. ( oder was anderes )
Und die kannst du in setup() nach Betriebsmodus schreiben.

Dann wird die Arduino loop wohl in den gezeigten Teil springen, solange keiner per Taste oder sonstwie den Wert der Variable Betriebsmodus ändert.

Und wenn du das, was du da gepostet hast, in eine Funktion auslagerst, stört es auch nicht mehr so, wenn du dich um dein EEPROM kümmerst.

Deine "erste Funktion" wäre dann z.B.

void ersteFunktion() {
  unsigned long aktuelleZeit = millis (); // wird in jedem Fall gebraucht
  if (aktuelleZeit - letzterWechsel > zeitproled) {    // Überprüft, wann die letzte LED eingeschaltet wurde, wenn die Differenz größer ist als Zeit pro LED, dann
    digitalWrite(LEDPins[aktuelleLED], LOW);           // Schaltet die LED die gerade an ist aus und die nächste ein
    aktuelleLED = (aktuelleLED + 1) % 5;              // Die Variable AktuelleLED wird um 1 hochgezählt und durch 5 geteilt
    digitalWrite (LEDPins[aktuelleLED], HIGH);       // Setzt den Pegel der aktuellen LED auf HIGH
    letzterWechsel = aktuelleZeit;                  // Aktualisert den Zeitpunkt aktueller Wechsel es wird 200ms gewartet, bis die nächste LED an geht
  }
}

und loop() sähe so aus:

void loop() {

   // Taster lesen und evtl. Betriebsmodus ändern
 
   if (Betriebsmodus == 1) ersteFunktion();
}

Das geht z.B. so:

EEProm schreiben:

EEPROM.write(EEPromAdresse, Betriebsmodus);

EEProm schreiben lesen:

 Betriebsmodus = EEPROM.read(EEPromAdresse);

Das gelesene vergleichst du wieder mit der if-Anweisung.

Das kannst du alles in meinem verlinkten Artikel lesen.
Da steht es genau drin, aber lesen musst du schon.

könnten Sie mir sagen, wie ich dies genau machen müsste

Mein Setup sieht wie folgt aus

void setup()
{
  for (int i = 0; i < 5; i++){        //For-Schleife mit der Variable 1, die von 0-4 hochgezähglt wird
    pinMode (LEDPins [i], OUTPUT);   // Legt die LEDPins als Ausgänge fest
  
  
  pinMode(Taster, INPUT);  	// Setzt den Taster als Eingang 
  
  }
}

und der loop so:

void loop()
{                                       
  StatusdesTasters = digitalRead(Taster);  // Abfrage ob der Taster gedrückt ist
  if (StatusdesTasters == HIGH)            // Wenn Taster gedrückt ist..
  {
	Betriebsmodus++; 	          // Betreibsmodus wird um 1 addiert
	delay(300);   	                  // 300ms warten
  }
  
//******** LEUCHTPROGRAMME ******************
  
//******* Betriebsmodus1 Nach der Reihe ***********************
 else if (Betriebsmodus == 1)                          // Wenn der Betriebsmodus 1 ausgeführt wird dann 
  {
    unsigned long aktuelleZeit = millis ();           // Greift die Zeit für den wechsel der LED ab

 if (aktuelleZeit - letzterWechsel > zeitproled) {    // Überprüft, wann die letzte LED eingeschaltet wurde, wenn die Differenz größer ist als Zeit pro LED, dann
  digitalWrite(LEDPins[aktuelleLED], LOW);           // Schaltet die LED die gerade an ist aus und die nächste ein
  aktuelleLED = (aktuelleLED + 1) % 5;              // Die Variable AktuelleLED wird um 1 hochgezählt und durch 5 geteilt
  digitalWrite (LEDPins[aktuelleLED], HIGH);       // Setzt den Pegel der aktuellen LED auf HIGH 
  letzterWechsel = aktuelleZeit;                  // Aktualisert den Zeitpunkt aktueller Wechsel es wird 200ms gewartet, bis die nächste LED an geht
 }
  }
  
      
      
      
      
      
                                                  
  else
  {
	Betriebsmodus = 1;                       // Es wird der Betriebsmodus 1 gestartet
  }
}

agmue:
Du meinst "EEProm lesen" :slight_smile:

Ja stimmt, so leicht fällt man bei C&P rein.

Fazit: Mache kein C&P, wenn du's nicht kannst. :wink: :wink:

Kirmesmodellbauer:
könnten Sie mir sagen, wie ich dies genau machen müsste

Mein Setup sieht wie folgt aus
....

und der loop so:
....

Warum zerpflückst du immer den Sketch.

Wenn der zusammen bleibt, machst du es uns leichter.

Und immer den kompletten Sketch posten, der Fehler steckt immer im "geheimen Teil".

OK und nochmal, lies doch mal die Beschreibungen.
Ich bin hier raus.