#include <IRremote.hpp>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#include <LedControl.h>
LedControl lc=LedControl(11,13,10,0);
#define MAX_DEVICES 4 // количество используемых матриц 8на8
// Define the IR remote button hex codes
#define BUTTON_A 1570963200 // ON/OF
#define BUTTON_B 501415680 // MENU
#define BUTTON_C 3710058240 // TEST
#define BUTTON_D 4244832000 // +
#define BUTTON_E 1036189440 // RETURN
#define BUTTON_F 534839040 // |<<
#define BUTTON_G 1470693120 // > PLAY
#define BUTTON_H 1871773440 // >>|
#define BUTTON_J 1738080000 // -
#define BUTTON_0 2540240640
#define BUTTON_1 3476094720
#define BUTTON_2 3877175040
#define BUTTON_3 2239430400
#define BUTTON_4 4010868480
#define BUTTON_5 3342401280
#define BUTTON_6 2774204160
#define BUTTON_7 3175284480
#define BUTTON_8 3041591040
#define BUTTON_9 2907897600
// переменная для работы с библиотекой IRremote
const int RECV_PIN=2;
// вывод ИК-приемника
IRrecv irrecv(RECV_PIN);
// Базовая настройка и создание обьектов для работы с библиотекой MD_Parola
MD_Parola parola = MD_Parola(MD_MAX72XX::PAROLA_HW, 10, MAX_DEVICES);
// Вывод текстовых сообщений
char message1[] = "MERCEDES";
char message2[] = "NISSAN";
char message3[] = "AUDI";
char message4[] = "BMW";
char message5[] = "HYUNDAI";
char message6[] = "TOYOTA";
char message7[] = "KIA";
char msg[] ="00000000" ;
// Вывод графики, здесь в 16ричной системе кодируется положение пикселей которые нужно закрасить
byte smile[8]= {0x3C,0x42,0xA5,0x81,0xA5,0x99,0x42,0x3C};
byte neutral[8]= {0x3C,0x42,0xA5,0x81,0xBD,0x81,0x42,0x3C};
byte frown[8]= {0x3C,0x42,0xA5,0x81,0x99,0xA5,0x42,0x3C};
// переменная отвечающая за яркость
byte IntensivityRate = 0;
void setup() {
// Инициализация IR получателя и LED матрицы
Serial.begin(9600);
IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK);
parola.begin();
// очистка дисплея
parola.displayClear();
// Установка значений яркости (0-15)
parola.setIntensity(3);
}
void loop() {
// Проверка на нажатия клавиш
if (IrReceiver.decode()) {
Serial.println(IrReceiver.decodedIRData.decodedRawData);
// вывод текста
if (IrReceiver.decodedIRData.decodedRawData == BUTTON_0) {
parola.displayClear();
displayMessage(message1);
UpdateMSG(message1);
} else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_1) {
parola.displayClear();
displayMessage(message2);
UpdateMSG(message2);
} else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_2) {
parola.displayClear();
displayMessage(message3);
UpdateMSG(message3);
} else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_3) {
parola.displayClear();
displayMessage(message4);
UpdateMSG(message4);
} else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_4) {
parola.displayClear();
displayMessage(message5);
UpdateMSG(message5);
} else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_5) {
parola.displayClear();
displayMessage(message6);
UpdateMSG(message6);
} else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_6) {
parola.displayClear();
displayMessage(message7);
UpdateMSG(message7);
}
// эффекты
else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_F) {
parola.displayClear();
scrollText(msg, PA_SCROLL_LEFT);
} else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_H) {
parola.displayClear();
scrollText(msg, PA_SCROLL_RIGHT);
} else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_D) {
parola.displayClear();
scrollText(msg, PA_SCROLL_UP);
} else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_J) {
parola.displayClear();
scrollText(msg, PA_SCROLL_DOWN);
}
else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_J) {
parola.displayClear();
scrollText(msg, PA_PRINT);
}
// вывод графики
else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_7) {
parola.displayClear();
printByte(smile);
delay(1000);
}
else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_8) {
parola.displayClear();
printByte(neutral);
delay(1000);
}
else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_9) {
parola.displayClear();
printByte(frown);
delay(1000);
}
// изменение яркости
else if (IrReceiver.decodedIRData.decodedRawData == BUTTON_A) {
parola.setIntensity(IntensivityRate+=3);
if (IntensivityRate > 15){
IntensivityRate += 3;
Serial.println("intensivity:" + IntensivityRate);
parola.setIntensity(IntensivityRate);
}
}
// Получили переходим в режим ожидания другого нажатия
IrReceiver.resume();
}
}
// функция для вывода сообщений
void displayMessage(char* message) {
parola.displayText(message, PA_CENTER, 0, 0, PA_PRINT, PA_NO_EFFECT);
parola.displayAnimate();
}
// функция для эффекта скрола с возможностью задать направления
void scrollText(char* message, textEffect_t effect) {
parola.displayReset();
parola.displayText(message, PA_CENTER, 60, 0, PA_SCROLL_LEFT, effect);
while (!parola.displayAnimate()) {
parola.displayAnimate();
}
parola.displayReset(); // Очистка экрана после анимации
displayMessage(message);
}
// функция для вывода графики
void printByte(byte character [])
{
int i = 0;
for(i=0;i<8;i++)
{
lc.setRow(0,i,character[i]);
}
}
// функция записи последнего сообщений в глобальную переменную
void UpdateMSG(char msgUp[]){
for (int i=0;i<10;i++){
msg[i] = msgUp[i];
}
}
// 13. Управление светодиодной матрицей
// Разработать проект на микроконтроллере для управления светодиодной
// матрицей. Матрица представляет собой двумерный массив светодиодов,
// и система должна обеспечивать разнообразное отображение графики или текста на
// данной матрице.
// Функциональные требования:
// 1) Отображение Графики:
// Реализовать возможность отображения графических изображений
// (например, символов, логотипов всего не менее восьми) на светодиодной матрице.
// 2) Текстовый режим:
// Включить текстовый режим для вывода на матрицу информации в виде текста, например, сообщений или цифр.
// 3) Динамичные эффекты:
// Предусмотреть динамичные эффекты, такие как бегущая строка, мерцание,
// смена цветов и т.д.
// 4) Управление яркостью:
// Реализовать возможность регулировки яркости светодиодов для адаптации
// к различным условиям освещения.
// 5) Интерфейс управления:
// Разработать простой интерфейс управления, возможно, с использованием
// кнопок или других устройств ввода.
// 6) Программируемые эффекты:
// Добавить возможность программирования собственных эффектов на матрице.