Для обоих скетчей одна схема
светодиод - пин 10
пищалка - пин 12
кнопка - пин 8
фоторезистор - пин A0
// *************************************************************************
//
// ВВОД СИМВОЛОВ АЗБУКИ МОРЗЕ НАЖАТИЕМ КНОПКИ
// ИЛИ ПЕРЕКРЫВАНИЕМ ПОПАДАНИЯ СВЕТА НА ФОТОРЕЗИСТОР.
//
// Добавляем ввод символов через кнопку. Чтобы работать кнопкой а не через фоторезистор
// нужно #define WORK_ON FOTORESISTOR заменить на #define WORK_ON BUTTON
//
// Рабочий вариант с разделением на буквы и слова
//
//
#define FOTORESISTOR 1
#define BUTTON 2
// #define WORK_ON FOTORESISTOR
#define WORK_ON BUTTON
#define ST_BEGIN 1
#define ST_SIGNAL_ON 2
#define ST_SIGNAL_OFF 3
#define ST_WAIT_SIGNAL_ON 4
#define ST_WAIT_COMMAND 5
const uint16_t minVolume = 300; //-- Определяем константу с уровнем входного сигнала отделяющую длительность точек и тире
//-- (принимаются только те сигналы, громкость которых выше указанного уровня)
const uint16_t min_point_long = 10; //-- длительность сигнала меньше которого не воспринимается точка
uint16_t point_long = 300; //-- длительность точки
uint16_t next_letter_long = point_long * 3; //-- пауза между буквами
uint16_t word_long = point_long * 7; //-- пауза между словами
uint16_t command_long = point_long * 20; //-- пауза после которой преходит в режим ввода команд
uint32_t tm_sig_start;
uint32_t tm_sig_stop;
uint32_t tm_pause_start;
uint32_t tm_pause_stop;
uint32_t signal_long; //-- длительность сигнала
uint8_t varLetter; // Объявляем переменную для хранения принятых точек и тире одного символа (бит 0 - точка, бит 1 - тире)
uint8_t lenLetter; // Объявляем переменную для хранения количества точек и тире в принятом символе
//bool flgSignal; // Объявляем флаг указывающий на то что была принята хотя бы одна точка или тире
//bool flgLetter; // Объявляем флаг указывающий на то что был принят символ
//char* RUS(char*); // Объявляем функцию перевода русских символов из кодировки UTF-8 в кодировку CP866
char chrMorze[] = {'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', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.', ';', ',', ':', '?', '!', '-', ' ', '\n', '\r'};
uint8_t lenMorze[] = { 2, 4, 4, 3, 1, 4, 3, 4, 2, 4, 3, 4, 2, 2, 3, 4, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5};
uint8_t varMorze[] = {0x1, 0x8, 0xA, 0x4, 0x0, 0x2, 0x6, 0x0, 0x0, 0x7, 0x5, 0x4, 0x3, 0x2, 0x7, 0x6, 0xD, 0x2, 0x0, 0x1, 0x1, 0x1, 0x3, 0x9, 0xB, 0xC, 0xF, 0x7, 0x3, 0x1, 0x0, 0x10, 0x18, 0x1C, 0x1E, 0x1F, 0x0, 0x2A, 0x15, 0x38, 0x0C, 0x33, 0x21, 0x11, 0x15, 0x0A};
int state;
String command;
boolean flg_LF = false;
boolean flg_coma = false;
int incomingByte = 0; // переменная для хранения полученного байта
int v1;
int v2;
int zum_on = 0;
int pin_LED = 10; //-- пин светодиода (+)
int pin_ZUM = 12; //-- пин пищалки
int pin_RES = A0; //-- пин фоторезистора )
int pin_KEY = 8; //-- пин кнопки
bool is_active = 0;
void setup(){
Serial.begin(9600);
Serial.println("--> setup()");
v1 = 0; //-- сначала запишем в переменную v1 значение 0
v2 = 10; //-- сначала запишем в переменную v2 значение 10
pinMode(pin_LED,OUTPUT);
pinMode(pin_ZUM,OUTPUT);
varLetter=lenLetter=0;
state = ST_BEGIN;
Serial.print(">");
}
void loop(){
switch (state) {
Serial.println(state);
case ST_BEGIN:
analogWrite(pin_LED, 0); //-- подадим на светодиод сигнал уровня v2
tone(pin_ZUM, -1); //-- подадим на светодиод сигнал уровня v2
#if WORK_ON==FOTORESISTOR
while(analogRead(pin_RES) < minVolume){delay(10);}
#elif WORK_ON==BUTTON
while(digitalRead(pin_KEY) == 0) {delay(10);}
#endif
state = ST_SIGNAL_ON;
break;
case ST_SIGNAL_ON:
tm_sig_start = millis();
analogWrite(pin_LED, 255); //-- подадим на светодиод сигнал уровня v2
tone(pin_ZUM, 1000); //-- подадим на светодиод сигнал уровня v2
#if WORK_ON==FOTORESISTOR
while(analogRead(pin_RES) > minVolume){delay(10);}
#elif WORK_ON==BUTTON
while(digitalRead(pin_KEY) == 1) {delay(10);}
#endif
state = ST_SIGNAL_OFF;
break;
case ST_SIGNAL_OFF:
tm_sig_stop = millis();
analogWrite(pin_LED, 0); //-- подадим на светодиод сигнал уровня v2
tone(pin_ZUM, -1); //-- подадим на светодиод сигнал уровня v2
signal_long = tm_sig_stop - tm_sig_start;
//Serial.print(signal_long);
if(signal_long > point_long) {
Serial.print("-");
varLetter<<=1; varLetter|=1;
lenLetter++;
} else if(signal_long > min_point_long) {
Serial.print("*");
lenLetter++;
varLetter<<=1; varLetter|=0;
}
state = ST_WAIT_SIGNAL_ON;
break;
case ST_WAIT_SIGNAL_ON:
flg_coma = false;
flg_LF = false;
#if WORK_ON==FOTORESISTOR
while(analogRead(pin_RES) < minVolume){
#elif WORK_ON==BUTTON
while(digitalRead(pin_KEY) == 0) {
#endif
if(!flg_coma && (millis() - tm_sig_stop > next_letter_long)) {
//Serial.print(","); //-- конец буквы
flg_coma = true;
// Если принят символ: //
bool flg_found = false;
for(uint8_t i=0; i<46; i++){ // Проходим по всем 46 символам массивов
if(varLetter==varMorze[i] && lenLetter==lenMorze[i]){ // Если комбинация точек и тире в varLetter совпала с varMorze[i] и количество точек и тире совпало с lenMorze[i], то...
//-- символ найден
flg_found = true;
if(i==44||i==45){ Serial.println();} // Если найденный символ является символом начала '\n' или конца '\r' строки, то прокручиваем ленту на две строки
else { Serial.print(chrMorze[i]);} // Если найденный символ не является символом начала '\n' или конца '\r' строки, то просто его выводим на экран (позиция символа на экране смещается автоматически)
}
}
if(!flg_found) {
Serial.print("<?>");
}
varLetter=lenLetter=0; // Сбрасываем флаги и переменные относящиеся к принятому символу, так как мы его уже вывели
}
if(!flg_LF && (millis() - tm_sig_stop > word_long)) {
Serial.println(""); Serial.print(">"); //-- конец слова
flg_LF = true;
}
if(flg_LF && (millis() - tm_sig_stop > command_long)) {
Serial.println(""); Serial.println("I am waiting yours command."); //-- конец слова
Serial.println(" 1 - начать передачу");
Serial.println(" 2 - уменьшить скорость передачи");
Serial.println(" 3 - увеличить скорость передачи");
while (Serial.available() == 0) {
delay(10);
}
state = ST_WAIT_COMMAND;
break;
}
delay(10);
}
if(state != ST_WAIT_COMMAND){
state = ST_SIGNAL_ON;
}
break;
case ST_WAIT_COMMAND:
while (Serial.available() > 0) {
// read the incoming:
command = Serial.readString();
// say what you got:
Serial.print("command: "); Serial.println(command);
if(command.charAt(0) == '1') {
tm_sig_stop = millis();
Serial.print(">");
state = ST_BEGIN;
break;
}
if(command.charAt(0) == '2') {
point_long += 50; //-- длительность точки
next_letter_long = point_long * 3; //-- пауза между буквами
word_long = point_long * 7; //-- пауза между словами
Serial.print(" point_long = "); Serial.println(point_long);
} else if(command.charAt(0) == '3') {
point_long -= 50; //-- длительность точки
next_letter_long = point_long * 3; //-- пауза между буквами
word_long = point_long * 7; //-- пауза между словами
Serial.print(" point_long = "); Serial.println(point_long);
} else {
}
//-- продолжаем принимать команды
state = ST_WAIT_COMMAND;
Serial.println(""); Serial.println("I am waiting yours command."); //-- конец слова
Serial.println(" 1 - начать передачу");
Serial.println(" 2 - уменьшить скорость передачи");
Serial.println(" 3 - увеличить скорость передачи");
break;
} //-- цикл чтения команд
break;
}
}
// *************************************************************************
//
// ПЕРЕДАЧА АЗБУКОЙ МОРЗЕ ВВЕДЕННЫХ С КЛАВИАТУРЫ СИМВОЛОВ.
//
// Чтение сообщения по сериальному порту и отправка его азбукой Морзе
// на светодиод и зуммер
//
//
const uint16_t point_long = 100;
char chrMorze[] = {'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', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.', ';', ',', ':', '?', '!', '-', ' ', '\n', '\r'};
uint8_t lenMorze[] = { 2, 4, 4, 3, 1, 4, 3, 4, 2, 4, 3, 4, 2, 2, 3, 4, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5};
uint8_t varMorze[] = {0x1, 0x8, 0xA, 0x4, 0x0, 0x2, 0x6, 0x0, 0x0, 0x7, 0x5, 0x4, 0x3, 0x2, 0x7, 0x6, 0xD, 0x2, 0x0, 0x1, 0x1, 0x1, 0x3, 0x9, 0xB, 0xC, 0xF, 0x7, 0x3, 0x1, 0x0, 0x10, 0x18, 0x1C, 0x1E, 0x1F, 0x0, 0x2A, 0x15, 0x38, 0x0C, 0x33, 0x21, 0x11, 0x15, 0x0A};
uint8_t varLetter; // Объявляем переменную для хранения принятых точек и тире одного символа (бит 0 - точка, бит 1 - тире)
int signal_long;
String incoming = "";
int pin_LED = 10; //-- пин светодиода (+)
int pin_ZUM = 12; //-- пин пищалки
void setup(){
Serial.begin(9600);
Serial.println("--> Hello! Print somting to me.");
pinMode(pin_LED,OUTPUT);
pinMode(pin_ZUM,OUTPUT);
}
void loop(){
if (Serial.available() > 0) {
//-- читаем входную строку
incoming = Serial.readString();
//-- печатаем фразу
Serial.println(""); Serial.println(incoming);
//-- по каждому символу в фразе делаем поиск в таблице и передаем точками и тире
for(int i=0; i<incoming.length(); i++) {
incoming.toUpperCase();
//-- ищем букву в массиве всего у нас 49 символов
for(int j=0; j<49; j++) {
//-- Serial.println(chrMorze[j]); //-- вывод символа
if( chrMorze[j] == incoming.charAt(i) ) {
//-- распознали знак
String s = String(incoming.charAt(i));
Serial.print(s); //Serial.print("found "); Serial.print(varMorze[j]); Serial.print(" "); Serial.print(lenMorze[j]);
//-- если знак пробел, то делаем паузу между словами
if(incoming.charAt(i) == ' ') {
Serial.print(" ");
delay(point_long * 7); //-- пауза это разделитель между словами длительность 7 точек
} else {
varLetter = varMorze[j];
//-- передаем букву(символ)
varLetter = varMorze[j];
for(int k=lenMorze[j]-1; k>=0; k--) {
uint8_t v = varLetter >> k;
// Serial.print("k"); Serial.print(k); Serial.print("v"); Serial.print(v); Serial.println(v & 1);
if( (v & 1) == 0) { //-- точка
signal_long = point_long;
Serial.print("*");
} else { //-- тире
signal_long = point_long * 3;
Serial.print("-");
}
analogWrite(pin_LED, 255); //-- включаем сигнал
tone(pin_ZUM, 1000);
delay(signal_long); //-- сигнал будет длительностью signal_long
analogWrite(pin_LED, 0); //-- выключаем сигнал
tone(pin_ZUM, -1);
delay(point_long); //-- задержка между точками и тире одна точка
Serial.print("");
}
delay(point_long * 3); //-- задержка между буквами 3 точки
Serial.print(" ");
}
} else {
//-- не распознали знак (но пока не обрабатываем эту ситуацию)
}
}
}
Serial.println("");
}
}
Полный скетч урока по работе с азбукой Морзе на Arduino
end
Комментариев нет:
Отправить комментарий