В функцию не передаются русские буквы.

ua6cfo
ua6cfo аватар
Offline
Зарегистрирован: 13.10.2014
Вот код:
 
int p12 = 12; // PIN #12 - подключен пьезоизлучатель
int p13 = 13; // PIN #13 - подключен светодиод
int dlit = 50; // Длительность точки (как "атомарная длинна")
int let = dlit * 3; // Длительность тире
bool start = true;
 
void loop() {
if (start == true) {
   start = false;
   beep('A'); beep('l'); beep('e'); beep('x'); beep('e'); beep('y'); // Так все хорошо работает !!!
   pauza();
 }  }
 
 
void beep(char bukva) {
  if (bukva == 'A' || bukva == 'a' || bukva == 'A' || bukva == 'а') {a();}; // Пропищать .- а
...
....
....
....
 
 
Если подставить русские буквы:
beep('А'); beep('л'); beep('е'); beep('к'); beep('с'); beep('е');  beep('й');
...то ничего не происходит - пищалка морзянку не пищит, мыргалка не мыргает...
 
Почему ?
 
faraddin
Offline
Зарегистрирован: 11.08.2013

а Вы ее напрямую в теле программы передаете или через терминал?

sergeevalex
Offline
Зарегистрирован: 15.10.2012

тип char принимает значения до 127. Кириллица - от 192 (А) до 255 (я).

faraddin
Offline
Зарегистрирован: 11.08.2013

попробуйте unsigned char

toc
Offline
Зарегистрирован: 09.02.2013

ua6cfo,
1. добавьте в начало метода beep вывод значения параметра в терминал.
2. посмотрите и запишите что он выводит
a. для разных латинских букв
b.для кирилических букв
3. опубликуйте тут результаты

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Вы не учли что расские буквы представленны в юникоде а это значит что нужно сравнивать по 2 байта или хотябы каждый 2 байт.

И сравнение лучше всего вывести в

switch(i){
case:1
//i = 1
break;
case:2
//i=2
break;
}

там организовать промежуточную функцию morze(char * str, uint8_t len){} где будет перебираться строка

и обращяться к ней так morze('.-',2);

 

ua6cfo
ua6cfo аватар
Offline
Зарегистрирован: 13.10.2014

Для:

beep('A'); beep('l'); beep('e'); beep('x'); beep('e'); beep('y');

------

A
l
e
x
e
y
----------
 
Для:
beep('А'); beep('л'); beep('е'); beep('к'); beep('с'); beep('е');  beep('й');
-------
»
µ
º
µ
¹
--------
Проблему понял - надо использовать переменную размером два байта на символ...
Тогда что вместо "char" использовать "word" ?! Сегодня попробую...

 

ua6cfo
ua6cfo аватар
Offline
Зарегистрирован: 13.10.2014

Если использовать: 

void beep(word bukva) {

    if (bukva == 'A' || bukva == 'a' || bukva == 'A' || bukva == 'а'){a();};
    if (bukva == 'B' || bukva == 'b' || bukva == 'Б' || bukva == 'б'){b();};
    if (bukva == 'C' || bukva == 'c' || bukva == 'Ц' || bukva == 'ц'){c();};
 
то на:
beep('А'); beep('л'); beep('е'); beep('к'); beep('с'); beep('е');  beep('й');
Выдает какю-то ахинею... Оставляю только: beep('А'); (А-русская) - вообще ничего не выдается...
 
Какой тип двухбайтной переменной "bukva" использовать ?
NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Я же сказал что нужно переработать весь принцип программы. Сделать обработчик "Целой" строки а не отдельных букв. Сделать преобразование в заглавные буквы целевой строки как для юникода(руссике буквы) так и для латыницы. Если в латынице они все последовательны, то с юникодом сложнее там часть строчных русских букв в другой таблице: "абв..." таблица D0, а "рст..." таблица D1. Микроконтроллер 8-битный поэтому ему проще оперировать переменными размером 1 байт.

sergeevalex
Offline
Зарегистрирован: 15.10.2012
byte incomingByte = 0; 
void setup() {
 Serial.begin(9600); 
} 
void loop() {
 if (Serial.available() > 0) {
  incomingByte = Serial.read(); 
  Serial.print("Input - ");
  Serial.print(char (incomingByte));
  Serial.print(" - with code - ");
  Serial.println(incomingByte, DEC);
 }
}

Цитата:

Какой тип двухбайтной переменной "bukva" использовать ?

Попробуйте byte, должно хватить. Для "я" - 255.

 

ua6cfo
ua6cfo аватар
Offline
Зарегистрирован: 13.10.2014

Получается, что задача в таком виде не решабельна. :-(

В коде Морзе существуют такие буквы как: ч,ш,э,ю,я, которые не имеют аналогов в коде морзе с остальными буквами.

Если написать на компьютере программу, которая делает то, что Вы, NeiroN, предлагаете - так Aduino тут вообще не нужен. Достаточно к COM порту присобачить релюшку или оптрон и вперед... Таких программ для ПК сейчас сколько хочешь...

ua6cfo
ua6cfo аватар
Offline
Зарегистрирован: 13.10.2014

To sergeevalex: Спасибо ! Попробую...

sergeevalex
Offline
Зарегистрирован: 15.10.2012

Когда начнёте пробовать, увидите свою ошибку. Возможно, это подтолкнёт к мысли анализировать в коде не сам знак, а его числовой эквивалент.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

А мне тут нечего было делать и я написал вашу прогу чисто из принципа, проверил, допилил, отладил.

#define OUT 10
int spd = 50;
int freq = 875;
void setup(){
  Serial.begin(9600);
}
void loop(){
  coder("абв");
  //morze("...---...",9);
  delay(3000);
}
void coder(char* str){
  int len = 0;
  len = strlen(str);
  coder(str, len);
}
void coder(char* str,int len){
 byte table = 0;
 byte sym = 0;
 for(int i=0;i<len;i++){
  sym = (byte)str[i];
  switch(table){ //Преобразуем в заглавные буквы
    case 0xD0 :
    if(sym > 0xAF){
      sym -= 0x20;
    }
    table = 0;
    break;
    case 0xD1 :
    if(sym > 0x7F){
      sym += 0x20;
    }
    table = 0;
    break;
    case 0:
    if(sym > 0x60 && sym<0xD0){
      sym -= 0x20;
    }
  }
  //Serial.print("num = ");
  //Serial.print(i);
  //Serial.print("; code = ");
  //Serial.println(sym,HEX);
  switch(sym){
    case 0xD0: //Обработка кода таблицы
    case 0xD1:
    //Serial.println("table set");
    table = (byte)str[i];
    break;
    case '.':
    morze("......",6);
    break;
    case ',':
    morze(".-.-.-",6);
    break;
    case '/':
    morze("-..-.",5);
    break;
    case '?':
    morze("..--..",6);
    break;
    case '!':
    morze("--..--",6);
    break;
    case '@':
    morze(".--.-.",6);
    break;
    case '1':
    morze(".----",5);
    break;
    case '2':
    morze("..---",5);
    break;
    case '3':
    morze("...--",5);
    break;
    case '4':
    morze("....-",5);
    break;
    case '5':
    morze(".....",5);
    break;
    case '6':
    morze("-....",5);
    break;
    case '7':
    morze("--...",5);
    break;
    case '8':
    morze("---..",5);
    break;
    case '9':
    morze("----.",5);
    break;
    case '0':
    morze("-----",5);
    break;
    case 'A'://лат
    case 0x90://рус А
    morze(".-",2);
    break;
    case 'B'://лат
    case 0x91://рус Б
    morze("-...",4);
    break;
    case 'W'://лат
    case 0x92://рус В
    morze(".--",3);
    break;
    case 'G'://лат
    case 0x93://рус Г
    morze("--.",3);
    break;
    case 'D'://лат
    case 0x94://рус Д
    morze("-..",3);
    break;
    case 'E'://лат
    case 0x95://рус Е
    morze(".",1);
    break;
    case 'V'://лат
    case 0x96://рус Ж
    morze("...-",4);
    break;
    case 'Z'://лат
    case 0x97://рус З
    morze("--..",4);
    break;
    case 'I'://лат
    case 0x98://рус И
    morze("..",2);
    break;
    case 'J'://лат
    case 0x99://рус Й
    morze(".---",4);
    break;
    case 'K'://лат
    case 0x9A://рус К
    morze("-.-",3);
    break;
    case 'L'://лат
    case 0x9B://рус Л
    morze(".-..",4);
    break;
    case 'M'://лат
    case 0x9C://рус М
    morze("--",2);
    break;
    case 'N'://лат
    case 0x9D://рус Н
    morze("-.",2);
    break;
    case 'O'://лат
    case 0x9E://рус О
    morze("---",3);
    break;
    case 'P'://лат
    case 0x9F://рус П
    morze(".--.",4);
    break;
    case 'R'://лат
    case 0xA0://рус Р
    morze(".-.",3);
    break;
    case 'S'://лат
    case 0xA1://рус С
    morze("...",3);
    break;
    case 'T'://лат
    case 0xA2://рус Т
    morze("-",1);
    break;
    case 'U'://лат
    case 0xA3://рус У
    morze("..-",3);
    break;
    case 'F'://лат
    case 0xA4://рус Ф
    morze("..-.",4);
    break;
    case 'H'://лат
    case 0xA5://рус Х
    morze("....",4);
    break;
    case 'C'://лат
    case 0xA6://рус Ц
    morze("-.-.",4);
    break;
    case 0xA7://рус Ч
    morze("---.",4);
    break;
    case 0xA8://рус Ш
    morze("----",4);
    break;
    case 0xA9://рус Щ
    morze("--.-",4);
    break;
    case 0xAA://рус Ъ
    morze(".--.-.",5);
    break;
    case 'Y'://лат
    case 0xAB://рус Ы
    morze("-.--",4);
    break;
    case 'X'://лат
    case 0xAC://рус Ь
    morze("-..-",4);
    break;
    case 0xAD://рус Э
    morze("...-...",7);
    break;
    case 0xAE://рус Ю
    morze("..--",4);
    break;
    case 0xAF://рус Я
    morze(".-.-",4);
    break;    
  }  
 }  
}
void morze(char* str,int len){
 for(int i=0;i<len;i++){
  switch(str[i]){
   case '.':
   tone(OUT,freq, 2*spd);
   delay(6*spd);
   break;
   case '-':
   tone(OUT,freq, 6*spd);
   delay(10*spd);
   break; 
  }
 }
 delay(10*spd);
}

Теперь вам задача сделать из этого кода библиотеку, чтобы другие могли ей пользоваться.

 

sergeevalex
Offline
Зарегистрирован: 15.10.2012

через массивы, на мой взгляд, было бы красивее. Сопоставить аскиикоду символа набор символов морзе и при опросе первого измерения массива на соответствие знака введённой строки выводить из второго измерения массива необходимый набор символов.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Не вижу кода от вас, кроме стандартного эха компорта.

ua6cfo
ua6cfo аватар
Offline
Зарегистрирован: 13.10.2014

To NeiroN: Я восхищён ! Спасибо ! Попробую сделать из этого реальную библиотечку - надеюсь многим пригодится...

Вы использовали обычный динамик через конденсатор, подключенный на pin#10. А у меня пъезоизлучатель (который сам пищит если подать 5 вольт), вместо него потом будет стоять герконовая 5 вольтовая релюшка (надежно и бесшумно). Но и мой вариант (для манипуляции) и Ваш (для аудиоконтроля) совмещу...

 

Еще вопрос, если не утомил: терминал - то понятно, но через что (какую программу) можно посылать строки в СОМ порт, если не пользоваться средой Arduino ? HyperTerminal или еще через что-то - пойму и сделаю терминальную (которая для ПК) часть на Delphi...

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

putty

А еще в ней можно рисовать текстовой графикой что угодно(тут такая есть тема).

ua6cfo
ua6cfo аватар
Offline
Зарегистрирован: 13.10.2014

NeiroN пишет:

putty

А еще в ней можно рисовать текстовой графикой что угодно(тут такая есть тема).

Еще раз спасибо ! Честно говоря я так и думал, но сомневался. PUTTY у меня используется для работы через COM порт - управление разными устройствами и поэтому ее достаточно хорошо изучил...  :-)  Еще раз спасибо, буду делать систему управления (по своей задумке - многим моим коллегам будет полезна) и оформлю в виде библиотеки. Только, надеюсь, если не дотумкаю сам как превратить код в библиотеку, Вы подскажете...

sergeevalex
Offline
Зарегистрирован: 15.10.2012
NeiroN пишет:
Не вижу кода от вас, кроме стандартного эха компорта.
 
А нужен? ТС, как я вижу, вполне удовлетворён Вашим. Эхо порта исключительно для понимания в каком виде кириллица видится в ардуино.
ua6cfo пишет:
 
Еще вопрос, если не утомил: терминал - то понятно, но через что (какую программу) можно посылать строки в СОМ порт, если не пользоваться средой Arduino ? HyperTerminal или еще через что-то - пойму и сделаю терминальную (которая для ПК) часть на Delphi...
 
Сами напишите. Делов то. Вот, например, я для семисегментного индикатора написал в вижуал студио на C#.
toc
Offline
Зарегистрирован: 09.02.2013

Нейрон, где буква ё ?
остальные мелкие претензии к качеству кода оставлю при себе. ибо сам говнокожу по пятницам.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

для упрощения кода я ее не использую)) пусть кому надо сами допишут две строки с нужными кодами.

