Übersichtlicher Programmieren

hi Leute,
ich Probiere mich gerade an der Funktion millis(). Doch ich finde meine Codes viel zu unübersichtllich. Wie könnte ich den Code Übersichtlicher schreiben.
Ich weiß nicht sicher ob der Code so funktioniert.

#include <Arduino.h>

#define LED_OK 10
#define LED_FAIL 11
#define LED_STARTUP 12

unsigned long previousSTARTSEQUENZ = 0;
const long intervalSTARTSEQUENZ = 6000;

unsigned long previousLEDBLINK = 0;
const long intervalLEDBLINKTIME = 50;

unsigned long previousLEDSTARTUP = 0;
const long intervalSTARTUP = 70;

int MainScreen = 0;

void setup() {
  pinMode(LED_OK, OUTPUT);
  pinMode(LED_FAIL, OUTPUT);
  pinMode(LED_STARTUP, OUTPUT);
}

void loop() {
    unsigned long currentSTARTSEQUENZ = millis();
    if(currentSTARTSEQUENZ - previousSTARTSEQUENZ >= intervalSTARTSEQUENZ){
        currentSTARTSEQUENZ = millis();
        MainScreen = 1;
        digitalWrite(LED_FAIL, HIGH);
        digitalWrite(LED_OK, LOW);
    }else{
      unsigned long currentLEDBLINK = millis();
        if(currentLEDBLINK - previousLEDBLINK >= intervalLEDBLINKTIME){
          digitalWrite(LED_FAIL, HIGH);
          digitalWrite(LED_OK, LOW);
          MainScreen = 0;
      }else {
          digitalWrite(LED_OK, HIGH);
          digitalWrite(LED_FAIL, LOW);
          MainScreen = 0;
          return;
      }
    }
    if(MainScreen = 1){
      unsigned long currentSTARTUP = millis();
      if(currentSTARTUP - previousLEDSTARTUP >= intervalSTARTUP){
      digitalWrite(LED_STARTUP, HIGH);
    }else{
      digitalWrite(LED_STARTUP, LOW);
      return;
    }
    }
}

(deleted)

previousSTARTSEQUENZ wird nie gesetzt.
Das ist also entweder falsch oder unübersichtlich.

Oft helfen auch Kommentare.

Meint ihr so ungefähr..

#include <Arduino.h>

#define LED_OK 10 // Grüne LED
#define LED_FAIL 11 // Rote LED
#define LED_STARTUP 12 // Blaue LED

unsigned long previousSTARTSEQUENZ = 0;
const long intervalSTARTSEQUENZ = 6000;

unsigned long previousLEDBLINK = 0;
const long intervalLEDBLINKTIME = 50;

unsigned long previousLEDSTARTUP = 0;
const long intervalSTARTUP = 70;

int MainScreen = 0;
//wenn MainScreen == 0 dann sollen Rote LED und Grüne LED schnell hin und her wechseln
//wenn MainScreen  == 1 dann soll nur die Rote LED leuchten und die Blaue ganz schnell blinken
//wenn MainScreen == 2 dann soll nur die Blaue LED ganz schnell blinken

void setup() {
  pinMode(LED_OK, OUTPUT);
  pinMode(LED_FAIL, OUTPUT);
  pinMode(LED_STARTUP, OUTPUT);
}


