Anfänger/ Sketch funktioniert nicht.

Hallo,

Mein Name ist Jan und ich bin gerad dabei den Umgang mit Arduino Boards in Eigenregie zu erlernen.
Dazu habe ich mir ein Buch zur Hand genommen und los gelegt (Benjamin Kappel/ Arduino). Leider bin ich schnell auf einen Sketch gestoßen, der nicht funktionert und ich bin nicht in der Lage den Grund dafür zu finden.

#define GERLB_LED_PIN 12
#define ROT_LED_PIN 13

#define LANGER_IMPULS 1
#define KURZER_IMPULS 2

#define DAUER_LANGER_IMPULS 600
#define DAUER_KURZER_IMPULS 100

int signal[] =

{
  KURZER_IMPULS,KURZER_IMPULS,KURZER_IMPULS,
  LANGER_IMPULS,LANGER_IMPULS,LANGER_IMPULS,
  KURZER_IMPULS,KURZER_IMPULS,KURZER_IMPULS
};


void setup() 

{
 pinMode(GERLB_LED_PIN, OUTPUT);
 pinMode(ROT_LED_PIN, OUTPUT);
}

void loop() 
{
for (int i = 0; i < 9; i++)
{
  int impuls = signal[i];
  if (impuls == LANGER_IMPULS)
{  
 digitalWrite(ROT_LED_PIN, HIGH);
 delay (LANGER_IMPULS);
 digitalWrite(ROT_LED_PIN, LOW);
 delay (LANGER_IMPULS);
}
else if (impuls == KURZER_IMPULS)
{
 digitalWrite(GERLB_LED_PIN, HIGH);
 delay (KURZER_IMPULS);
 digitalWrite(GERLB_LED_PIN, LOW);
 delay (KURZER_IMPULS);
}
}
 delay(2500);
}

Sinn des Sketches ist es, ein SOS Signal von zwei LEDs Blinken zu lassen.
Das klappt aber nicht. Stattdessen gibt es nur ein kurzes Blinken nach ca 3 sek, von beiden LEDs und der gelben onboard LED. Ich habe wirklich keine Ahnung was an diesem Sketch falsch ist bin für Hilfe sehr dankbar.
Mein Problem besteht unter Anderem darin, dass ich diesen Sketch nach diversen Eigenversuchen einfach nur noch aus besagtem Buch abgeschrieben hab und er trotzdem nicht funktioniert.

Vielen Dank im Vorraus
Jan

Was heißt "er funktioniert nicht" ? Geht es auch genauer ? Was tut er, was nicht ? Was für einen Arduino verwendest du ?

Der Scetch sollte zwei LEDs dazu bringen ein SOS Signal zu blinken. Das Einzige was die LEDs tun, ist nach hochladen des Programms und einer Wartezeit von ca 3 Sekunden einmal kurz aufzublinken. Ich verwende ein Arduino Uno.

Ed_von_Schleck: Mein Problem besteht unter Anderem darin, dass ich diesen Sketch nach diversen Eigenversuchen einfach nur noch aus besagtem Buch abgeschrieben hab und er trotzdem nicht funktioniert.

Beschreibe die beabsichtigte Funktion mal genauer! Sollen die beiden LEDs an Pin-12 und Pin-13 immer synchron zur selben Zeit aufleuchten?

Oder sollen die LEDs unabhängig geschaltet werden, also erst soll an Pin12 "SOS" geblinkt werden, und wenn die LED fertig ist, soll an Pin-13 auch nochmal "SOS" geblinkt werden?

Wenn Du genau weißt, wie der Ablauf sein soll, kann man es auch so programmieren. dass es so abläuft.

Aber wenn Du nur luschig "irgendwas" als Ablauf beschreiben kannst, dann kannst Du auch nur "irgendwas luschiges" programmieren.

Im übrigen stimmt Dein Timing für Morsecode überhaupt nicht.

Wikipedia sagt zum Beispiel zu Morsecode, der aus "Punkt" und "Strich" besteht, dass der lange Code (Strich) immer dreimal so lang ist wie ein kurzer Code (Punkt).

Bei Dir soll allerdings das Verhältnis von lang zu kurz das sechsfache statt das dreifache betragen:

define DAUER_LANGER_IMPULS 600

define DAUER_KURZER_IMPULS 100

Das ist KEIN Morsecode.

Auch über das Pausen-Timing scheinst Du Dir nicht im klaren zu sein.

Zwischen den einzelnen Elementen eines Buchstabens muss jeweils eine kurze Pause von der Dauer eines Punktes sein.

Und zwischen zwei Buchstaben betträgt die Pausendauer der Dauer von drei Punkten.

