INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 2 Bewertungen - 3 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Morseprogramm
10.07.2018, 15:54 (Dieser Beitrag wurde zuletzt bearbeitet: 10.07.2018 16:42 von Interstellar.)
Beitrag #1
Morseprogramm
Hallo alle zusammen!
Wir arbeiten gerade an einem Morseübersetzer-Projekt, bei dem Buchstaben mit einem Potentiometer ausgewählt werden können und in Morsecode umgewandelt werden.
Bisher funktioniert schonmal, dass man mit dem Poti einen Buchstaben auswählen kann (wenn man den Schieberegler schiebt werden dort auch die Buchstaben auf dem LCD-Display angezeigt). Dann kann man mit einem Knopf den Buchstaben auswählen, dieser wird zusammen mit dem dazugehörigen Morsecode auf dem LCD-Display angezeigt und dazu blinkt eine Lampe und ein Lautsprecher piepst. Dieser Prozess wird sooft wiederholt, bis man seinen Satz geschrieben hat den man haben will. Dann kann man auf den zweiten Taster drücken, womit dann zunächst die ienzelnen Buchstaben mit Morsecode auf dem Display nochmal angezeigt werden sollen.
Und jetzt kommt das Problem: Wenn das Programm fertig mit den einzelnen Buchstaben ist, soll unten auf dem Display der Morsecode und oben der Satz erscheinen und da meinstens zumindest der Morsecode länger als 16 Zeichen hat sollen diese dann von rechts nach links immer durchlaufe, bis das Programm neu gestartet wird. Allerdings wird nachdem die einzelnen Buchstaben angezeigt wurden gar nichts mehr angezeigt.

Wir bitten um eine Rückmeldung, wer Vorschläge oder Verbesserungsideen hat. Das Programm befindet sich im Anhang.
Vielen Dank schonmal im Vorraus!!

Code:
// Morseprogramm
// Version 5.0
//


// -------------------------------------------------------------------------------
// Definitionen
// -------------------------------------------------------------------------------

int dot  = 80;            // 1 Zeiteinheit für kurz, Signal
int dash = 3*dot;         // 3 Zeiteinheiten für lang, Buchstaben
int leer = 7*dot;         // 7 Zeiteinheiten Leerzeichen
int f    = 880;           // Tonfrequenz
int b;                    // für Buchstaben aus Morsecode
int z;                    // aus Alphabet


String morse;
String satz;


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C Lcd(0x27,16,2); // Display

String morseCodes[27]{    // Tabelle für alle Morsecodes
  ".-",                   // 0 = A
  "-...",
  "-.-.",
  "-..",
  ".",
  "..-.",
  "--.",
  "....",
  "..",
  ".---",
  "-.-",
  ".-..",
  "--",
  "-.",
  "---",
  ".--.",
  "--.-",
  ".-.",
  "...",
  "-",
  "..-",
  "...-",
  ".--",
  "-..-",
  "-.--",
  "--..",
  " "                      // 26 = Leerzeichen
};

// -------------------------------------------------------------------------------
String alphabet[27]{
  "A",
  "B",
  "C",
  "D",
  "E",
  "F",
  "G",
  "H",
  "I",
  "J",
  "K",
  "L",
  "M",
  "N",
  "O",
  "P",
  "Q",
  "R",
  "S",
  "T",
  "U",
  "V",
  "W",
  "X",
  "Y",
  "Z",
  "-",
};



// -------------------------------------------------------------------------------
// fürs Hauptprogramm

char   buchstabe;
int    buchstabe_ascii;
int    j;
int    k;
int ii = 0;
int strLength;
String toShow;
String zuZeigen;


// -------------------------------------------------------------------------------
// FUNKTIONEN
// -------------------------------------------------------------------------------


void morseBuchstabe (int b){ // b = Nr. des Buchstaben

  int    i;      // zum Durchzählen der Zeichen
  char   c;      // zu morsender Buchstabe
  String mCode;  // Morse-Code des Buchstaben




  mCode = morseCodes [b];                         // Morse-Code aus Tabelle lesen
//  Serial.print (String(b)+": "+String(mCode)+" ::");
  Serial.print (String(mCode)+" ::");

  morse.concat(mCode + " ");                      //Enter ergänzen für Morsecode
  
  i = 0;
    
  while (mCode.charAt(i)) {                       // alle Zeichen des Morse-Codes
    c = mCode.charAt(i);
    // Serial.print (c);
    i++;

    switch (c) {
      case '.': {
        Serial.print (" KURZ");
        tone(11,f);
        digitalWrite(13,HIGH);
        Lcd.setCursor(i-1,1);
        Lcd.print(".");                // Displayanzeige Punkt
        Lcd.backlight();
        Serial.print(".");
        delay(dot);
        noTone(11);
        digitalWrite(13,LOW);
        delay(dot);
      
        }
        break;

      case '-': {
        Serial.print (" LANG");
        tone(11,f);
        digitalWrite(13,HIGH);
        Lcd.setCursor(i-1,1);
        Lcd.print("_");    
        Lcd.backlight();
        Serial.print("-");
        delay(dash);
        noTone(11);
        digitalWrite(13,LOW);
        delay(dot);
                                      //Displayanzeige Strich
        
        }
        break;


      case ' ': {
        Serial.print (" LEER");
        noTone(11);
        digitalWrite(13,LOW);
        Lcd.clear();
        Lcd.setCursor(i-1,1);
        Lcd.print(" ");  
        Lcd.backlight();
        Serial.print(" ");
        delay(leer);
                                      //LCDleer
        }
        break;        
    }

    
  }

}