void loop() {
  unsigned long currentSTARTUP = millis();
    if(currentSTARTUP - previousSTARTSEQUENZ >= intervalSTARTSEQUENZ){
      MainScreen = 1;
    }else{
      MainScreen = 0;
    }
  
  switch (MainScreen) {
    case 1:
    unsigned long currentLEDBLINK = millis();
    do {
      if(currentLEDBLINK - previousLEDBLINK >= intervalLEDBLINKTIME){
        currentLEDBLINK = millis();
        digitalWrite(LED_OK, HIGH);
        digitalWrite(LED_FAIL, LOW);
      }else {
        digitalWrite(LED_OK, LOW);
        digitalWrite(LED_FAIL, HIGH);
      }
    } while(MainScreen = 0);
    break;
    case 2:
    unsigned long currentState2 = millis();
    do {
      if(currentState2 - previousLEDSTARTUP >= intervalLEDBLINKTIME){
        currentState2 = millis();
        digitalWrite(LED_OK, LOW);
        digitalWrite(LED_FAIL, HIGH);
        digitalWrite(LED_STARTUP, LOW);
      }else {
        digitalWrite(LED_STARTUP, HIGH);
        digitalWrite(LED_FAIL, HIGH);
        digitalWrite(LED_OK, LOW)
      }
    } while(MainScreen = 1);
    break;
  }
  
}

Ich weiß nicht sicher ob der Code so funktioniert.

wird er nicht!

if(MainScreen = 1)
ist immer true

Doch ich finde meine Codes viel zu unübersichtllich.

So ist es mir auch gegangen!

Dagegen habe ich mine Taskmakros entwickelt.
Gibts mittlerweile in verschiedenen Varianten.
Vielleicht kannste dir ja davon was abschauen

Wer kommt auf solche Variablennamen? Ich dachte das Agile-Mantra ist mittlerweile verstorben?

Benutze eine einzige Variable, z.B. now oder jetzt, die am Anfang von loop() gesetzt wird. Danach diese Variable statt millis() verwenden, und keine neuen Variablen dafür benutzen.

Nicht vergessen: wenn eine Wartezeit abgelaufen ist, muß das Warten irgendwann wieder gestartet werden.

Bei LEDs würde ich als Zustand ON und OFF bevorzugen, statt dem nichtssagenden HIGH und LOW.

zwieblum:
Wer kommt auf solche Variablennamen? Ich dachte das Agile-Mantra ist mittlerweile verstorben?

Ich habe den Code in meiner Arbeit einfach schnell geschrieben ohne großartig auf Rechtschreibung und variablen Namen zu achten.

DrDiettrich:
Benutze eine einzige Variable, z.B. now oder jetzt, die am Anfang von loop() gesetzt wird. Danach diese Variable statt millis() verwenden, und keine neuen Variablen dafür benutzen.

was genau meinst du mit now?

unsigned long now = millis(); ?

und dann currentLEDblink = now; oder wie ganu meinst du das?

Meint ihr so ungefähr

Der Kommentar zu MainScreen wird noch besser, wenn klar ist, welche LED (OK FAIL STARTUP) gemeint ist.

und dann currentLEDblink = now; oder wie ganu meinst du das?

Diese Variable ganz weglassen, wenn sie immer denselben Wert und die gleiche Bedeutung wie now (oder millis() ) hat.

Du hast "now" verstanden :slight_smile:

Dominik1313:
Ich habe den Code in meiner Arbeit einfach schnell geschrieben ohne großartig auf Rechtschreibung und variablen Namen zu achten.

Dann hast du ja jetzt schon mal einen Punkt gefunden, wo du mit deiner Sorgfalt und Disziplin ansetzen kannst.
Und zwar ganz zu Anfang.

  • Das macht das Programm übersichtlicher
  • Erspart eigentlich vermeidbare Kommentare hier im Forum.
  • Nichts hält länger, als ein hässliches Provisorium

Hallo,

ich würde das Geblinke in Funktionen aufteilen bzw. eine mit Parameterübergabe. switch case sollte nicht dazu verkommen dort alles reinzuklatschen. In switch case sollten im besten Fall nur wenige Steuervariablen gesetzt/geändert und/oder Funktionen aufgerufen werden.

könntest du mir vielleicht ein kleines Beispiel geben. Ich weiß nicht wie ich das mit der Funktion / Parameter übergabe machen soll. Ich komme ursprünglich von Java da war das keine Problem mit mehreren Klassen..
Wie würdet ihr das ganze machen. Ein Beispiel "Code" wäre nicht schlecht um es besser zu verstehen