Wenn Du schreibst, was und wie genau gesendet werden soll: a)entweder "SOS" gleichzeitig und synchron an Pin-12 und an Pin-13 b) oder "SOS" erst an Pin-12 und danach "SOS an Pin-13 könnte ich Dir mal einen Beispielcode dafür machen und hier posten

Zu Morsecode siehe auch https://de.wikipedia.org/wiki/Morsezeichen

Entschuldigung für die zu ungenaue Beschreibung.

Geplant war, eine LED für den kurzen Impuls und eine für den langen Impuls, also immer abwechselnd, leuchten zu lassen.

Danke für den Hinweis, dass ich keinen Morsecode verwendet habe. Mein Augenmerk lag lediglich auf dem Training mit der IDE, was für mich noch eine sehr schwierige Aufgabe ist. Ich werde die entsprechenden Zeiten gern anpassen.

Ed_von_Schleck: Entschuldigung für die zu ungenaue Beschreibung.

Geplant war, eine LED für den kurzen Impuls und eine für den langen Impuls, also immer abwechselnd, leuchten zu lassen.

"Du schreibst "war geplant, hat sich das geändert, und Du möchtest jetzt, wie bei Morsecode üblich, die kurzen "dits" und die längeren "dahs" immer auf derselben LED blinken lassen?

Das mit dem ständigen Wechselblinken zwischen den dits und den dahs hört sich irgendwie schräg an, und überhaupt nicht nach Morsecode, sondern nach einem Wechselblinker.

Das war wieder uneindeutig. Ich werde an meinen Formulierungen arbeiten.

Laut Autor soll dieser Sketch dafür sorgen, dass eine LED immer das "S"(die kurzen "dits") blinkt und die andere immer das "O"(die langen "dahs"). Bis zu Diesem Punkt konnte ich problemlos alles Andere aus diesem Buch nachvollziehen und verstehen.

Wieso kann man keinen SOS Wechselblinker programmieren? ;) ;) ;)

Für einen Anfänger ist das Programmieren verstehen / lernen mal wichtiger als das Einhalten der Morsezeichen.

@Ed_von_Schleck Visiv kontrolliert finde ich keinen Fehler im Sketch. Versuch mal mittels der seriellen Schnittstelle und dem Terminal im IDE herauszufinden was ausgeführt wird und was nicht.

ins setup() kommt Serial.begin (9600); Und nach jedem einschalten / ausschalten einer LED ein

Serial.println("LED ein lang"); oder Serial.println("LED aus lang"); oder Serial.println("LED ein kurz"); oder Serial.println("LED aus kurz");

So kannst Du kontrollieren was der Sketch macht oder nicht macht.

Grüße Uwe

Also, um jurs zu beruhigen: Die eine LED soll 3 mal kurz blinken, dann soll die andere 3 mal lang blinken. Dann wieder von vorne. Die Pausen zwischen den kurzen und zwischen den langen und die Pausen beim wechsel zwischen kurz und lang sollen unterschiedlich sein. Dazwischen ist nichts interaktives vorgesehen, delay ist also ok.

Wenn du das Basic Blink Beispiel geschafft hast, kannst du das doch auf 2 LED erweitern.

Aus dem einfachen Blink:

#define KURZ 200
void setup() {
   pinMode (13, OUTPUT);
}

void loop () {
  digitalWrite(13,HIGH);
  delay(KURZ);
  digitalWrite(13,LOW);
  delay(KURZ);
}

wird dann

#define KURZ 200
#define LANG 600
void setup() {
   pinMode (12, OUTPUT);
   pinMode (13, OUTPUT);
}

void loop () {
  digitalWrite(13,HIGH);
  delay(KURZ);
  digitalWrite(13,LOW);
  delay(LANG);
  digitalWrite(12,HIGH);
  delay(LANG);
  digitalWrite(12,LOW);
  delay(KURZ);
}

Das solltest du eigentlich auch ohne Buch und Forumshilfe hinkriegen. ;) Wenn die zweite LED nicht leuchtet, hast du sie falsch angeschlossen.

Wenn es klappt, dann eben statt direkt abwechselnd, jede LED 3 Mal. Und evtl. andere delay-Zeiten nach Geschmack. Wenn dir das copy und paste zu mühsam wird, kannst du dir ausdenken, eigene Funktionen zu schreiben. (-> Richtig Morsen)

Oder dir andere schlauere Sachen ausdenken.

Viel Spass.

Ed_von_Schleck:

{  

digitalWrite(ROT_LED_PIN, HIGH);
delay (LANGER_IMPULS);
digitalWrite(ROT_LED_PIN, LOW);
delay (LANGER_IMPULS);
}
else if (impuls == KURZER_IMPULS)
{
digitalWrite(GERLB_LED_PIN, HIGH);
delay (KURZER_IMPULS);
digitalWrite(GERLB_LED_PIN, LOW);
delay (KURZER_IMPULS);
}
}