// -------------------------------------------------------------------------------

void alphabetLcd(int z){    //Buchstaben vom POTI anzeigen
  String alpha;

  alpha = alphabet[b];
  
  Lcd.setCursor(0,0);
  Lcd.print(alpha);
  Lcd.backlight();

  Serial.println(alpha);


}


// -------------------------------------------------------------------------------


  void lesePoti() {
  int o;
  o = analogRead(A2);
  b = map(o,0,1023,0,26);
  alphabetLcd(b);


}

// -------------------------------------------------------------------------------
// -------------------------------------------------------------------------------



void setup() {
  pinMode(13, OUTPUT);               // LED
  pinMode(11, OUTPUT);               // Lautsprecher
  Serial.begin(9600);
  Lcd.init();                      // LCD
  Lcd.backlight();
  analogRead(A2);                    // POTI
  pinMode(4,INPUT_PULLUP);           // Taster
  pinMode(5,INPUT_PULLUP);          //  Satz
  strLength = morse.length();
  
}


// -------------------------------------------------------------------------------


void loop() {
  
    j=0;

    do {

        while(digitalRead(4)==1 && digitalRead(5)==1){
           lesePoti();
        }

        if(digitalRead(4)==0){
           satz.concat(alphabet[b]);
           morseBuchstabe(b);
           delay(dash);                       // Pause nach einem Buchstaben
           Lcd.clear();
           Serial.println();
          //Serial.println("\n");
        }

      
    } while (digitalRead(5)==1);

    if (satz.length()==0){                    //Satz wenn nur die Enter-Taste gedrückt wird, ohne das ein Buchstabe ausgewählt wurde
      satz="CAN YOU HEAR ME MAJOR TOM ";
      morse="-.-. .- -.  -.-- --- ..-  .... . .- .-.  -- .  -- .- .--- --- .-.  - --- --";
    }

    Lcd.backlight();
    Lcd.setCursor(0,0);
    Lcd.print(satz);

    
    Serial.println(satz);
    Serial.println(morse);


// ganzen Satz morsen

    delay(leer);
    Lcd.clear();

//den einzelnen Buchstaben nochmal anzeigen
    while (satz.charAt(j)) {
      buchstabe = satz.charAt(j);
      buchstabe_ascii = buchstabe;
      j++;
    
      if (buchstabe_ascii == 32)    //für Leerzeichen
       {
        Lcd.setCursor(0,0);
        Lcd.print("                 ");
        morseBuchstabe (26);
        Lcd.setCursor(0,1);
        Lcd.print("                 ");
        Lcd.backlight();
       }
      else
       {
        Lcd.setCursor(0,0);
        Lcd.print(buchstabe);
        morseBuchstabe (buchstabe_ascii-65);
        Lcd.setCursor(0,1);
        Lcd.print("                 ");
        Lcd.backlight();
        delay(dash);
       }

  
    }

//hier sollte das Display nun durchlaufen, allerdings zeigt es gar nichts mehr an

//Durchlaufen

while(true){
  Lcd.setCursor(0,1);
  toShow = morse.substring(ii,ii+16);
  Lcd.print(toShow);
  Lcd.setCursor(0,0);
  zuZeigen = satz.substring(ii,ii+16);
  Lcd.print(zuZeigen);

  ii = ii + 2;

  if(ii>(strLength-16)) {
    ii = 0;
  }

  delay(500);}




}


Angehängte Datei(en)
.ino  Morseprogramm5.0.ino (Größe: 6,42 KB / Downloads: 24)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.07.2018, 16:04
Beitrag #2
RE: Morseprogramm
Stelle Deinen Sketch bitte in Codetags direkt ein. Wie das geht, steht hier.

Beschreibe bitte auch noch mal genauer, was das Programm macht und was nicht. Ich werde aus Deiner Beschreibung nicht ganz schlau.

