Programmierfrage: Mehrere Aktionen unterschiedlich oft mit Taster starten

Moin,

da ich im Programmieren der μC's noch recht unerfahren bin und in meinem aktuellem Projekt mittlerweile an meine Grenzen stosse, wende ich mich mal an die Profis!

Zu meinem Aufbau: Ich habe an einen μC über I²C ein LCD, eine RCT (DS3231) und einen BME280 (Temp.-, Druck- und Feuchtemesser) hängen. Dazu über SPI ein SD Modul, einen Taster und eine Status LED.

Funktion: Der μC soll mir im "Standby" Statusinfos wie Uhrzeit, Datum und Temperatur anzeigen. Über den Taster (mit State Change Detection) soll dann der Messablauf gestartet werden. In diesem soll meine Funktion void start() einmal ausgeführt werden in der die txt auf der SD - Karte geöffnet wird und das LCD ein Statusupdate gibt.

void start() {

  Serial.println("Messung Start");
  lcd.setCursor(0, 0);
  lcd.print("Start");
  Textdatei = SD.open("Data.txt", FILE_WRITE);
}

Dann soll die Funktion void datensammeln() so lange wiederholt (alle 5 Sekunden) werden bis der Taster ein weiteres Mal gedrückt wird.

void datensammeln() {

  Pascal = bme280.getPressure();
  Hektopascal = (Pascal/100);

  Textdatei.println(rtc.getTimeStr());
  Textdatei.print(",");
  Textdatei.print(rtc.getDateStr());
  Textdatei.print(",");
  Textdatei.print(bme280.getTemperature());
  Textdatei.print("°C,");
  Textdatei.print(bme280.getHumidity());
  Textdatei.print(" %,");
  Textdatei.print(Hektopascal);
  Textdatei.print(" hPa,");
  Textdatei.print(bme280.calcAltitude(Pascal));
  Textdatei.print(" m");  
}

Damit meine gemessenen Daten am Ende auch gespeichert werden muss dann der void ende() einmal durchlaufen in dem die txt wieder geschlossen wird, das LCD ein Statusupdate gibt und der μC wieder in seinen Standby Modus geht.

void ende() {

  Serial.println("Messung Ende");
  lcd.setCursor(0, 0);
  lcd.print("Stop");
  Textdatei.close();
}

Über eine while() oder if() Schleife komme ich soweit, dass mein void Datensammeln() so lange läuft bis der Button Status sich ändert. Ich weiß nur nicht wie ich die einmalige Ausführung der Start und Ende Funktionen mit integriere.
Zudem soll während dem void datensammeln() läuft die Statusled leuchten und ein Timer die Zeit seit dem Start des Datensammeln anzeigen. Die beiden Sachen sollten ich aber auch so noch schaffen solange das Grundgerüst läuft.

Ich hoffe ihr könnt mir dabei helfen und vielen Dank schonmal,
Stefan

Toll. Innerhalb weniger Minuten Crosspost in 2 Foren.
Wo möchte der Herr denn die Antworten haben? Hier oder nebenan?

Informiere Dich mal, warum Crossposter unbeliebt sind.

Gruß Tommy

Geht dir das nicht schnell genug, oder warum machst du Crossposting ?

während dem void datensammeln() läuft die Statusled leuchten

Zum Glück braucht deine Funktion datensammeln gar keine Zeit.
Die LED soll wohl eher den Zustand "alle 5 sec einmal datensammeln aufrufen" darstellen, rate ich mal.

Deine Problem ist also eher:

  • Taster wechselt mit jedem Drücken den Zustand einer Led AN / AUS. Wenn dich auch Englische Hinweise interessieren, ist das passende Schlüsselwort zum suchen "toggle".
  • Wie alle 5 Sekunden eine Aktion ausgeführt wird, sagt das berühmte BlinkWithoutDelay, das nicht vom Blinken handelt, sondern von WithoutDelay