Морзе клавиатура
- Войдите на сайт для отправки комментариев
Ср, 18/01/2017 - 08:46
привет, пытаюсь сделать морзе клавиатуру на основе ps2 клавиатуры, возникла сложность с синхронизацией полученных символов с клавиатуры и кодом воспроизводящим морзе.
#include <PS2Keyboard.h> const int DataPin = 2; // подключение к разъему клавиатуры DATA const int IRQpin = 3; // подключение к разъему клавиатуры CLK // Таблица кодов Морзе. N-ный элемент кода соответствует n-ному символу раскладки. char* morseCode[] = { "*-","-***","*--","--*","-**","*","***-","--**","**","*---", "-*-","*-**","--","-*","---","*--*","*-*","***","-","**-", "**-*","****","-*-*","---*","----","--*-","-*--","-**-","**-**","**--", "*-*-", "*----","**---","***--","****-","*****","-****","--***","---**","----*","-----", "......","*-*-*-","---***","-*-*-","-*--*-","*----*","*-**-*","-****-","-**-*","**--**","--**--", "-***-","********","*--*-*","**-*-", "" }; // Кириллическая раскладка. char* layoutCyrillic[] = { "а","б","в","г","д","е","ж","з","и","й", "к","л","м","н","о","п","р","с","т","у", "ф","х","ц","ч","ш","щ","ы","ь","э","ю", "я", "1","2","3","4","5","6","7","8","9","0", ".",",",":",";","(","\'","\"","-","/","?","!", " *DELIMITER* "," *ERR* ","@"," *END* ", "" }; // Латинская раскладка. char* layoutLatin[] = { "a","b","w","g","d","e","v","z","i","j", "k","l","m","n","o","p","r","s","t","u", "f","h","c","ö","ch","q","y","x","é","ü", "ä", "1","2","3","4","5","6","7","8","9","0", ".",",",":",";","(","\'","\"","-","/","?","!", " *DELIMITER* "," *ERR* ","@"," *END* ", "" }; PS2Keyboard keyboard; void morse(char* str, int pin, int led) { pinMode(pin, OUTPUT); pinMode(led, OUTPUT); int n = 0; while(str[n] != '\0') n++; int* morseMas = new int [n]; for(int i = 0; str[i] != '\0'; i++) { for(int j = 0; layoutCyrillic[j] != ""; j++) { for(int k = 0; layoutCyrillic[j][k] != '\0'; k++) { if(str[i+k] != layoutCyrillic[j][k]) break; if(layoutCyrillic[j][k+1] == '\0') morseMas[i] = j; } for(int k = 0; layoutLatin[j][k] != '\0'; k++) { if(str[i+k] != layoutLatin[j][k]) break; if(layoutLatin[j][k+1] == '\0') morseMas[i] = j; } } } Serial.print("Morse code: "); for(int i = 0; i < n; i++) { for(int j = 0; morseCode[morseMas[i]][j] != '\0'; j++) { if(morseCode[morseMas[i]][j] == '*') { Serial.print("*"); if(led) digitalWrite(led, HIGH); tone(pin, 1500); delay(100); noTone(pin); digitalWrite(led, LOW); } if(morseCode[morseMas[i]][j] == '-') { Serial.print("-"); if(led) digitalWrite(led, HIGH); tone(pin, 1500); delay(300); noTone(pin); digitalWrite(led, LOW); } delay(100); } Serial.print(" "); delay(200); } Serial.print("\n"); delete [] morseMas; } void setup() { keyboard.begin(DataPin, IRQpin); // инициализация клавиатуры Serial.begin(9600); // настройка скорости COM порта Serial.println("Keyboard Test:"); // вывод данных с клавиатуры в COM порт } void loop() { if (keyboard.available()) { char* c = keyboard.read(); //сложность пока здесь( morse('sos', 8, 13); } }
привет, пытаюсь сделать морзе клавиатуру на основе ps2 клавиатуры, возникла сложность с синхронизацией полученных символов с клавиатуры и кодом воспроизводящим морзе.
И что? У Вас есть вопрос? Или Вы просто поставили всех в известность?
Судя по коду, сложностей у Вас выще головы.
Например, что делает константа 'sos' в строке 126. Что он, по-вашему, означает?
Строки 56-78 ... Вы уверены, что для того, чтобы райти символ, необходим цикл тройной вложенности?
Про массивы layoutХХХ я уж и не говорю. Зачем хранить одиночные символы как строки?
Например, что делает константа 'sos' в строке 126. Что он, по-вашему, означает?
это строка для передачи в функцию morse, должна быть в двойных кавычках)
Строки 56-78 ... Вы уверены, что для того, чтобы райти символ, необходим цикл тройной вложенности?
в этом я не особо уверен, так было предложенно в примере, я так и не смог полностью разобраться.
у меня вопрос как конвентировать массив полученный с клавиатуры в str в функцию morse.
Ну, это совсем не так делать надо.
Выпишите все символы, идущие подряд у Вас получится несколько последовательностей. Одна - 'а'-'я', вторая - 'a'-'z', третья '0'-'9'
Всякие запятые с точками, выпишите сами.
Вам нужны последовательности символов, которые идут подряд. Таких у Вас получится штуки 4.
Потом просто сделаете столько же масивов символов морзе и в качестве индекса в них будете использовать введённый с клавиш код.
Если сразу непонятно, я Вам помогу, пока выпишите все последовательности.
Нашел работающую библиотеку воспроизводящую морзе, и опять не могу подружить символы введеные с клавиатуры с функцией morse.sendmsg(" ");
А Вы пробовали так, как я Вам говорил?
А Вы пробовали так, как я Вам говорил?
я запретил.
А Вы пробовали так, как я Вам говорил?
Пробывал, но с использованием библиотеки предположил что будет проще.
https://www.dropbox.com/s/nq2m24xehwd8m82/morse.zip?dl=0 - Библиотека Morse.h
Пробывал, но с использованием библиотеки предположил что будет проще.
И как предположение? Оправдалось?
Пока нет(((
Ну, тогда делайте по-человечески. Я сказал, что помогу, но мезаническую-то работы по составлению массивов Вы можете сами сделать, не нм же её делать за Вас.
В библиотеке следующие коды, а у Вас?
Здравствуйте, а не могли бы вы полностью скетч сбросить на почту, если не сложно?
Andrey.semenow94@yandex.ru
Было дело. Индикация, рус/лат, скорость, громкость, регулировка длительностей - всё с клавиатуры. Запись, воспроизведение по Fn клавишам... Песня для тех кто понимает.)
Может быть у вас остался данный проект? Не могли бы поделиться своими трудами?
Запросто. Ищите в исполнителях.
Отписал на почту.