3.3. Сектч
Morze.ino
#include <Adafruit_NeoPixel.h> //Библиотека для работы с адресной светодиодной лентой
#define BUZZ 12 //Константа, хранящая номер порта, к которому подключен пьезоизлучатель
#define DASH 210 //Константа, хранящая длительность сигнала "тире"
#define LED 10 //Константа, хранящая номер порта, к которому подключена светодиодная лента
#define COUNTPIX 6 ////Константа, хранящая количество светодиодов в ленте
//Создание объекта strip класса Adafruit_NeoPixel
Adafruit_NeoPixel strip = Adafruit_NeoPixel(COUNTPIX, LED, NEO_GRB+NEO_KHZ800);
/*В азбуке Морзе действуют определённые правила,
регламентирующие длительность сигналов.
Так длительность точки в 3 раза короче
длительности тире, пауза между точками и тире
равна по длительности точке, пауза между
цифрами и буквами равна длительности тире,
а длительность паузы между словами и числами
в 7 раз длиннее точки.*/
int dot = DASH/3; //Длительность сигнала "точка"
int pause = dot; //Длительность паузы между точками и тире
int charPause = DASH; //Длительность паузы между цифрами и буквами
int space = dot*7; //Длительность паузы между числами и словами
//Массив символов, в который мы запишем закодированное слово
char myWord[] = {".... . .-.. .-.. ---|.-- --- .-. .-.. -.."};
//Функция, которая принимает символ как параметр
//и воспроизводит его с помощью ленты и пьезоизлучателя
void bip(char symbol)
{
if (symbol == '-') //Если тире
{
//Пройти по всем светодиодам ленты
for (int i = 0; i < COUNTPIX; i++)
{
//Установить для каждого белый цвет
strip.setPixelColor(i, strip.Color(255,255,255));
}
strip.show(); //Вывести установленные значения на ленту
digitalWrite(BUZZ, HIGH); //Подать питание на пьезоизлучатель
delay(DASH); //Пауза, соответствующая длительности тире
digitalWrite(BUZZ, LOW); //Выключение питания на пьезоизлучателе
strip.clear(); //Установить состояние всех светодиодов как "выключено"
strip.show(); //Вывести установленные значения на ленту
delay(pause); //Пауза, соответствующая длительности промежутку между
//точками и тире
}
if (symbol == '.') //Если точка
{
//Пройти по всем светодиодам ленты
for (int i = 0; i < COUNTPIX; i++)
{
//Установить для каждого белый цвет
strip.setPixelColor(i, strip.Color(255,255,255));
}
strip.show(); //Вывести установленные значения на ленту
digitalWrite(BUZZ, HIGH); //Подать питание на пьезоизлучатель
delay(dot); //Пауза, соответствующая длительности точке
digitalWrite(BUZZ, LOW); //Выключение питания на пьезоизлучателе
strip.clear(); //Установить состояние всех светодиодов как "выключено"
strip.show(); //Вывести установленные значения на ленту
delay(pause); //Пауза, соответствующая длительности промежутку между
//точками и тире
}
if (symbol == ' ') //Если пробел
delay(charPause); //Пауза, соответствующая длительности промежутку между
//буквами и цифрами
if (symbol == '|') //Если разделитель
delay(space); //Пауза, соответствующая длительности промежутку между словами
}
//Служебная функция, которая выполняется один раз
//при включении микроконтроллера и в основном используется для настроек
void setup()
{
strip.begin(); //Инициализация ленты
strip.setBrightness(255); //Установка яркости свечения (0-255)
pinMode(BUZZ, OUTPUT); //Установка порта D12 в режим выхода
//Проходим по массиву, содержащему заданную фразу
for(int i = 0; i < sizeof(myWord); i++)
{
//Передаём каждый символ в функцию для воспроизведения
bip(myWord[i]);
}
}
//Основную функцию loop мы не используем,
//т.к. нет необходимости многократного
//повторения кода
void loop()
{}
Last updated