Goedemiddag, lang geleden, maar alles wat ik wist van C is verdwenen. Ik ben bezig met een morse-verhaal, dat werkt op de cijfers na. En ik zie niet waar dat probleem zit, vandaar mijn vraag: waarom?



// Morse zender by pola

// De pen waar de luidspreker aan zit:
#define LUIDSPREKER 3 

// Morse seinsnelheid (hoger cijfer is langzamer):
#define SNELHEID 70

void setup() {
 pinMode(LUIDSPREKER, OUTPUT);
}

void loop() {
 Sein("cq de pa0atd vvv vvv vvv test the quick brown fox jumps over the lazy dog"); 
 delay(1000000);
}

void Sein(String tekst) {
 String alfabet[]= {
   //a      b      c  
  ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","_","..-","...-",".--","-..-","-.--","--.."
 };
 for(int i=0; i<tekst.length(); i++) {
  if(tekst[i]==' ') delay(SNELHEID*4); 
  else {  
   String morse=alfabet[tekst[i]-'a'];
   for(int j=0; j<morse.length(); j++) {
    tone(LUIDSPREKER,1200);
    delay(morse[j]=='.'? SNELHEID:SNELHEID*3);
    noTone(LUIDSPREKER);
    delay(SNELHEID);
   }
   delay(SNELHEID*3);
  }
 }   
}

Als iemand mij verder kan helpen: Graag en Dank!

Hoe bedoel je precies 'werkt op de cijfers na'?

Ik ken geen C, maar zie wel dat in je alfabetstring nog geen cijfers voorkomen. En je checkt ook nog niet of het karakter een letter of cijfer (of iets anders) is. Dat zou dan eerst moeten.
En als het een cijfer is, dan zou je de morsecode uit een andere alfabetstring kunnen halen (en dan tekst[ i]-'0' i.p.v. -'a').

Óf je gebruikt één (langere) alfabetstring waar ook de cijfers (en de tussenliggende symbolen, eventueel als dummies) in zitten.

Goed gezien heer Terman, de andere tekens staan er nu niet achter.
Hebben er gestaan, een lange rij van cars. Helaas, hij stopt hoe dan ook bij de z. Iemand telt, maar wie?

Cijfers (en hoofdletters) hebben een lagere code dan 'a'. Is dat niet gewoon het probleem dan? Je zou dan een negatieve index krijgen. ;)

1 2 3 4 5 6 7 " 8

     1          2       3        4       5          6        7 "    8         9         9        <        >       as         é
  ".----","..---","...--","....-",".....","-....","--...","---..","----.","-----","-.-.-",".-.-."," .-..."," -..-."

Deze regels stonden er achter, meer weet ik niet.

Je c is duidelijk minder weggezakt dan mijm c.

-'a' is voor kleine letters juist (karakter 'a' geeft dan index 0. Als de compiler 'a' als 97 ziet

Maar ook voor cijfers?

'1' is namelijk ascii nr 49

Ik zou de uitddukking text-'a'
Even seriail.write doen.

Geen idee of het helpt.

Ik ben nog van generatie array of char strings en niet String objects

Frederick zn post zie ik nu pas en had stuk minder text nodig om zelfde te zeggen :-)

[Bericht gewijzigd door Andre_avr op (11%)]

Ach, ik ben van basic en een beetje assembler, in 1980. Dat is echt allemaal opgedroogd. Dank anyhow.

Op maandag 29 januari 2024 16:24:46 schreef pola:
[...] Deze regels stonden er achter, meer weet ik niet.

Ja, dan is dat dus het probleem.
Je moet de karakters op volgorde van (ascii-)code zetten, en bij het volgende te verzenden karakter de (ascii)code van het eerste karakter in de string aftrekken.

Dus als je ook cijfers wilt verzenden, en je wilt maar één rij met morsetekens met één check gebruiken, dan moet je rij beginnen bij '0'.
Alle tekens 0...9, A...Z, a...z staan daar dus in, inclusief alles ertussenin.
Voor sommige leestekens moet je misschien nóg eerder in de ascii-tabel beginnen.

