Blinken Sketch eindeutig machen

Der Blink Sketch ist zwar einfach gehalten, doch nicht überzeugend das es kein Systemtakt ist, der auf vielen Leiter-Platten so vor sich hin flaggert. Einleuchtender wäre es ein ungewöhnliches Blinken zu erzeugen. Dafür bietet sich eigentlich der SOS-Code an. Es ist mir ein Rätsel weshalb noch niemand auf diese Idee gekommen ist. Als absoluter Anfänger hab ich den Code einfach erweitert, doch ist er sicher viel besser zu programmieren, so mit Schleifen oder Zählwerten. Wer hat eine Idee es besser zu machen?


 // Blink SOS

void setup() 
{
  pinMode(LED_BUILTIN, OUTPUT);// setze den LED_Pin als Ausgang
}

void loop() //starte die endlose Schleifenfunktion
{
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(150);  
  digitalWrite(LED_BUILTIN, LOW);  
  delay(200);   
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(150); 
  digitalWrite(LED_BUILTIN, LOW);  
  delay(200);   
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(150); 
  digitalWrite(LED_BUILTIN, LOW);  
  delay(700);   
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(500);  
  digitalWrite(LED_BUILTIN, LOW);  
  delay(500);     
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(500);  
  digitalWrite(LED_BUILTIN, LOW);  
  delay(500); 
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(500);                   
  digitalWrite(LED_BUILTIN, LOW);  
  delay(700);   
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(150); 
  digitalWrite(LED_BUILTIN, LOW);  
  delay(200);   
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(150); 
  digitalWrite(LED_BUILTIN, LOW);  
  delay(200);    
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(150); 
  digitalWrite(LED_BUILTIN, LOW);  
  delay(1500);                   
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

  1. ohne delay,
  2. mit statemaschine und millis()
  3. mit array für die Zeichen

@roland_0815
Sorry, aber ich verstehe nicht so richtig, was du damit bezwecken willst.

nimm eine Schleife oder Zählwerte.
Mach mal einen Versuch.
Wenn du Hilfe benötigst, Code posten - Frage stellen.

P.S.: die Längen und Abstände sind beim Morsecode relativ definiert. Deine Werte scheinen nicht zusammenzupassen.
Morsecode – Wikipedia

Verzeihung, hab noch nicht entdeckt wie man den engl. Teil meidet. Ist es in engl. beschrieben, kann ich es auch nicht finden...
Also wie logge ich mich ins deutsche Forum ein ???
Als geborenes Fautier habe ich keine Lust mich durch das gesammte Forum zu graben um die Lösung zu finden.

Die „Blink“-Sketch ist die „Hallo Welt“ der Arduino-Welt. Es muss absolut einfach sein....

2 Likes

Versuch es mal mit der Kategorie International -> Deutsch

Ich verstehe Dein Ansinnen ebenfalls nicht. Was hat der Blinksketch mit Systemtakt und “Platten“ zu tun?

Das SOS Notsignal ist nur in Notfällen zu verwenden.

Bezwecken will ich damit nur, das es für die Ergebnisse viele Lösungen gibt, sehr einfache aber auch sehr anspruchsvolle und das man mit jedem Ergebnis neue Erfahrungen macht. Zu meinem 1. Ergebnis bin ich auf einem sehr einfachen Weg gelangt, jedoch bin ich mir bewußt das es viel edlere Wege gibt um zu diesem Ergebnis zu kommen. Leider haben aber Rentner niemals Zeit und ich kann langsam keinen meiner Enkel mehr vors Loch schieben, nach all dieser Zeit, die ich hier bereits verbrachte. Denn gerade anfangs läuft es noch nicht so geschwind...
Und jeder Weg offenbart neue Erkenntnisse...
Es ist immer wieder aufregend wie einfach manche Sketche gehalten sind und dennoch alles machen was sie sollen.

Und man muß den SOS-Code auch kennen, um einen Notfall erkennen zu können...

Hallo,

du musst dich mit millis() beschäftigen. Der ewig laufende Zähler des Arduinos. In den Beispieln der IDE gibt es Example "BlinkWithoutDelay". Durcharbeiten und verstehen lernen. Nimmste ein Array, schreibst deine Zeiten rein und toggelst immer dann die Led wenn der nächste Zeiteintrag erreicht ist und sprinst zum nächsten Zeiteintrag für den Zeitvergleich. Wenige Zeilen Code und keine Blockierung.

2 Likes

Und darum hättest du dein Beispiel ohne delay() und mit der millis-Funktion aufbauen sollen.
Dann wäre das Beispiel sicher für viele Interessant geworden.

Ich werde die Pinguine füttern gehen, vielleicht hilft mir das, den Sinn des Themas zu verstehen.

Der Blink Sketch hat die Aufgabe, so einfach wie möglich zu zeigen, dass die Programmierung eines Arduinos funktioniert.
Natürlich kann man drüber streiten, ob vier Zeilen Code in loop und simpelste Anweisungen oder der kürzeste Text einfacher sind.
Mein Favorit wäre eher

void loop() {
   digitalWrite (13, !(millis() & 0x400));
}

:slight_smile:
Wenn man es geschafft hat, den Blink Sketch zum Laufen zu bringen, kann man den natürlich beliebig erweitern, oder sich um andere Sachen kümmern.

1 Like

Hallo,

der TO verwendet verschiedene Zeiten. :wink:

Wenn du ein neues Thema startest, siehst du rechts oben "category" Da kannst du "International Deutsch" suchen und finden.

Nachtrag:
Starte das Forum mit

1 Like

Mach Dir einen Bookmark auf: Deutsch - Arduino Forum
fettig.

Bau doch mal ne Mastodoninstanz... Anbieten würde sich arduino.social oder so.

Ich Sehe Deine Idee einfach mal etwas selbst programmieren und einfach mal sich eine Aufgabe stellen und diese verwirklichen.

schau mal: https://docs.arduino.cc/learn/contributions/arduino-creating-library-guide

Die nächste Schrittt wäre dann alles mit millis() zu machen weil delay() blockierend ist.

Grüße Uwe

1 Like

Hier hast Du einen "Morsecode":

class Timer {
public:
  void start() { timeStamp = millis(); }
  bool operator()(const unsigned long duration) const { return (millis() - timeStamp >= duration) ? true : false; }

private:
  unsigned long timeStamp{0};
};

struct Symbols {
  const char* letters[26] {
  ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", 
  ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",  
  "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.." 
  };

  const char* numbers[10] {
    "-----", ".----", "..---", "...--", "....-", ".....",
  "-....", "--...", "---..", "----."
  };

  const char* whitespace[1] {" "};

  const char* getCode(char character) const {
    switch(character) {
      case 'A'...'Z': return letters[character-'A'];
      case 'a'...'z': return letters[character-'a'];
      case '0'...'9': return numbers[character-'0'];
    }     
    // Any character for which no encoding was stored.
    // It is treated like a space character (yet)
    return  whitespace[0];
  }
};

enum class Fstm : byte {next, startword, wait, lightup, lightoff, spacing, stop};

constexpr unsigned int DIT {250};
constexpr unsigned int DAH {3 * DIT};
constexpr unsigned int SYMBOL_SPACING {1 * DIT};
constexpr unsigned int LETTER_SPACING {3 * SYMBOL_SPACING};
constexpr unsigned int WORD_SPACING {7 * SYMBOL_SPACING};
// constexpr byte LED_PIN {LED_BUILTIN};
constexpr byte LED_PIN {3};

constexpr Symbols morse;

// This text is translated into Morse code
constexpr char text[] {"Ich sende das SOS Signal"};

Timer timer;

void fstm() {
  static Fstm state {Fstm::next};
  static unsigned long timerValue;
  static byte characterIdx {0};

  switch(state) {
    case Fstm::next:
      static byte codeIdx {0};
      const char* code;
      if (text[characterIdx]) { 
        code = morse.getCode(text[characterIdx]);
        if (*code == 32) {
          ++characterIdx;
          state = Fstm::startword; 
          break;
        }
      } else { 
        // If the text has been morst, start from the beginning
        // If this should not happen, then set the status Fstm::stop.
        characterIdx= 0;
        state = Fstm::startword;
        //state = Fstm::stop;
        break;
      }
      timerValue = (code[codeIdx] == '.') ? DIT : DAH;
      if(!code[codeIdx++]) { 
        codeIdx = 0; 
        ++characterIdx; 
        timerValue = LETTER_SPACING;
        state = Fstm::spacing;
        timer.start();
      } else { state = Fstm::lightup; }
      break;
    case Fstm::startword:
        timerValue = WORD_SPACING;
        state = Fstm::spacing; 
        timer.start();
        break;
    case Fstm::lightup:
      digitalWrite(LED_PIN,HIGH);
      state = Fstm::wait;
      timer.start();
      break;
    case Fstm::wait:
      if(timer(timerValue)) { state = Fstm::lightoff; }
      break;
    case Fstm::lightoff:
      digitalWrite(LED_PIN,LOW);
      timerValue = SYMBOL_SPACING;
      state = Fstm::spacing;
      timer.start();
      break;
    case Fstm::spacing:
      if(timer(timerValue)) { state = Fstm::next; }
      break;
    default:
      break;
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {  
  fstm();
}

Damit kann man auch mehr als SOS morsen....

Zum angucken. Wegen der besseren Sichtbarkeit mit "externer" LED:

1 Like