// Подключаем библиотеку для работы с мелодиями в формате RTTTL #include // Подключаем библиотеку для работы с ИК-приёмником #include // Подключаем библиотеку для работы с таймером millis #include // Подключаем библиотеку для работы со светодиодными матрицами #include // Даём понятное имя пину 3 с пищалкой constexpr uint8_t BUZZER_PIN = 3; // Даём понятное имя пину 2 с ИК-приёмником constexpr uint8_t IR_RECEIVE_PIN = 2; // Создаём объект для работы с таймером TimerMs timer; // Создаём объект матрицы левого глаза // на шине I²C с адресом 0x60 (указан по умолчанию) TroykaLedMatrix matrixL; // Создаём объект матрицы правого глаза // на шине I²C с адресом 0x63 TroykaLedMatrix matrixR(0x63); // Создаём массив данных мелодии «Моргание» в формате RTTTL constexpr uint8_t melodyBlink[] PROGMEM = "Blink:d=4,o=4,b=120:" "16e,16p,16g,16p,16e,16p,16g,16p,"; // Создаём массив данных мелодии «Злость» в формате RTTTL constexpr uint8_t melodyAngry[] PROGMEM = "Angry:d=4,o=4,b=200:" "16g,16g,16f#,16f#,16e,16e,16d#,16d#," "16c,16c,16b4,16b4,16a4,16a4,16g4,16g4"; // Создаём массив данных мелодии «Грусть» в формате RTTTL constexpr uint8_t melodySad[] PROGMEM = "Sad:d=4,o=4,b=25:" "16g,16a#,16d,16f," "16d,16c,16a#"; constexpr uint8_t melodyHappy[] PROGMEM = "Happy:d=4,o=4,b=140:" "8c4,8e4,8g4,8c4,8e4,8g4,8c4,8e4" "8g4,8c4,8e4,8g4"; // Создаём массив данных мелодии «Удивление» в формате RTTTL constexpr uint8_t melodyAmazed[] PROGMEM = "Amazed:d=4,o=4,b=180:" "16c,16d,16e,16f,16g,16a,16b,16c," "16b,16a,16g,16f,16e,16d,16c,16d"; // Создаём массив данных мелодии «Любовь» в формате RTTTL constexpr uint8_t melodyLove[] PROGMEM = "Love:d=4,o=4,b=100:" "8g,8p,8g,8p,8a,8p,8g,8p," "8g,8p,8g,8p,8f,8e,8d"; // Создаём массив данных мелодии «Сонливость» в формате RTTTL constexpr uint8_t melodySleep[] PROGMEM = "Sleep:d=4,o=4,b=45:" "8c,8c,8d,8e,8d,8c,8d,8e"; // Создаём перечисление эмоций с соответствующей переменной enum Emotion { EMOTION_BLINK = 0x1C, EMOTION_ANGRY = 0x02, EMOTION_SAD = 0xC, EMOTION_HAPPY = 0x0D, EMOTION_AMAZED = 0x05, EMOTION_LOVE = 0x09, EMOTION_SLEEP = 0x0E, } emotion; // Создаём структуру анимации struct AnimationFrame { uint8_t* iconEyeL; uint8_t* iconEyeR; int timeFrame; }; // Создаём объект структуры анимации AnimationFrame* animationFrame; // Создаём иконку «Взгляд прямо» в шестнадцатеричной системе HEX // Иконка для левого и правого глаза одинаковая // Эмоции рисуем в редакторе изображений для LED-матрицы // https://amperka.github.io/led-matrix-editor/ constexpr uint8_t ICON_EYE_STRAIGHT[] PROGMEM { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e }; // Создаём иконку «Глаза выключены» в шестнадцатеричной системе HEX // Иконка для левого и правого глаза одинаковая constexpr uint8_t ICON_EYE_OFF[] PROGMEM { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // Создаём массив иконок анимации «Моргание» в шестнадцатеричной системе HEX // Массив иконок для левого и правого глаза одинаковый constexpr uint8_t ICON_EYE_BLINK[][8] PROGMEM { { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e }, { 0x00, 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x7e }, { 0x00, 0x00, 0x7e, 0x81, 0x99, 0x99, 0x81, 0x7e }, { 0x00, 0x00, 0x00, 0x7e, 0x99, 0x99, 0x7e, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x7e, 0x99, 0x7e, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7e, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x7e, 0x99, 0x7e, 0x00 }, { 0x00, 0x00, 0x00, 0x7e, 0x99, 0x99, 0x7e, 0x00 }, { 0x00, 0x00, 0x7e, 0x81, 0x99, 0x99, 0x81, 0x7e }, { 0x00, 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x7e }, { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e } }; // Создаём массив иконок анимации «Злость» // в шестнадцатеричной системе HEX для левого глаза constexpr uint8_t ICON_EYE_ANGRY_L[][8] PROGMEM { { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e }, { 0x78, 0x84, 0x82, 0x9a, 0x9a, 0x82, 0x82, 0x7c }, { 0x70, 0x88, 0x84, 0x9a, 0x9a, 0x82, 0x82, 0x7c }, { 0x60, 0x90, 0x88, 0x9c, 0x9a, 0x82, 0x82, 0x7c }, { 0x40, 0xa0, 0x90, 0x88, 0xb4, 0xb2, 0x82, 0x7c }, { 0x80, 0xc0, 0xa0, 0x90, 0xa8, 0xb4, 0x82, 0x7c }, { 0x40, 0xa0, 0x90, 0x88, 0xb4, 0xb2, 0x82, 0x7c }, { 0x60, 0x90, 0x88, 0x9c, 0x9a, 0x82, 0x82, 0x7c }, { 0x70, 0x88, 0x84, 0x9a, 0x9a, 0x82, 0x82, 0x7c }, { 0x78, 0x84, 0x82, 0x9a, 0x9a, 0x82, 0x82, 0x7c }, { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e } }; // Создаём массив иконок анимации «Злость» // в шестнадцатеричной системе HEX для правого глаза constexpr uint8_t ICON_EYE_ANGRY_R[][8] PROGMEM { { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e }, { 0x1e, 0x21, 0x41, 0x59, 0x59, 0x41, 0x41, 0x3e }, { 0x0e, 0x11, 0x21, 0x59, 0x59, 0x41, 0x41, 0x3e }, { 0x06, 0x09, 0x11, 0x39, 0x59, 0x41, 0x41, 0x3e }, { 0x02, 0x05, 0x09, 0x11, 0x2d, 0x4d, 0x41, 0x3e }, { 0x01, 0x03, 0x05, 0x09, 0x15, 0x2d, 0x41, 0x3e }, { 0x02, 0x05, 0x09, 0x11, 0x2d, 0x4d, 0x41, 0x3e }, { 0x06, 0x09, 0x11, 0x39, 0x59, 0x41, 0x41, 0x3e }, { 0x0e, 0x11, 0x21, 0x59, 0x59, 0x41, 0x41, 0x3e }, { 0x1e, 0x21, 0x41, 0x59, 0x59, 0x41, 0x41, 0x3e } }; // Создаём массив иконок анимации «Грусть» // в шестнадцатеричной системе HEX для левого глаза constexpr uint8_t ICON_EYE_SAD_L[][8] PROGMEM { { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e }, { 0x3e, 0x41, 0x81, 0x99, 0x99, 0x81, 0x82, 0x7c }, { 0x1e, 0x21, 0x41, 0x99, 0x99, 0x81, 0x82, 0x7c }, { 0x0e, 0x11, 0x21, 0x41, 0x8d, 0x8d, 0x82, 0x7c }, { 0x0e, 0x11, 0x21, 0x41, 0x4d, 0x4d, 0x42, 0x3c }, { 0x06, 0x09, 0x11, 0x21, 0x4d, 0x4d, 0x42, 0x3c }, { 0x0e, 0x11, 0x21, 0x41, 0x4d, 0x4d, 0x42, 0x3c }, { 0x0e, 0x11, 0x21, 0x41, 0x8d, 0x8d, 0x82, 0x7c }, { 0x1e, 0x21, 0x41, 0x99, 0x99, 0x81, 0x82, 0x7c }, { 0x3e, 0x41, 0x81, 0x99, 0x99, 0x81, 0x82, 0x7c }, { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e } }; // Создаём массив иконок анимации «Грусть» // в шестнадцатеричной системе HEX для правого глаза constexpr uint8_t ICON_EYE_SAD_R[][8] PROGMEM { { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e }, { 0x7c, 0x82, 0x81, 0x99, 0x99, 0x81, 0x41, 0x3e }, { 0x78, 0x84, 0x82, 0x99, 0x99, 0x81, 0x41, 0x3e }, { 0x70, 0x88, 0x84, 0x82, 0xb1, 0xb1, 0x41, 0x3e }, { 0x70, 0x88, 0x84, 0x82, 0xb2, 0xb2, 0x42, 0x3c }, { 0x60, 0x90, 0x88, 0x84, 0xb2, 0xb2, 0x42, 0x3c }, { 0x70, 0x88, 0x84, 0x82, 0xb2, 0xb2, 0x42, 0x3c }, { 0x70, 0x88, 0x84, 0x82, 0xb1, 0xb1, 0x41, 0x3e }, { 0x78, 0x84, 0x82, 0x99, 0x99, 0x81, 0x41, 0x3e }, { 0x7c, 0x82, 0x81, 0x99, 0x99, 0x81, 0x41, 0x3e }, { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e } }; // Создаём массив иконок анимации «Радость» в шестнадцатеричной системе HEX // Массив иконок для левого и правого глаза одинаковый constexpr uint8_t ICON_EYE_HAPPY[][8] PROGMEM { { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e }, { 0x00, 0x7e, 0x81, 0x99, 0x99, 0x81, 0x7e, 0x00 }, { 0x00, 0x7e, 0x81, 0x99, 0x99, 0xff, 0x00, 0x00 }, { 0x00, 0x7e, 0xdb, 0x99, 0xff, 0x81, 0x00, 0x00 }, { 0x00, 0x3c, 0x5a, 0xff, 0xc3, 0x81, 0x00, 0x00 }, { 0x00, 0x3c, 0x7e, 0xc3, 0xc3, 0x81, 0x00, 0x00 }, { 0x00, 0x3c, 0x5a, 0xff, 0xc3, 0x81, 0x00, 0x00 }, { 0x00, 0x7e, 0xdb, 0x99, 0xff, 0x81, 0x00, 0x00 }, { 0x00, 0x7e, 0x81, 0x99, 0x99, 0xff, 0x00, 0x00 }, { 0x00, 0x7e, 0x81, 0x99, 0x99, 0x81, 0x7e, 0x00 }, { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e } }; // Создаём массив иконок анимации «Удивление» в шестнадцатеричной системе HEX // Массив иконок для левого и правого глаза одинаковый constexpr uint8_t ICON_EYE_AMAZED[][8] PROGMEM { { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e }, { 0x7e, 0x81, 0x99, 0xbd, 0xbd, 0x99, 0x81, 0x7e }, { 0x7e, 0x81, 0xbd, 0xbd, 0xbd, 0xbd, 0x81, 0x7e }, { 0x7e, 0x81, 0x99, 0xbd, 0xbd, 0x99, 0x81, 0x7e }, { 0x7e, 0x81, 0x81, 0x99, 0x99, 0x81, 0x81, 0x7e } }; // Создаём массив иконок анимации «Любовь» в шестнадцатеричной системе HEX // Массив иконок для левого и правого глаза одинаковый constexpr uint8_t ICON_EYE_LOVE[][8] PROGMEM { { 0x66, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x18 }, { 0x00, 0x00, 0x24, 0x7e, 0x7e, 0x3c, 0x18, 0x00 } }; // Создаём массив иконок анимации Сон» в шестнадцатеричной системе HEX // Массив иконок для левого и правого глаза одинаковый constexpr uint8_t ICON_EYE_SLEEP[][8] PROGMEM { { 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7e, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff, 0x7e, 0x00 } }; // Создаём анимацию «Моргание» AnimationFrame animationBlink[] = { { ICON_EYE_BLINK[0], ICON_EYE_BLINK[0], 500 }, { ICON_EYE_BLINK[1], ICON_EYE_BLINK[1], 25 }, { ICON_EYE_BLINK[2], ICON_EYE_BLINK[2], 25 }, { ICON_EYE_BLINK[3], ICON_EYE_BLINK[3], 25 }, { ICON_EYE_BLINK[4], ICON_EYE_BLINK[4], 25 }, { ICON_EYE_BLINK[5], ICON_EYE_BLINK[5], 25 }, { ICON_EYE_BLINK[6], ICON_EYE_BLINK[6], 25 }, { ICON_EYE_BLINK[7], ICON_EYE_BLINK[7], 25 }, { ICON_EYE_BLINK[8], ICON_EYE_BLINK[8], 25 }, { ICON_EYE_BLINK[9], ICON_EYE_BLINK[9], 25 }, { ICON_EYE_BLINK[10], ICON_EYE_BLINK[10], 500 } }; // Создаём анимацию «Злость» AnimationFrame animationAngry[] = { { ICON_EYE_ANGRY_L[0], ICON_EYE_ANGRY_R[0], 500 }, { ICON_EYE_ANGRY_L[1], ICON_EYE_ANGRY_R[1], 50 }, { ICON_EYE_ANGRY_L[2], ICON_EYE_ANGRY_R[2], 50 }, { ICON_EYE_ANGRY_L[3], ICON_EYE_ANGRY_R[3], 50 }, { ICON_EYE_ANGRY_L[4], ICON_EYE_ANGRY_R[4], 50 }, { ICON_EYE_ANGRY_L[5], ICON_EYE_ANGRY_R[5], 2000 }, { ICON_EYE_ANGRY_L[6], ICON_EYE_ANGRY_R[6], 50 }, { ICON_EYE_ANGRY_L[7], ICON_EYE_ANGRY_R[7], 50 }, { ICON_EYE_ANGRY_L[8], ICON_EYE_ANGRY_R[8], 50 }, { ICON_EYE_ANGRY_L[9], ICON_EYE_ANGRY_R[9], 50 }, { ICON_EYE_ANGRY_L[10], ICON_EYE_ANGRY_R[10], 500 } }; // Создаём анимацию «Грусть» AnimationFrame animationSad[] = { { ICON_EYE_SAD_L[0], ICON_EYE_SAD_R[0], 500 }, { ICON_EYE_SAD_L[1], ICON_EYE_SAD_R[1], 50 }, { ICON_EYE_SAD_L[2], ICON_EYE_SAD_R[2], 50 }, { ICON_EYE_SAD_L[3], ICON_EYE_SAD_R[3], 50 }, { ICON_EYE_SAD_L[4], ICON_EYE_SAD_R[4], 50 }, { ICON_EYE_SAD_L[5], ICON_EYE_SAD_R[5], 3000 }, { ICON_EYE_SAD_L[6], ICON_EYE_SAD_R[6], 50 }, { ICON_EYE_SAD_L[7], ICON_EYE_SAD_R[7], 50 }, { ICON_EYE_SAD_L[8], ICON_EYE_SAD_R[8], 50 }, { ICON_EYE_SAD_L[9], ICON_EYE_SAD_R[9], 50 }, { ICON_EYE_SAD_L[10], ICON_EYE_SAD_R[10], 500 } }; // Создаём анимацию «Радость» AnimationFrame animationHappy[] = { { ICON_EYE_HAPPY[0], ICON_EYE_HAPPY[0], 500 }, { ICON_EYE_HAPPY[1], ICON_EYE_HAPPY[1], 40 }, { ICON_EYE_HAPPY[2], ICON_EYE_HAPPY[2], 40 }, { ICON_EYE_HAPPY[3], ICON_EYE_HAPPY[3], 40 }, { ICON_EYE_HAPPY[4], ICON_EYE_HAPPY[4], 40 }, { ICON_EYE_HAPPY[5], ICON_EYE_HAPPY[5], 2000 }, { ICON_EYE_HAPPY[6], ICON_EYE_HAPPY[6], 40 }, { ICON_EYE_HAPPY[7], ICON_EYE_HAPPY[7], 40 }, { ICON_EYE_HAPPY[8], ICON_EYE_HAPPY[8], 40 }, { ICON_EYE_HAPPY[9], ICON_EYE_HAPPY[9], 40 }, { ICON_EYE_HAPPY[10], ICON_EYE_HAPPY[10], 500 } }; // Создаём анимацию «Удивление» AnimationFrame animationAmazed[] = { { ICON_EYE_AMAZED[0], ICON_EYE_AMAZED[0], 500 }, { ICON_EYE_AMAZED[1], ICON_EYE_AMAZED[1], 100 }, { ICON_EYE_AMAZED[2], ICON_EYE_AMAZED[2], 2000 }, { ICON_EYE_AMAZED[3], ICON_EYE_AMAZED[3], 100 }, { ICON_EYE_AMAZED[4], ICON_EYE_AMAZED[4], 500 } }; // Создаём анимацию «Любовь» AnimationFrame animationLove[] = { { ICON_EYE_LOVE[0], ICON_EYE_LOVE[0], 1000 }, { ICON_EYE_LOVE[1], ICON_EYE_LOVE[1], 300 }, { ICON_EYE_LOVE[0], ICON_EYE_LOVE[0], 1000 }, { ICON_EYE_LOVE[1], ICON_EYE_LOVE[1], 300 }, { ICON_EYE_LOVE[0], ICON_EYE_LOVE[0], 1000 }, { ICON_EYE_LOVE[1], ICON_EYE_LOVE[1], 300 }, { ICON_EYE_LOVE[0], ICON_EYE_LOVE[0], 1000 }, { ICON_EYE_LOVE[1], ICON_EYE_LOVE[1], 300 }, }; // Создаём анимацию «Сон» AnimationFrame animationSleep[] = { { ICON_EYE_SLEEP[0], ICON_EYE_SLEEP[0], 750 }, { ICON_EYE_SLEEP[1], ICON_EYE_SLEEP[1], 750 }, { ICON_EYE_SLEEP[0], ICON_EYE_SLEEP[0], 750 }, { ICON_EYE_SLEEP[1], ICON_EYE_SLEEP[1], 750 }, { ICON_EYE_SLEEP[0], ICON_EYE_SLEEP[0], 750 }, { ICON_EYE_SLEEP[1], ICON_EYE_SLEEP[1], 750 }, { ICON_EYE_SLEEP[0], ICON_EYE_SLEEP[0], 750 }, { ICON_EYE_SLEEP[1], ICON_EYE_SLEEP[1], 750 }, }; // Вычисляем количество кадров в анимации «Моргание» constexpr uint8_t COUNT_FRAMES_BLINK = sizeof(animationBlink) / sizeof(AnimationFrame); // Вычисляем количество кадров в анимации «Злость» constexpr uint8_t COUNT_FRAMES_ANGRY = sizeof(animationAngry) / sizeof(AnimationFrame); // Вычисляем количество кадров в анимации «Грусть» constexpr uint8_t COUNT_FRAMES_SAD = sizeof(animationSad) / sizeof(AnimationFrame); // Вычисляем количество кадров в анимации «Радость» constexpr uint8_t COUNT_FRAMES_HAPPY = sizeof(animationHappy) / sizeof(AnimationFrame); // Вычисляем количество кадров в анимации «Удивление» constexpr uint8_t COUNT_FRAMES_AMAZED = sizeof(animationAmazed) / sizeof(AnimationFrame); // Вычисляем количество кадров в анимации «Любовь» constexpr uint8_t COUNT_FRAMES_LOVE = sizeof(animationLove) / sizeof(AnimationFrame); // Вычисляем количество кадров в анимации «Сон» constexpr uint8_t COUNT_FRAMES_SLEEP = sizeof(animationSleep) / sizeof(AnimationFrame); // Создаём переменную для хранения счётчика текущего кадра int indexFrame; // Создаём переменную для хранения количества кадров int countFrames; // Создаём переменную для хранения флага последнего кадра bool lastFrame; void setup() { // Инициализируем матрицы matrixL.begin(); matrixR.begin(); // Очищаем матрицы matrixL.clear(); matrixR.clear(); // Инициализируем ИК-приёмник IrReceiver.begin(IR_RECEIVE_PIN); // Сбрасываем все настройки переменных по умолчанию resetState(); // Устанавливаем таймер в режим остановки после срабатывания timer.setTimerMode(); } void loop() { // Переходим в функцию обработки эмоций emotionHandler(); // Переходим в функцию обработки ИК-приёмника remoteHandler(); } // Функция отображения иконки на матрицах void drawIcon(uint8_t* iconEyeL, uint8_t* iconEyeR) { matrixL.drawBitmapF(iconEyeL); matrixR.drawBitmapF(iconEyeR); } // Функция обработки эмоций void emotionHandler() { // Вызываем функцию обновление анимации updateEmotion(); // Разрешаем играть выбранный трек anyrtttl::nonblocking::play(); } // Функция обработки ИК-приёмника void remoteHandler() { // Если пришёл новый сигнал на ИК-приёмник, декодируем его if (IrReceiver.decode()) { // Создаём переменную и присваиваем ей декодируемый код кнопки uint32_t code = IrReceiver.decodedIRData.command; // Проверяем код кнопки switch (code) { // Если нажата кнопка с кодом эмоции «Моргание» case EMOTION_BLINK: setEmotion(EMOTION_BLINK); break; // Если нажата кнопка с кодом эмоции «Злость» case EMOTION_ANGRY: // Отображаем анимацию «Злость» setEmotion(EMOTION_ANGRY); break; // Если нажата кнопка с кодом эмоции «Грусть» case EMOTION_SAD: // Отображаем анимацию «Грусть» setEmotion(EMOTION_SAD); break; // Если нажата кнопка с кодом эмоции «Радость» case EMOTION_HAPPY: // Отображаем анимацию «Радость» setEmotion(EMOTION_HAPPY); break; // Если нажата кнопка с кодом эмоции «Удивление case EMOTION_AMAZED: // Отображаем анимацию «Удивление» setEmotion(EMOTION_AMAZED); break; // Если нажата кнопка с кодом эмоции «Любовь» case EMOTION_LOVE: // Отображаем анимацию «Любовь» setEmotion(EMOTION_LOVE); break; // Если нажата кнопка с кодом эмоции «Сон» case EMOTION_SLEEP: // Отображаем анимацию «Сон» setEmotion(EMOTION_SLEEP); break; } // Разрешаем обрабатывать следующий сигнал IrReceiver.resume(); } } // Функция установки текущей эмоции void setEmotion(Emotion emotionNow) { // Обновляем полученную эмоцию emotion = emotionNow; // Проверяем состояние текущей эмоции switch (emotion) { // Эмоция «Моргание» case EMOTION_BLINK: // Устанавливаем анимацию, кол-во кадров и мелодию для эмоции «Моргание» animationFrame = animationBlink; countFrames = COUNT_FRAMES_BLINK; anyrtttl::nonblocking::begin_P(BUZZER_PIN, melodyBlink); break; // Эмоция «Злость» case EMOTION_ANGRY: // Устанавливаем анимацию, кол-во кадров и мелодию для эмоции «Злость» animationFrame = animationAngry; countFrames = COUNT_FRAMES_ANGRY; anyrtttl::nonblocking::begin_P(BUZZER_PIN, melodyAngry); break; // Эмоция «Грусть» case EMOTION_SAD: // Устанавливаем анимацию, кол-во кадров и мелодию для эмоции «Грусть» animationFrame = animationSad; countFrames = COUNT_FRAMES_SAD; anyrtttl::nonblocking::begin_P(BUZZER_PIN, melodySad); break; // Эмоция «Радость» case EMOTION_HAPPY: // Устанавливаем анимацию, кол-во кадров и мелодию для эмоции «Радость» animationFrame = animationHappy; countFrames = COUNT_FRAMES_HAPPY; anyrtttl::nonblocking::begin_P(BUZZER_PIN, melodyHappy); break; // Эмоция «Удивление» case EMOTION_AMAZED: // Устанавливаем анимацию, кол-во кадров и мелодию для эмоции «Удивление» animationFrame = animationAmazed; countFrames = COUNT_FRAMES_AMAZED; anyrtttl::nonblocking::begin_P(BUZZER_PIN, melodyAmazed); break; // Эмоция «Любовь» case EMOTION_LOVE: // Устанавливаем анимацию, кол-во кадров и мелодию для эмоции «Любовь» animationFrame = animationLove; countFrames = COUNT_FRAMES_LOVE; anyrtttl::nonblocking::begin_P(BUZZER_PIN, melodyLove); break; // Эмоция «Сон» case EMOTION_SLEEP: // Устанавливаем анимацию, кол-во кадров и мелодию для эмоции «Сон» animationFrame = animationSleep; countFrames = COUNT_FRAMES_SLEEP; anyrtttl::nonblocking::begin_P(BUZZER_PIN, melodySleep); break; } // Отключаем ИК-приёмник IrReceiver.stop(); // Устанавливаем в таймер значение счетчика 0 timer.setTime(0); // Запускаем таймер timer.start(); } // Функция обновления эмоции void updateEmotion() { // Если таймер досчитал до конца if (timer.tick()) { // Если флаг последнего кадра в состоянии «не активен» if (lastFrame == false) { // Отображаем текущий кадр анимации matrixL.drawBitmapF(animationFrame[indexFrame].iconEyeL); matrixR.drawBitmapF(animationFrame[indexFrame].iconEyeR); // Устанавливаем в таймер значение счетчика задержки текущего кадра анимации timer.setTime(animationFrame[indexFrame].timeFrame); // Запускаем таймер timer.start(); // Если текущий кадр не последний в анимации if (indexFrame < countFrames - 1) { // Переходим на следующий кадр indexFrame++; } else { // Устанавливаем флаг последнего кадра в состояние «активен» lastFrame = true; } } else { // Останавливаем таймер timer.stop(); // Запускаем ИК-приёмник IrReceiver.start(); // Сбрасываем все настройки по умолчанию resetState(); } } } // Функция сброса всех настроек по умолчанию void resetState() { // Обнуляем счётчик кадра indexFrame = 0; // Устанавливаем флаг последнего кадра в состояние «не активен» lastFrame = false; // Отображаем на матрицах иконку «Взгляд прямо» drawIcon(ICON_EYE_STRAIGHT, ICON_EYE_STRAIGHT); }