2-сабақ
Осы аптада біз Arduino Uno-да Морзе код генераторын жасаймыз
Практикалық бөлім
Arduino Uno тақтасына негізделген Морзе код генераторының схемасы келесі суретте көрсетілген.

Көріп отырғаныңыздай, схема өте қарапайым. Дыбыстық сигналдың оң түйреуішін Arduino Uno тақтасының 8 түйреуішіне, ал оның теріс түйреуішін Arduino Uno тақтасының жеріне жалғаңыз. Бағдарлама кодын Arduino тақтасына жүктеңіз және сериялық байланыс мониторы терезесінде таңбаларды басып шығаруды бастауға болады – дыбыстық сигнал берілген таңбаларға сәйкес келетін Морзе кодының сигналдарын шығара бастайды. Сондай-ақ, схеманы 16X2 СКД дисплейін қосу арқылы жақсартуға болады.
Arduino үшін бағдарлама түсіндірілді
Бағдарламаның толық коды мақаланың соңында келтірілген, мұнда біз оның негізгі бөліктерін қысқаша қарастырамыз.
Алдымен бағдарламада біз болашақта Морзе кодына түрлендіретін таңбаларды жазатын айнымалыны жариялаймыз.
char stringToMorseCode[] = "";
Содан кейін біз дыбыстық сигнал қосылған 8 түйреуішті жариялаймыз және дыбыстық сигнал үшін қолданылатын тон түрін анықтаймыз.
int audio8 = 8; // output audio on pin 8 int note = 1200; // music note/pitch int dotLen = 100; // length of the morse code 'dot' int dashLen = dotLen * 3; // length of the morse code 'dash'
Содан кейін void loop () функциясында, егер кез-келген деректер сериялық портқа түссе, біз оны indata символдық массивінде сақтаймыз. Біз бұл массивке inData[index1] пәрменін пайдаланып таңбаларды кезекпен (бір-бірден) жазамыз. Осыдан кейін variable командасы.toUppercase () кіші әріптерді тиісті бас әріптерге өзгерту үшін қолданылады (яғни кіші әріптерден бас әріптер жасалады). Содан кейін біз осы таңбалардың әрқайсысына сәйкес келетін дыбыстарды қалыптастырамыз.
void loop()
{
char inChar = 0;
char inData[100] = ""; // data length of 6 characters
String variable = "";
String variable1 = "";
int index1 = 0;
if ( Serial.available() > 0 ) {
while (Serial.available() > 0 && index1 < 100)
{
delay(100);
inChar = Serial.read();
inData[index1] = inChar;
index1++;
inData[index1] = '';
}
variable.toUpperCase();
for (byte i = 0 ; i < 100 ; i++) {
variable.concat(String(inData[i]));
}
delay(20);
Әрі қарай morsedot және MorseDash функциялары сәйкесінше дыбысты нүктені және сызықшаны қалыптастыру үшін қолданылады
void MorseDot()
{
tone(audio8, note, dotLen); // start playing a tone
delay(dotLen); // hold in this position
}
void MorseDash()
{
tone(audio8, note, dashLen); // start playing a tone
delay(dashLen); // hold in this position
}
Содан кейін GetChar функциясы алфавиттің барлық таңбаларына сәйкес кодты қалыптастыру үшін қолданылады – егер сіз бұл бағдарламаны орыс алфавитіне Морзе кодын жасау үшін қайта жасағыңыз келсе, оны өзгертуіңіз керек. Нәтижесінде
әрбір таңба оның Морзе кодына сәйкес келетін дыбыстар тізбегімен көрсетіледі.
void GetChar(char tmpChar)
{
switch (tmpChar) {
case 'a':
MorseDot();
delay(100);
MorseDash();
delay(100);
break;
…
…
…
default:
break;
}
}
Содан кейін GetChar функциясы әліпбидің барлық таңбаларына сәйкес кодты генерациялау үшін пайдаланылады — егер сіз осы бағдарламаны орыс алфавитінде Морзе кодын жасау үшін қайта жасағыңыз келсе, оны өзгертуіңіз керек. Нәтижесінде
әрбір таңба оның Морзе кодына сәйкес келетін дыбыстар тізбегі арқылы беріледі.

Бағдарламаның (эскиздің)бастапқы коды
char stringToMorseCode[] = "";
int audio8 = 8; // к контакту 8 подключен зуммер
int note = 1200; // music note/pitch (используемый тон)
int dotLen = 100; // length of the morse code 'dot' (длительность звучания точки)
int dashLen = dotLen * 3; // length of the morse code 'dash' (длительность звучания тире)
void setup() {
Serial.begin(9600);
}
void loop()
{
char inChar = 0;
char inData[100] = ""; // data length of 6 characters
String variable = "";
String variable1 = "";
int index1 = 0;
if ( Serial.available() > 0 ) { // если в последовательном порту есть принятые данные
while (Serial.available() > 0 && index1 < 100) // read till 6th character
{
delay(100);
inChar = Serial.read(); // начинаем их последовательно считывать и сохранять в символьный массив (по одному символу)
inData[index1] = inChar;
index1++;
inData[index1] = ''; // добавляем 0 в конец
}
variable.toUpperCase(); // преобразуем нижний регистр в верхний
for (byte i = 0 ; i < 100 ; i++) {
variable.concat(String(inData[i])); // объединяем строки
}
delay(20);
}
String stringToMorseCode = String(variable);
for (int i = 0; i < sizeof(stringToMorseCode) - 1; i++)
{
char tmpChar = stringToMorseCode[i];
tmpChar = toLowerCase(tmpChar);
GetChar(tmpChar);
}
}
void MorseDot()
{
tone(audio8, note, dotLen); // start playing a tone
delay(dotLen); // hold in this position
}
void MorseDash()
{
tone(audio8, note, dashLen); // start playing a tone
delay(dashLen); // hold in this position
}
void GetChar(char tmpChar)
{
switch (tmpChar) {
case 'a':
MorseDot();
delay(100);
MorseDash();
delay(100);
break;
case 'b':
MorseDash();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
break;
case 'c':
MorseDash();
delay(100);
MorseDot();
delay(100);
MorseDash();
delay(100);
MorseDot();
delay(100);
break;
case 'd':
MorseDash();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
break;
case 'e':
MorseDot();
delay(100);
break;
case 'f':
MorseDot();
delay(100);
MorseDot();
delay(100);
MorseDash();
delay(100);
MorseDot();
delay(100);
break;
case 'g':
MorseDash();
delay(100);
MorseDash();
delay(100);
MorseDot();
delay(100);
break;
case 'h':
MorseDot();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
break;
case 'i':
MorseDot();
delay(100);
MorseDot();
delay(100);
break;
case 'j':
MorseDot();
delay(100);
MorseDash();
delay(100);
MorseDash();
delay(100);
MorseDash();
delay(100);
break;
case 'k':
MorseDash();
delay(100);
MorseDot();
delay(100);
MorseDash();
delay(100);
break;
case 'l':
MorseDot();
delay(100);
MorseDash();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
break;
case 'm':
MorseDash();
delay(100);
MorseDash();
delay(100);
break;
case 'n':
MorseDash();
delay(100);
MorseDot();
delay(100);
break;
case 'o':
MorseDash();
delay(100);
MorseDash();
delay(100);
MorseDash();
delay(100);
break;
case 'p':
MorseDot();
delay(100);
MorseDash();
delay(100);
MorseDash();
delay(100);
MorseDot();
delay(100);
break;
case 'q':
MorseDash();
delay(100);
MorseDash();
delay(100);
MorseDot();
delay(100);
MorseDash();
delay(100);
break;
case 'r':
MorseDot();
delay(100);
MorseDash();
delay(100);
MorseDot();
delay(100);
break;
case 's':
MorseDot();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
break;
case 't':
MorseDash();
delay(100);
break;
case 'u':
MorseDot();
delay(100);
MorseDot();
delay(100);
MorseDash();
delay(100);
break;
case 'v':
MorseDot();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
MorseDash();
delay(100);
break;
case 'w':
MorseDot();
delay(100);
MorseDash();
delay(100);
MorseDash();
delay(100);
break;
case 'x':
MorseDash();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
MorseDash();
delay(100);
break;
case 'y':
MorseDash();
delay(100);
MorseDot();
delay(100);
MorseDash();
delay(100);
MorseDash();
delay(100);
break;
case 'z':
MorseDash();
delay(100);
MorseDash();
delay(100);
MorseDot();
delay(100);
MorseDot();
delay(100);
break;
default:
break;
}
}
