// Подключаем библиотеку для работы с мелодиями в формате RTTTL #include // Подключаем библиотеку для работы с таймером millis #include // Подключаем библиотеку для работы со светодиодными матрицами #include // Даём понятное имя пину 3 с пищалкой constexpr uint8_t BUZZER_PIN = 3; // Создаём объект для работы с таймером 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, EMOTION_ANGRY, EMOTION_SAD, EMOTION_HAPPY, EMOTION_AMAZED, EMOTION_LOVE, EMOTION_SLEEP, } 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_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); // Создаём константу для хранения общего количества повторений эмоции constexpr int COUNT_REPEAT_EMOTION = 3; // Создаём переменную для хранения текущего счётчика количества повторений эмоции int countRepeatEmotion; // Создаём переменную для хранения счётчика текущего кадра int indexFrame; // Создаём переменную для хранения количества кадров int countFrames; // Создаём переменную для хранения флага последнего кадра bool lastFrame; void setup() { // Инициализируем матрицы matrixL.begin(); matrixR.begin(); // Очищаем матрицы matrixL.clear(); matrixR.clear(); // Настраиваем пин с пищалкой в режим выхода pinMode(BUZZER_PIN, OUTPUT); // Сбрасываем все настройки переменных по умолчанию resetState(); // Устанавливаем таймер в режим остановки после срабатывания timer.setTimerMode(); // Передаём случайное число с пина A1 // для последующей генерации случайных чисел randomSeed(analogRead(A1)); // Устанавливаем анимацию «Моргание» setEmotion(EMOTION_BLINK); } void loop() { // Переходим в функцию обработки эмоций emotionHandler(); } // Функция обработки эмоций void emotionHandler() { // Вызываем функцию обновление анимации updateEmotion(); // Разрешаем играть выбранный трек anyrtttl::nonblocking::play(); } // Функция установки текущей эмоции 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; } // Устанавливаем в таймер значение счетчика 0 timer.setTime(0); // Запускаем таймер timer.start(); } // Функция переключения на следующую эмоцию // Для активации смены эмоции, необходимо вызвать функцию установки эмоции setEmotion() void nextEmotion() { if (emotion == EMOTION_BLINK) { emotion = EMOTION_ANGRY; } else if (emotion == EMOTION_ANGRY) { emotion = EMOTION_SAD; } else if (emotion == EMOTION_SAD) { emotion = EMOTION_HAPPY; } else if (emotion == EMOTION_HAPPY) { emotion = EMOTION_AMAZED; } else if (emotion == EMOTION_AMAZED) { emotion = EMOTION_LOVE; } else if (emotion == EMOTION_LOVE) { emotion = EMOTION_SLEEP; } else if (emotion == EMOTION_SLEEP) { emotion = EMOTION_BLINK; } } // Функция выбора случайной эмоции // Для активации смены эмоции, необходимо вызвать функцию установки эмоции setEmotion() void randomEmotion() { emotion = random(0, 8); if (emotion == 0) { emotion = EMOTION_BLINK; } else if (emotion == 1) { emotion = EMOTION_ANGRY; } else if (emotion == 2) { emotion = EMOTION_SAD; } else if (emotion == 3) { emotion = EMOTION_HAPPY; } else if (emotion == 4) { emotion = EMOTION_AMAZED; } else if (emotion == 5) { emotion = EMOTION_LOVE; } else if (emotion == 6) { emotion = EMOTION_SLEEP; } else if (emotion == 7) { emotion = EMOTION_BLINK; } } // Функция обновления эмоции 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(); // Проверяем сколько раз повторялась текущая анимация if (countRepeatEmotion < COUNT_REPEAT_EMOTION - 1) { // Увеличиваем счётчик повторения текущей анимации countRepeatEmotion++; } else { // Вызываем функцию переключение на следующую эмоцию nextEmotion(); // Обнуляем счётчик повторения текущей анимации countRepeatEmotion = 0; } // Устанавливаем текущую анимацию setEmotion(emotion); // Устанавливаем флаг последнего кадра в состояние «не активен» lastFrame = false; // Обнуляем счётчик кадров indexFrame = 0; } } } // Функция сброса всех настроек переменных по умолчанию void resetState() { // Обнуляем переменную для хранения количества повторений эмоции countRepeatEmotion = 0; // Обнуляем счётчик кадра indexFrame = 0; // Устанавливаем флаг последнего кадра в состояние «не активен» lastFrame = false; }