// Подключаем библиотеку для работы со светодиодными матрицами #include // Создаём объект матрицы левого глаза // на шине I²C с адресом 0x60 (указан по умолчанию) TroykaLedMatrix matrixL; // Создаём объект матрицы правого глаза // на шине I²C с адресом 0x63 TroykaLedMatrix matrixR(0x63); // Создаём структуру анимации struct AnimationFrame { uint8_t* iconEyeL; uint8_t* iconEyeR; int timeFrame; }; // Создаём массив иконок анимации «Моргание» в шестнадцатеричной системе 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 } }; // Создаём анимацию «Сон» AnimationFrame animationSleep[] = { { 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 uint8_t COUNT_REPEAT_EMOTION = 3; void setup() { // Инициализируем матрицы matrixL.begin(); matrixR.begin(); // Очищаем матрицы matrixL.clear(); matrixR.clear(); } void loop() { // Перебираем количество повторений анимации «Моргание» for (int i = 0; i < COUNT_REPEAT_EMOTION; i++) { // Отображаем анимацию «Моргание» drawAnimation(animationBlink, COUNT_FRAMES_BLINK); } // Перебираем количество повторений анимации «Злость» for (int i = 0; i < COUNT_REPEAT_EMOTION; i++) { // Отображаем анимацию «Злость» drawAnimation(animationAngry, COUNT_FRAMES_ANGRY); } // Перебираем количество повторений анимации «Грусть» for (int i = 0; i < COUNT_REPEAT_EMOTION; i++) { // Отображаем анимацию «Грусть» drawAnimation(animationSad, COUNT_FRAMES_SAD); } // Перебираем количество повторений анимации «Радость» for (int i = 0; i < COUNT_REPEAT_EMOTION; i++) { // Отображаем анимацию «Радость» drawAnimation(animationHappy, COUNT_FRAMES_HAPPY); } // Перебираем количество повторений анимации «Удивление» for (int i = 0; i < COUNT_REPEAT_EMOTION; i++) { // Отображаем анимацию «Удивление» drawAnimation(animationAmazed, COUNT_FRAMES_AMAZED); } // Перебираем количество повторений анимации «Любовь» for (int i = 0; i < COUNT_REPEAT_EMOTION; i++) { // Отображаем анимацию «Любовь» drawAnimation(animationLove, COUNT_FRAMES_LOVE); } } // Функция отображения анимации на матрицах void drawAnimation(AnimationFrame* animationFrame, int countFrames) { // Перебираем анимацию по кадрам for (int indexFrame = 0; indexFrame < countFrames; indexFrame++) { // Отображаем на матрицах текущий кадр matrixL.drawBitmapF(animationFrame[indexFrame].iconEyeL); matrixR.drawBitmapF(animationFrame[indexFrame].iconEyeR); // Ждём время задержки текущего кадра delay(animationFrame[indexFrame].timeFrame); } }