Вобщем мне опять было весело и я скачал програмку для андроида чтобы раскодировать морзянку через микрофон - решил затестить свою програмку. С задержками немного ошибся - коректировал по устойчивому распознованию программой на андроиде - звуковых кодов генерируемых ардуиной(жаль что программа только латинские буквы распознает). Привожу код который Морзянку генерит как надо.

#define OUT 10
int spd = 30;
int freq = 875;
void setup(){
  Serial.begin(9600);
}
void loop(){
  coder("SOS SOS TESTING MORZE CODE");
  //morze("...---...",9);
  delay(3000);
}
void coder(char* str){
  int len = 0;
  len = strlen(str);
  coder(str, len);
}
void coder(char* str,int len){
 byte table = 0;
 byte sym = 0;
 for(int i=0;i<len;i++){
  sym = (byte)str[i];
  switch(table){ //Преобразуем в заглавные буквы
    case 0xD0 :
    if(sym > 0xAF){
      sym -= 0x20;
    }
    table = 0;
    break;
    case 0xD1 :
    if(sym > 0x7F){
      sym += 0x20;
    }
    table = 0;
    break;
    case 0:
    if(sym > 0x60 && sym<0x7B){
      sym -= 0x20;
    }
  }
  //Serial.print("num = ");
  //Serial.print(i);
  //Serial.print("; code = ");
  //Serial.println(sym,HEX);
  switch(sym){
    case 0xD0: //Обработка кода таблицы
    case 0xD1:
    //Serial.println("table set");
    table = (byte)str[i];
    break;
    case ' ':
    morze("  ",2);
    break;
    case '.':
    morze("......",6);
    break;
    case ',':
    morze(".-.-.-",6);
    break;
    case '/':
    morze("-..-.",5);
    break;
    case '?':
    morze("..--..",6);
    break;
    case '!':
    morze("--..--",6);
    break;
    case '@':
    morze(".--.-.",6);
    break;
    case '1':
    morze(".----",5);
    break;
    case '2':
    morze("..---",5);
    break;
    case '3':
    morze("...--",5);
    break;
    case '4':
    morze("....-",5);
    break;
    case '5':
    morze(".....",5);
    break;
    case '6':
    morze("-....",5);
    break;
    case '7':
    morze("--...",5);
    break;
    case '8':
    morze("---..",5);
    break;
    case '9':
    morze("----.",5);
    break;
    case '0':
    morze("-----",5);
    break;
    case 'A'://лат
    case 0x90://рус А
    morze(".-",2);
    break;
    case 'B'://лат
    case 0x91://рус Б
    morze("-...",4);
    break;
    case 'W'://лат
    case 0x92://рус В
    morze(".--",3);
    break;
    case 'G'://лат
    case 0x93://рус Г
    morze("--.",3);
    break;
    case 'D'://лат
    case 0x94://рус Д
    morze("-..",3);
    break;
    case 'E'://лат
    case 0x95://рус Е
    case 0x81://рус Ё
    case 0xB1://рус ё
    morze(".",1);
    break;
    case 'V'://лат
    case 0x96://рус Ж
    morze("...-",4);
    break;
    case 'Z'://лат
    case 0x97://рус З
    morze("--..",4);
    break;
    case 'I'://лат
    case 0x98://рус И
    morze("..",2);
    break;
    case 'J'://лат
    case 0x99://рус Й
    morze(".---",4);
    break;
    case 'K'://лат
    case 0x9A://рус К
    morze("-.-",3);
    break;
    case 'L'://лат
    case 0x9B://рус Л
    morze(".-..",4);
    break;
    case 'M'://лат
    case 0x9C://рус М
    morze("--",2);
    break;
    case 'N'://лат
    case 0x9D://рус Н
    morze("-.",2);
    break;
    case 'O'://лат
    case 0x9E://рус О
    morze("---",3);
    break;
    case 'P'://лат
    case 0x9F://рус П
    morze(".--.",4);
    break;
    case 'R'://лат
    case 0xA0://рус Р
    morze(".-.",3);
    break;
    case 'S'://лат
    case 0xA1://рус С
    morze("...",3);
    break;
    case 'T'://лат
    case 0xA2://рус Т
    morze("-",1);
    break;
    case 'U'://лат
    case 0xA3://рус У
    morze("..-",3);
    break;
    case 'F'://лат
    case 0xA4://рус Ф
    morze("..-.",4);
    break;
    case 'H'://лат
    case 0xA5://рус Х
    morze("....",4);
    break;
    case 'C'://лат
    case 0xA6://рус Ц
    morze("-.-.",4);
    break;
    case 0xA7://рус Ч
    morze("---.",4);
    break;
    case 0xA8://рус Ш
    morze("----",4);
    break;
    case 0xA9://рус Щ
    morze("--.-",4);
    break;
    case 0xAA://рус Ъ
    morze(".--.-.",5);
    break;
    case 'Y'://лат
    case 0xAB://рус Ы
    morze("-.--",4);
    break;
    case 'X'://лат
    case 0xAC://рус Ь
    morze("-..-",4);
    break;
    case 0xAD://рус Э
    morze("...-...",7);
    break;
    case 0xAE://рус Ю
    morze("..--",4);
    break;
    case 0xAF://рус Я
    morze(".-.-",4);
    break;    
  }  
 }  
}
void morze(char* str,int len){
 for(int i=0;i<len;i++){
  switch(str[i]){
   case '.':
   tone(OUT,freq, 2*spd);
   delay(5*spd-5);
   break;
   case '-':
   tone(OUT,freq, 6*spd);
   delay(8*spd-5);
   break;
   case ' ':
   delay(4*spd);
   break;
  }
 }
 delay(4*spd);
}

