Timer Funktion Arduino Uno - Programm stoppen und starten

Hallo ins Forum,
mein Name ist Stefan, ich bin neu hier und ein ABSOLUTER Anfänger.
Da ich ein passionierter Modellbauer bin, aber eher für Landschaftsgestaltung usw. ein Händchen habe, habe ich mich um das Thema Elektronik immer gedrückt.
In meinem neusten Projekt benötige ich aber Arduino Elektronik und hoffe auf eure Hilfe, da ich davon keine Ahnung habe. Ich habe mir in Foren, bei Youtube usw. ein Miniwissen angeeignet und damit folgendes "gebastelt".

Ein Arduino Uno an dem ein TFT LCD Display 1,8" , 8 LEDs und ein mp3 Player angeschlossen sind. Das Display spielt eine gewisse Abfolge von Effekten ab, die LEDs blinken nach kurzer Zeit kurz auf und der mp3 Player spielt eine Datei ab. Soweit so gut. Den passenden Code habe ich mir irgendwie, ohne zu Wissen wie, zusammengebastelt.
Nun soll es aber so sein, das das ganze Programm starten und 5 Minuten läuft (ohne Rücksicht wie lange die mp3 läuft), dann soll es 10 Minuten pausieren und dann alles wieder von vorne.

Ich habe viel gelesen, mir angeschaut und ausprobiert, leider bekomme ich es nicht hin. Das wird vielleicht auch daran liegen das der vorhandene Code schlecht ist. Nun wäre eure Hilfe nicht schlecht, danke schonmal im voraus.

#include "display.h"
int ledPins [8] = {2, 3,  A0, A1, A2, A3, A4, A5};
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"


// Use pins 6 and 7 to communicate with DFPlayer Mini
static const uint8_t PIN_MP3_TX = 6; // Connects to module's RX 
static const uint8_t PIN_MP3_RX = 7; // Connects to module's TX 
SoftwareSerial softwareSerial(PIN_MP3_RX, PIN_MP3_TX);

// Create the Player object
DFRobotDFPlayerMini player;

void setup(void) {

  // Serial.begin(9600);
  // Serial.print(F("Hello! ST77xx TFT Test"));

  displaySetup();
  // Serial.println(F("Initialized"));
  // tft.invertDisplay(true);

  tft.fillScreen(ST77XX_BLACK);
  delay(500);


  for (int i=0; i<8; i++){
  pinMode(ledPins[i], OUTPUT);
}

// Init USB serial port for debugging
  Serial.begin(9600);
  // Init serial port for DFPlayer Mini
  softwareSerial.begin(9600);

  // Start communication with DFPlayer Mini
  if (player.begin(softwareSerial)) {
   Serial.println("OK");

    // Set volume to maximum (0 to 30).
    player.volume(15);
    // Play the first MP3 file on the SD card
    player.play(1);
  } else {
    Serial.println("Connecting to DFPlayer Mini failed!");
  }
}
void loop() {
   
  testlines(ST77XX_BLUE);
  delay(500);
  for(int i=0; i<8; i++){
    digitalWrite(ledPins[i], HIGH);
    delay(100);
    digitalWrite(ledPins[i], LOW);
    delay(000);
  }
  testlines(ST77XX_RED);
  delay(500);
  for(int i=0; i<8; i++){
    digitalWrite(ledPins[i], HIGH);
    delay(100);
    digitalWrite(ledPins[i], LOW);
    delay(000);
  }
  testlines(ST77XX_GREEN);
  delay(500);
  for(int i=0; i<8; i++){
    digitalWrite(ledPins[i], HIGH);
    delay(100);
    digitalWrite(ledPins[i], LOW);
    delay(000);
  }
  testlines(ST77XX_YELLOW);
  delay(500);
  for(int i=0; i<8; i++){
    digitalWrite(ledPins[i], HIGH);
    delay(100);
    digitalWrite(ledPins[i], LOW);
    delay(000);
  }
    testlines(ST77XX_ORANGE);
  delay(500);
  for(int i=0; i<8; i++){
    digitalWrite(ledPins[i], HIGH);
    delay(100);
    digitalWrite(ledPins[i], LOW);
      delay(000);
  }

  }

a) bitte lies im Forum- How to nach wie man hier postet, insbesondere wie man Code formatiert und editiere dein erstes Post entsprechend.

b)

du meinst, alles das was du aktuell in loop() machst soll

  • 5 Minuten laufen
  • 10 Minuten pausieren?

Ok, danke für den Hinweis und sorry.

zu b)
genau,

  1. 5 Minuten laufen
  2. 10 Minuten pausieren
  3. von Anfang an wieder starten
  4. 5 Minuten laufen
  5. 10 Minuten pausieren
  6. usw....

a) stell endlich dein erstes Post richtig, das kann man sonst nicht lesen.

b)
im Prinzip brauchst dir nur mal das Beispiel "Blink Without Delay" ansehen.
Anstatt dass du die LED Blinkst, startest deinen Ablauf.

verschiebe deinen jetzigen inhalt von loop() in eine neue Funktion void doIt().
mach eine Zeitsteuerung analog Blink Without Delay
Ruf im loop() die Zeitsteuerung auf.

Die Zeitsteuerung lässt du dein neues doIt() aufrufen solang du in den "Einzeiten" bist.

Nur so als Idee:

void trigger()
{
  uint32_t currentMillis = millis();      // get current "time" - see example "Blink without delay"
  static uint32_t previousMillis = 0;     // time management
  constexpr uint16_t onInterval = 30;     // in seconds
  constexpr uint16_t offInterval = 45;    // in seconds
  static bool isRunning = true;           // flag if we are in on or off mode

  if (isRunning)
  {
    // starte was du brauchst
    doIt();
    // prüfen auf Zeitablauf
    if (currentMillis - previousMillis > onInterval * 1000UL)
    {
      previousMillis = currentMillis;
      isRunning = false;
    }
  }
  else
  {
    if (currentMillis - previousMillis > offInterval * 1000UL)
    {
      previousMillis = currentMillis;
      isRunning = true;
    }
  }
}


void doIt()
{
  // do all your current code from loop here
}


void setup() {
  // put your setup code here, to run once:

}

void loop() {
  trigger();
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.