Niet alles heeft een geldige morsecode, maar dat geeft niet; voor de ongebruikte tekens kun je dummies zetten zoals ik al zei. Ze worden tóch niet verzonden.

Wat FET ook al zegt:

'a' = 96
'b' = 97
'A' = 65
'0' = 48 (ascii decimaal)

Als het regeltje hieronder wordt doorlopen voor de letter 'b' (brown fox..) dan krijg je:


String morse=alfabet[tekst[i]-'a'];
> String morse=alfabet['b' -'a'];
> String morse=alfabet[97-96];
> morse = "-..."  #dit is alfabet[1]; 

Bij de 0 krijg je dus het niet bestaande element alfabet[48-96]..

Je kan de code 'ascii compatible' maken door alfabet array 128 velden te geven.. De eerste 32 velden laat je leeg of maak je '------', 'X' of 'ERROR' dan alle symbolen, cijfers, hoofdletters die je maar wil ondersteunen. Wel invullen op volgorde van de ascii tabel.


#String morse=alfabet[tekst[i]-'a'];
De regel hierboven wordt dan: 
String morse=alfabet[tekst[i]];

Ik ken geen C#, maar volgens mij komt dit toch wel in de buurt:


// Morse zender by pola

// De pen waar de luidspreker aan zit:
#define LUIDSPREKER 3 

// Morse seinsnelheid (hoger cijfer is langzamer):
#define SNELHEID 70

void setup() 
{  pinMode(LUIDSPREKER, OUTPUT);
}

void loop() 
{  Sein("cq de pa0atd vvv vvv vvv test the quick brown fox jumps over the lazy dog"); 
   delay(1000000);
}

void Sein(String tekst) 
{
   String alfabet[]= 
   {
     //a      b      c  
  ".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","_","..-","...-",".--","-..-","-.--","--.."
   };

   String Digits[] =  
   {
     //  0     1          2       3        4       5          6        7      8         9         9        <        >       as         é 
     "-----",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----","-.-.-",".-.-."," .-..."," -..-." 
   };

   for(int i = 0; i < tekst.length(); i++) 
   {
      char c = tekst[i];
      if(c == ' ') 
         delay(SNELHEID*4); 
      else 
      {  String Morse;
         if(c >= 'a') 
            morse = alfabet[c -'a'];
         else if(c >= 'A') 
            morse = alfabet[c -'A'];
         else if(c >= '0') 
            morse = Digits[c -'0'];

         for(int j = 0; j < morse.length(); j++) 
         {  tone(LUIDSPREKER,1200);
            delay(morse[j] == '.' ? SNELHEID : SNELHEID * 3);
            noTone(LUIDSPREKER);
            delay(SNELHEID);
         }
         delay(SNELHEID*3);
      }
   }   
}

Op maandag 29 januari 2024 16:32:57 schreef pola:
Ach, ik ben van basic en een beetje assembler, in 1980. Dat is echt allemaal opgedroogd. Dank anyhow.

/off-topic:

Ik zag de roepnaam (PA0ATD) in de sourcecode en toen viel het kwartje...
Volgens mij deed je in die jaren nog wel wat meer als basic en assembler. Dr. Albert I presume, importeur van Icom (Amcom, Aalsmeer). Ik herinner mij de uitgebreide advertenties met altijd leuke verhalen

/on-topic

Ja Mans, geheel juist! Veel taart! En diverse schrijvers, dat ook. Andere tijden. Maar C, erg moeilijk voor de oude man. 73 de atd

En voor iedereen: ik zal mij verdiepen in de ascii - tabel. En u op de hoogte houden.

Op maandag 29 januari 2024 17:11:37 schreef deKees:
Ik ken geen C#, maar volgens mij komt dit toch wel in de buurt:

Het is een beetje muggeziften maar als je werkt met de arduino IDE = arduino software dan is dat C++. Daarin werkt ook bijna alles wat gewoon C is. Maar C# zal daar niet in werken.

Of bedoel je dat je niet de arduino IDE gebruikt maar iets anders wat wel specifiek C# is.

Als het om details gaat maakt het wel uit of je met C,C++ of C# werkt en sommige antwoorden zullen wel of niet werken.