На массивы переписывать не стал, потому что лень. Возможно кто-то захочет написать декодер морзе - задача чуть сложнее, но тоже вполне решаема через arduino.

art100
Offline
Зарегистрирован: 09.03.2014

я бьюсь в истерике под столом

обязательно над кодом поработаю

спасибо за положительные эмоции

ua6cfo
ua6cfo аватар
Offline
Зарегистрирован: 13.10.2014
#include <Array.h>
#define OUT 4 // PIN #4 - подключен динамик

int freq = 1100; // Частота (тон) звука
int p13 = 13; // PIN #13 - подключен светодиод и пьезоизлучатель
int dlit = 50; // Длительность точки (как "атомарная длинна")
int tire = 3; // dlit * tire == длительность тире

void setup() 
{  
 Serial.begin(9600); 
 pinMode(p13, OUTPUT);
 digitalWrite(p13, LOW);
}    

void loop() {
 if (Serial.available() > 0) {
   beep(Serial.read());
 } 
} // loop

void beep(int bukva) {
  if (bukva == 'A' || bukva == 'a' || bukva == 0xC0 || bukva == 0xE0){morze(".-",2);};   // AaAа
  if (bukva == 'B' || bukva == 'b' || bukva == 0xC1 || bukva == 0xE1){morze("-...",4);}; // BbБб
  if (bukva == 'C' || bukva == 'c' || bukva == 0xD6 || bukva == 0xF6){morze("-.-.",4);}; // CcЦц
  if (bukva == 'D' || bukva == 'd' || bukva == 0xC4 || bukva == 0xE4){morze("-..",3);};  // DdДд
  if (bukva == 'E' || bukva == 'e' || bukva == 0xC5 || bukva == 0xE5 || bukva == 0xA8 || bukva == 0xB8){morze(".",1);}; // EeЕеЁё
  if (bukva == 'F' || bukva == 'f' || bukva == 0xD4 || bukva == 0xF4){morze("..-.",4);}; // FfФф
  if (bukva == 'G' || bukva == 'g' || bukva == 0xC3 || bukva == 0xE3){morze("--.",3);};  // GgГг
  if (bukva == 'H' || bukva == 'h' || bukva == 0xD5 || bukva == 0xF5){morze("....",4);}; // HhХх
  if (bukva == 'I' || bukva == 'i' || bukva == 0xC8 || bukva == 0xE8){morze("..",2);};   // IiИи
  if (bukva == 'J' || bukva == 'j' || bukva == 0xC9 || bukva == 0xE9){morze(".---",4);}; // JjЙй
  if (bukva == 'K' || bukva == 'k' || bukva == 0xCA || bukva == 0xEA){morze("-.-",3);};  // KkКк
  if (bukva == 'L' || bukva == 'l' || bukva == 0xCB || bukva == 0xEB){morze(".-..",4);}; // LlЛл
  if (bukva == 'M' || bukva == 'm' || bukva == 0xCC || bukva == 0xEC){morze("--",2);};   // MmМм
  if (bukva == 'N' || bukva == 'n' || bukva == 0xCD || bukva == 0xED){morze("-.",2);};   // NnНн
  if (bukva == 'O' || bukva == 'o' || bukva == 0xCE || bukva == 0xEE){morze("---",3);};  // OoОо
  if (bukva == 'P' || bukva == 'p' || bukva == 0xCF || bukva == 0xEF){morze(".--.",4);}; // PpПп
  if (bukva == 'Q' || bukva == 'q' || bukva == 0xD9 || bukva == 0xF9){morze("--.-",2);}; // QqЩщ
  if (bukva == 'R' || bukva == 'r' || bukva == 0xD0 || bukva == 0xF0){morze(".-",2);};   // RrРр
  if (bukva == 'S' || bukva == 's' || bukva == 0xD1 || bukva == 0xF1){morze(".-.",3);};  // SsСс
  if (bukva == 'T' || bukva == 't' || bukva == 0xD2 || bukva == 0xF2){morze("-",1);};    // TtТт
  if (bukva == 'U' || bukva == 'u' || bukva == 0xD3 || bukva == 0xF3){morze("..-",3);};  // UuУу
  if (bukva == 'V' || bukva == 'v' || bukva == 0xC6 || bukva == 0xE6){morze("...-",4);}; // VvЖж
  if (bukva == 'W' || bukva == 'w' || bukva == 0xC2 || bukva == 0xE2){morze(".--",3);};  // WwВв
  if (bukva == 'X' || bukva == 'x' || bukva == 0xDC || bukva == 0xFC || bukva == 0xDA || bukva == 0xFA){morze("-..-",4);}; // XxЬьЪъ
  if (bukva == 'Y' || bukva == 'y' || bukva == 0xDB || bukva == 0xFB){morze("-.--",4);}; // YyЫы
  if (bukva == 'Z' || bukva == 'z' || bukva == 0xC7 || bukva == 0xE7){morze("--..",2);}; // ZzЗз
  if (bukva == 0xD7 || bukva == 0xF7){morze("---.",4);};  // Чч
  if (bukva == 0xD8 || bukva == 0xF8){morze("----",4);};  // Шш
  if (bukva == 0xDD || bukva == 0xFD){morze("..-..",5);}; // Ээ
  if (bukva == 0xDE || bukva == 0xFE){morze("..--",4);};  // Юю
  if (bukva == 0xDF || bukva == 0xFF){morze(".-.-",4);};  // Яя
  if (bukva == '1'){morze(".----",5);};
  if (bukva == '2'){morze("..---",5);};
  if (bukva == '3'){morze("...--",5);};
  if (bukva == '4'){morze("....-",5);};
  if (bukva == '5'){morze(".....",5);};
  if (bukva == '6'){morze("-....",5);};
  if (bukva == '7'){morze("--...",5);};
  if (bukva == '8'){morze("---..",5);};
  if (bukva == '9'){morze("----.",5);};
  if (bukva == '0'){morze("-----",5);};
  if (bukva == '?'){morze("..--..",6);};
  if (bukva == 0x2F || bukva == 0x5C ){morze("-..-.",5);}; // /\
  if (bukva == '|'){morze("-...-",5);};
  if (bukva == '!'){morze("--..--",6);};
  if (bukva == ','){morze(".-.-.-",6);};
  if (bukva == '.'){morze("......",6);};
//  if (bukva == '@'){morze("......",6);};
//  if (bukva == '#'){ch_mode()};
//  if (bukva == '&'){ch_mode()};
};