sollte es nicht statt “LANGER_IMPULS” : “DAUER_LANGER_IMPULS” heissen?
Ebenso bei “KURZER_IMPULS”…DAUER_KURZER_IMPULS, ansonsten blitzen Deine LEDs mit nur 1 bzw 2 millisekunden auf.

Wenn ich raten darf, dann wurde hier aus dem Buch falsch abgetippt, oder im Buch falsch gedruckt.

Die Zeilen

delay (LANGER_IMPULS);
 digitalWrite(ROT_LED_PIN, LOW);
 delay (LANGER_IMPULS);

und

delay (KURZER_IMPULS);
 digitalWrite(GERLB_LED_PIN, LOW);
 delay (KURZER_IMPULS);

sind mit Sicherheit falsch, denn KURZER_IMPULS ist auf 2 und LANGER_IMPULS auf 1 gesetzt per #define:

#define LANGER_IMPULS 1
#define KURZER_IMPULS 2

statt dessen sollten im delay die definierten Werte für

#define DAUER_LANGER_IMPULS 600
#define DAUER_KURZER_IMPULS 100

verwendet werden.

Also sowas wie

delay (DAUER_KURZER_IMPULS);
 digitalWrite(GERLB_LED_PIN, LOW);
 delay (DAUER_KURZER_IMPULS);

Mario.

... Für einen Anfänger ist das Programmieren verstehen / lernen mal wichtiger als das Einhalten der Morsezeichen. ...

... Also, um jurs zu beruhigen: ...

Danke für Eure Einwürfe :-) Ich empfehle jurs ein Entspannungstraining (je mehr Termine, desto besser).

Und an den OP: Michaels Code ist eine Lösung, die mir wegen der #defines am Anfang nicht so sehr gefällt. Wenn Du statt dessen

const byte kurz=200;
const int lang=600;

nimmst, kann der Compiler die Typprüfung vornehmen, die wegen der #defines AFAIK nicht möglich ist. #define-Sachen werden vor dem eigentlichen Compilieren einfach nur ersetzt (wie in „suchen und ersetzen“). Das ist bei so einem einfachen/kurzen Code Düpfelescheißerei, aber manchmal bin ich so einer.

Manchmal auch nicht (aber heute ist Montag ... :-)

Gruß

Gregor

PS: Ach ja, Frühlingsanfang ist ja auch noch.

@Moko: Ich habe gerad deine Lösung probiert. Ja, jetzt funktioniert es! Vielen Dank!

@michael_x: Auch dir vielen Dank. Du hast natürlich Recht. Die von Dir geposteten Sketches sollte ich ohne Buch und Forumshilfe hinbekommen (Mein erster “SOS” Versuch hatte deutlich mehr Zeilen als dein Beispiel, hat aber immerhin funktioniert).
Leider hat es in dem oben von mir geposteten Sketch nicht geklappt und das ist einer aus einem Buch. Da lag mein Problem: Kann ich diesem Buch trauen, oder lerne ich mit Folgefehlern weiter?

Ansonsten hab ich auch jetzt schon, trotz meiner noch sehr eingeschränkten Möglichkeiten, mordsmäßig Spass mit dem board. :slight_smile:

Auch allen Anderen hier einen herzlichen Dank für kompetente und schnelle Hilfe!
Beides ist nicht selbstverständlich.

Grüße
Jan

Ed_von_Schleck: ... Da lag mein Problem: Kann ich diesem Buch trauen, oder lerne ich mit Folgefehlern weiter? ...

Falls das Buch aus Franzis' Verlag stammt, solltest Du IMO auf jeden Fall mit weiteren Fehlern rechnen. In meinem Buch zum Lernset war schon im ersten Sketch ein Fehler (der auf der CD interessanterweise nicht war), den ich nur entdeckt habe, weil ich damals schon eifrig am C/C++-Lernen war.

Ed_von_Schleck: Ansonsten hab ich auch jetzt schon, trotz meiner noch sehr eingeschränkten Möglichkeiten, mordsmäßig Spass mit dem board. :)

Die Fantastischen Vier meinen dazu: Alles ist gut, was man gerne tut - egal, ob hyperventilierend oder ausgeruht.

Noch mehr Spaß: https://www.youtube.com/watch?v=B88OOlQ3sIc

Gruß

Gregor

@gregorss: Nein es ist aus dem Rheinwerk Verlag. :slight_smile:

Ja, der Link ist echt witzig.

Schau mal ob es zu Deinem Buch beim Verlag ein Fehlerkorrekturdokument gibt. Müsse das sein: https://www.rheinwerk-verlag.de/arduino_3797/supplements aber da ist Dein Fehler nicht drin. Melde es wenn Du willst dem Verlag.

