В функцию не передаются русские буквы.
- Войдите на сайт для отправки комментариев
Чт, 16/10/2014 - 22:12
Вот код:
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('й');
...то ничего не происходит - пищалка морзянку не пищит, мыргалка не мыргает...
Почему ?
а Вы ее напрямую в теле программы передаете или через терминал?
тип char принимает значения до 127. Кириллица - от 192 (А) до 255 (я).
попробуйте unsigned char
ua6cfo,
1. добавьте в начало метода beep вывод значения параметра в терминал.
2. посмотрите и запишите что он выводит
a. для разных латинских букв
b.для кирилических букв
3. опубликуйте тут результаты
Вы не учли что расские буквы представленны в юникоде а это значит что нужно сравнивать по 2 байта или хотябы каждый 2 байт.
И сравнение лучше всего вывести в
switch(i){ case:1 //i = 1 break; case:2 //i=2 break; }там организовать промежуточную функцию morze(char * str, uint8_t len){} где будет перебираться строка
и обращяться к ней так morze('.-',2);
Для:
beep('A'); beep('l'); beep('e'); beep('x'); beep('e'); beep('y');
------
Если использовать:
void beep(word bukva) {
Я же сказал что нужно переработать весь принцип программы. Сделать обработчик "Целой" строки а не отдельных букв. Сделать преобразование в заглавные буквы целевой строки как для юникода(руссике буквы) так и для латыницы. Если в латынице они все последовательны, то с юникодом сложнее там часть строчных русских букв в другой таблице: "абв..." таблица D0, а "рст..." таблица D1. Микроконтроллер 8-битный поэтому ему проще оперировать переменными размером 1 байт.
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.
Получается, что задача в таком виде не решабельна. :-(
В коде Морзе существуют такие буквы как: ч,ш,э,ю,я, которые не имеют аналогов в коде морзе с остальными буквами.
Если написать на компьютере программу, которая делает то, что Вы, NeiroN, предлагаете - так Aduino тут вообще не нужен. Достаточно к COM порту присобачить релюшку или оптрон и вперед... Таких программ для ПК сейчас сколько хочешь...
To sergeevalex: Спасибо ! Попробую...
Когда начнёте пробовать, увидите свою ошибку. Возможно, это подтолкнёт к мысли анализировать в коде не сам знак, а его числовой эквивалент.
А мне тут нечего было делать и я написал вашу прогу чисто из принципа, проверил, допилил, отладил.
#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); }Теперь вам задача сделать из этого кода библиотеку, чтобы другие могли ей пользоваться.
через массивы, на мой взгляд, было бы красивее. Сопоставить аскиикоду символа набор символов морзе и при опросе первого измерения массива на соответствие знака введённой строки выводить из второго измерения массива необходимый набор символов.
Не вижу кода от вас, кроме стандартного эха компорта.
To NeiroN: Я восхищён ! Спасибо ! Попробую сделать из этого реальную библиотечку - надеюсь многим пригодится...
Вы использовали обычный динамик через конденсатор, подключенный на pin#10. А у меня пъезоизлучатель (который сам пищит если подать 5 вольт), вместо него потом будет стоять герконовая 5 вольтовая релюшка (надежно и бесшумно). Но и мой вариант (для манипуляции) и Ваш (для аудиоконтроля) совмещу...
Еще вопрос, если не утомил: терминал - то понятно, но через что (какую программу) можно посылать строки в СОМ порт, если не пользоваться средой Arduino ? HyperTerminal или еще через что-то - пойму и сделаю терминальную (которая для ПК) часть на Delphi...
putty
А еще в ней можно рисовать текстовой графикой что угодно(тут такая есть тема).
putty
А еще в ней можно рисовать текстовой графикой что угодно(тут такая есть тема).
Еще раз спасибо ! Честно говоря я так и думал, но сомневался. PUTTY у меня используется для работы через COM порт - управление разными устройствами и поэтому ее достаточно хорошо изучил... :-) Еще раз спасибо, буду делать систему управления (по своей задумке - многим моим коллегам будет полезна) и оформлю в виде библиотеки. Только, надеюсь, если не дотумкаю сам как превратить код в библиотеку, Вы подскажете...
Нейрон, где буква ё ?
остальные мелкие претензии к качеству кода оставлю при себе. ибо сам говнокожу по пятницам.
для упрощения кода я ее не использую)) пусть кому надо сами допишут две строки с нужными кодами.
Вобщем мне опять было весело и я скачал програмку для андроида чтобы раскодировать морзянку через микрофон - решил затестить свою програмку. С задержками немного ошибся - коректировал по устойчивому распознованию программой на андроиде - звуковых кодов генерируемых ардуиной(жаль что программа только латинские буквы распознает). Привожу код который Морзянку генерит как надо.
#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.
я бьюсь в истерике под столом
обязательно над кодом поработаю
спасибо за положительные эмоции
#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, пожалуйста передавайте") ? Или лучше заранее прописывать текст макроса как строку в скетч ?