void morze(char* str, int len){
 for(int i=0; i<len; i++){
  switch(str[i]){
   case '.':
     digitalWrite(p13, HIGH);
     tone(OUT, freq); 
     delay(dlit);
     digitalWrite(p13, LOW);
     noTone(OUT);
     delay(dlit);
     break;
   case '-':
     digitalWrite(p13, HIGH);
     tone(OUT, freq);
     delay(dlit * tire);
     digitalWrite(p13, LOW);
     noTone(OUT);
     delay(dlit); 
     break;
  }
 }
 digitalWrite(p13, LOW);
 delay(dlit * tire * 2); // Пауза в 2 тире
}

Делается в расчете на хорошую читаемость кода. Все работает хорошо, как изначально было задумано...

Хочу спросить, как лучше сделать изменение скорости ? Вариант с переменным резистором или вариант через макрокоманду (типа: #60 - "установить скорость 60 знаков в минуту") ?

Имеет ли смысл использовать маленькую внутренюю память для хранения предопределенных макросов (допустим до 10 шт.), которые будут вызываться макрокомандой с терминала &1 (к примеру: по команде &1 будет выдано -  "CQ CQ DE UA6CFO PSE K" - "всем, всем, приглашает UA6CFO, пожалуйста передавайте") ? Или лучше заранее прописывать текст макроса как строку в скетч ?