Ansonsten sage ich mal, jetzt hast Du mehr gelernt als im Beisopiel zu lernen war. ;) ;) ;)

@mkl0815 Bravo. Das hatte auch ich übersehen.

Grüße Uwe

@gregorss:

... const byte kurz=200; const int lang=600;

Im Prinzip gebe ich dir recht, aber damit hast du ein schönes und völlig überflüssiges Problem gezeigt

const byte TEST = 260;
void setup() { Serial.begin(9600); }

void loop() { Serial.write('.');  delay (TEST);}

Lässt sich prima kompilieren und hochladen, und man muss schon genau schauen, um die Warnung warning: large integer implicitly truncated to unsigned type [-Woverflow] nicht zu übersehen. (Der Unterschied 4 statt 260 kann wohl auffallen, 244 statt 500 wird schwieriger zu erkennen)

Da die Konstante zur Übersetzungszeit fest ist und sie in einem Funktionsaufruf verwendet wird, wo alles bis unsigned long erlaubt ist, macht der Compiler das schon selbst perfekt und ob du const byte oder const int verwendest, macht keinen Unterschied. (das richtige[b] const unsigned int [/b]ist wirklich zuviel Tipperei ;) ).

Ausserdem sollte man, wenn man hilft, nicht unnötig viel verändern finde ich. Hier ging es um die Frage warum der Sketch was anderes macht, und nicht um die Grundsatzdiskussion const / #define.

Im Prinzip gebe ich dir Recht (const ist besser als #define) aber weil heute Montag ist ;)

@Jan (Ed): Das gehört hier dazu, dass der Thread nicht mehr dir gehört.

Ed_von_Schleck:
Laut Autor soll dieser Sketch dafür sorgen, dass eine LED immer das “S”(die kurzen “dits”) blinkt und die andere immer das “O”(die langen “dahs”).

OK, ddann habe ich mal etwas dafür vorbereite und auch etwas auf das Pulse/Pause-Timing geachtet, wie es sein sollte

const byte ditPin=12;
const byte dahPin=13;
#define DIT 100
#define DAH 3*DIT
#define PAUSE 2*DIT

void dit()
{ // function playing a short dit/dot
  digitalWrite(ditPin,HIGH);
  delay(DIT);
  digitalWrite(ditPin,LOW);
  delay(DIT);
}

void dah()
{
  digitalWrite(dahPin,HIGH);
  delay(DAH);
  digitalWrite(dahPin,LOW);
  delay(DIT);
}


void setup()
{
  Serial.begin(9600);
  pinMode(ditPin,OUTPUT);
  pinMode(dahPin,OUTPUT);
  
}

void sendMorse(char* text)
{
  for(int i=0;i<strlen(text);i++)
  {
    char c=text[i];
    Serial.print(c);
    switch(c)
    {
      case 'S':dit();dit();dit();delay(PAUSE);break;
      case 'O':dah();dah();dah();delay(PAUSE);break;
      case ' ':delay(2*PAUSE);break;
  }
  }  
}

void loop()
{
  sendMorse("SOS ");

}

Nach jedem gesendeten dit() oder dah() WIRD automatisch eine ganz kurze Pause eingelegt, die von der Dauer der Dauer eines dit entspricht.

Zwischen zwei Buchstaben ist die Pause länger als zwischen zwei aufeinanderfolgenden dits oderdahs. Und die längste Pause gibt es zwischen zwei Worten.

Das Leerzeichen am Ende von sendMorse("SOS "); steht dafür, dass nach SOS ein Wort zuende ist.
Viele andere Worte kann man momentan auch mit dem Code nicht senden, weil ja nur zwei Buchstaben in der switch-case-Anweisung mit ihren dits und dahs codiert sind. Vielleicht möchtest Du ja das gesamte Alphabet und auch die Ziffern codieren.

Aber dafür gäbe es auch andere Möglichkeiten, den gesamten Morsecode-Zeichensatz effizient und speichersparend im Programm unterzubringen, als alles in die switch-case-Anweisung reinzuschreiben.

Wenn Du das Sendetempo verändern möchtest, brauchst Du nur die DIT Dauer anders definieren, zum Beispiel
#define DIT 150

@Uwefed: Das Fehlerkorrekturdokument hatte ich bereits, da waren aber nur andere drin. ;)

@michael_x: Ob der Thread noch mir gehört, oder nicht ist egal. Ich lese und lerne. Wenn ich etwas nicht verstehe, mach einfach einen neuen auf. ;)

@jurs: Vielen Dank, dass du dir die Arbeit gemacht hast! :) Damit hab ich jetzt bereits mehrere Versionen mit denen ich rumprobieren kann. Bzw. an denen ich Ihre Vor und- Nachteile erst mal selbst finden kann.^^