. Ich komme ursprünglich von Java da war das keine Problem mit mehreren Klassen..

Hier bist du in C++ !
Hier ist es auch kein Problem mit Klassen.
Etwas anders, aber doch OOP in Reinform, wenn du möchtest.

Tipp:
Schaffe dir ein schönes dickes C++ Buch an.

Und/oder schau mal hier rein.

Gruß Tommy

Tommy56:
Und/oder schau mal hier rein.

Gruß Tommy

Na, das geht schon mal gar nicht. Variablennamen mit einem Buchstaben? Wer soll denn da verstehen?

So wäre das mit der Funktion wie ich das in dem Beitrag verstanden habe. Jetzt ist nur die Frage. weil eine while schleife Freezt ja das Programm genau wie delay. Wie kann ich das umgehen
Ich will das die Funtion "BlinkLED" so lange ausgeführt wird bist "MainScreen != 0" ist

void loop() {
    do {
      blinkLED();
    } while(MainScreen = 0);
}

void blinkLED(){
  unsigned long currentLEDBLINK = millis();
  if(currentLEDBLINK - previousLEDBLINK >= intervalLEDBLINKTIME){
    currentLEDBLINK = millis();
    digitalWrite(LED_OK, HIGH);
    digitalWrite(LED_FAIL, LOW);
  }else{
    digitalWrite(LED_OK, LOW);
    digitalWrite(LED_FAIL, HIGH);
  }

Wie kann ich das umgehen

In dem du anfängst in Nebenläufigkeiten zu denken, und in Folge dessen auch nebenläufig funktionierende Programme schreibst.

Also:
Gegen Schleifen ist nichts einzuwenden.
Aber wenn sie andere Dinge blockieren, ist Ende damit.

Außerdem hast du ja schon eine Schleife, hinter loop() versteckt.
Das reicht meist an Schleifen.

unsigned long currentLEDBLINK = millis();

Argh! Das ist genau der Grund, warum Agile zum speiben ist. Was bitte hat hat der Name/Text/Bedeutung von "currentLEDBLINK" mit der Zahl der verstrichen ms seit Poweron zu tun? Oder ist die korrekte Übersetzung von "BLINK" "Zeit"? Und wie schaut das aus, wenn da mal ein paar hundert Zeilen Code stehen, gibt's dann da eine Übersetzungstabelle? Oder fragt man einfach so lange, bis man sich wieder erinnert? Ich seh' den Sprudel den ganzen Tag, der Projektleiter faselt dann was von "Clean Code" und "Agile", seine Untergebenen schauen blaueugig drein und man selbst kämpft wieder mal mit dem Blutdruck.

Hallo,

habe zwar von Java keine Ahnung, aber Klassen werden ähnlich funktionieren wie in C++, nur die Syntax wird etwas anders sein.

Grundlage aller "Timergeschichten" ist millis() zuverstehen.

Theseus erklärt millis()

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung

Meine Grundfunktion sieht so aus und wird je nach Bedarf abgewandelt. Grundlegend nichts anderes wie das Blink without Delay Bsp. der IDE.

void heartbeat (unsigned long interval)                     
{
  static unsigned long lastMillis = 0;
  static bool state = LOW;
  
  unsigned long ms = millis();
  
  if (ms - lastMillis >= interval)
  {
    lastMillis = ms;
    state = !state;
    digitalWrite(LED_BUILTIN, state);
  }
}

Es muss nicht immer für LED Geblinke sein, kann für alles mögliche verwendet werden.

bool zyklisch (unsigned long interval)                     
{
  static unsigned long lastMillis = 0;
  bool state = LOW;
  
  unsigned long ms = millis();
  
  if (ms - lastMillis >= interval)
  {
    lastMillis = ms;
    state = true;
  }

  return state;
}