Um wieviele Zeichen geht es?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.07.2018, 17:16
Beitrag #3
RE: Morseprogramm
(10.07.2018 16:04)Tommy56 schrieb:  Stelle Deinen Sketch bitte in Codetags direkt ein. Wie das geht, steht hier.

Beschreibe bitte auch noch mal genauer, was das Programm macht und was nicht. Ich werde aus Deiner Beschreibung nicht ganz schlau.

Um wieviele Zeichen geht es?

Gruß Tommy

Ok, Dankeschön!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.07.2018, 17:25
Beitrag #4
RE: Morseprogramm
(10.07.2018 17:16)Interstellar schrieb:  Ok, Dankeschön!
Gern geschehen.

Es wäre aber durchaus sinnvoll die Fragen zu beantworten.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.07.2018, 17:33
Beitrag #5
RE: Morseprogramm
(10.07.2018 17:25)Tommy56 schrieb:  
(10.07.2018 17:16)Interstellar schrieb:  Ok, Dankeschön!
Gern geschehen.

Es wäre aber durchaus sinnvoll die Fragen zu beantworten.

Gruß Tommy

Ach so, tut mir leid.
Meinst du in Bezug auf die Morsezeichen und den Satz?
Die Länge ist nicht festgelegt, da der Nutzer einen Satz frei wählen können soll und je nach den Buchstaben dann der Morsecode auch immer unterschiedlich lang sein kann.
Wir könnten in Erwängung ziehen den Satz auf eine bestimmte Anzahl an Zeichen festzulegen, allerdings wäre damit immer noch nicht die Länge des Morsecodes geklärt, da dieser pro Buchstabe zwischen einem und vier Zeichen liegen kann.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.07.2018, 18:12 (Dieser Beitrag wurde zuletzt bearbeitet: 10.07.2018 18:12 von Tommy56.)
Beitrag #6
RE: Morseprogramm
Du willst ja die Buchstaben am Ende noch mal ausgeben.
Also brauchst Du ein Array, in dem Du Dir die Buchstaben merkst. Dessen maximale Länge musst Du festlegen.
Das sage ich deshalb, weil ich Dir empfehle auf dem Arduino die Klasse String ganz schnell zu vergessen und Dein Programm auf Char-Arrays umzuschreiben. Du hast sonst bei längerem Betrieb oft unerklärliche Fehler.
Nähere Informationen dazu habe ich in Zeichenketten in C zusammen geschrieben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.07.2018, 20:18
Beitrag #7
RE: Morseprogramm
(10.07.2018 18:12)Tommy56 schrieb:  Du willst ja die Buchstaben am Ende noch mal ausgeben.
Also brauchst Du ein Array, in dem Du Dir die Buchstaben merkst. Dessen maximale Länge musst Du festlegen.
Das sage ich deshalb, weil ich Dir empfehle auf dem Arduino die Klasse String ganz schnell zu vergessen und Dein Programm auf Char-Arrays umzuschreiben. Du hast sonst bei längerem Betrieb oft unerklärliche Fehler.
Nähere Informationen dazu habe ich in Zeichenketten in C zusammen geschrieben.

Gruß Tommy
Ok, dazu müssen wir uns mal genauer informieren aber vielen Dank schonmal. Allerdings haben wir jetzt auch das Problem, dass es gar nicht erst bis zu while(true) kommt. Wir haben dies auch mit einigen anderen Befehlen davor ausprobiert, aber wir können nicht rausfinden woran das liegt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.07.2018, 20:49
Beitrag #8
RE: Morseprogramm
Deine while(true) - Schleife ist eine Endlosschleife, deren Sinn ich nicht verstehe.
Ich würde Euch vorschlagen, das Programm anders zu strukturieren.
Grundzustand = nix tun.
Start Eingabe = Taste1
Solange Zeichen eingeben, bis Endetaste
Nach Endetaste Ausgabe der ganzen Zeichenkette.

Das alles ungesteuert im Loop zu verwursten geht schief.
Schaut Euch mal Infos zu "Schrittkette" oder "Endlicher Automat" an.

Da sind auch noch mehr Ungereimtheiten drin. z.B.:
Code:
void alphabetLcd(int z){    //Buchstaben vom POTI anzeigen
  String alpha;

  alpha = alphabet[b];
  
  Lcd.setCursor(0,0);
  Lcd.print(alpha);
  Lcd.backlight();

  Serial.println(alpha);
}
Ihr übergebt z, nutzt aber die globale Variable b (alphabet[b]). Das ist unsinnig.

Schaut Euch das Ganze nochmal an. Es mag zwar streckenweise funktionieren, ist aber sehr unsauber und damit auch schlecht für Erwiterungen, wie der Endeausgabe, geeignet. Dafür muss man sauber die Betriebszustände unterscheiden. while(true) ist in 99,99% unsinnig. Der Rest ist kein Einsteigerstoff.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste