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