#include <MD_MAX72xx.h>
#include <SPI.h>
// Оставляем PAROLA_HW, так как на твоих панелях он работает идеально
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 8
#define CS_PIN 9
#define BUTTON_PIN 2
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// 1. Обычный рот (твоя первая версия, фокус на центре)
const byte normal_mouth[32] = {
0b00000001, 0b00000001, 0b00000010, 0b00000010,
0b00000100, 0b00000100, 0b00001000, 0b00001000,
0b00010000, 0b00010000, 0b00100000, 0b00100000,
0b01000000, 0b01000000, 0b10000000, 0b10000000,
0b01000000, 0b01000000, 0b00100000, 0b00100000,
0b00010000, 0b00010000, 0b00001000, 0b00001000,
0b00000100, 0b00001000, 0b00010000, 0b00100000,
0b01000000, 0b10000000, 0b01000000, 0b00100000
};
// 2. Грустный рот (опущенная дуга)
const byte sad_mouth[32] = {
0b01000000, 0b01000000, 0b01000000, 0b01000000,
0b00100000, 0b00100000, 0b00100000, 0b00100000,
0b00010000, 0b00010000, 0b00010000, 0b00010000,
0b00001000, 0b00001000, 0b00001000, 0b00001000,
0b00000100, 0b00000100, 0b00000100, 0b00000100,
0b00000010, 0b00000010, 0b00000010, 0b00000010,
0b00000001, 0b00000001, 0b00000001, 0b00000001,
0b00000001, 0b00000001, 0b00000001, 0b00000001
};
// 3. Ровный зигзаг (непрерывная волна от центра к краям, как на фото)
const byte even_zigzag[32] = {
0b10000000, 0b01000000, 0b00100000, 0b00010000,
0b00001000, 0b00000100, 0b00000010, 0b00000001,
0b00000010, 0b00000100, 0b00001000, 0b00010000,
0b00100000, 0b01000000, 0b10000000, 0b01000000,
0b00100000, 0b00010000, 0b00001000, 0b00000100,
0b00000010, 0b00000001, 0b00000010, 0b00000100,
0b00001000, 0b00010000, 0b00100000, 0b01000000,
0b10000000, 0b01000000, 0b00100000, 0b00010000
};
// Переменные для отслеживания состояния
bool lastButtonState = HIGH;
int currentEmotion = 0; // 0 = норма, 1 = грусть, 2 = ровный зигзаг
void setup() {
mx.begin();
mx.control(MD_MAX72XX::INTENSITY, 5);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Рисуем базовую эмоцию при запуске
drawEmotion(normal_mouth);
}
void loop() {
bool currentButtonState = digitalRead(BUTTON_PIN);
// Если кнопка только что была нажата
if (lastButtonState == HIGH && currentButtonState == LOW) {
// Переключаем на следующую эмоцию
currentEmotion++;
// Если вышли за пределы 3 эмоций (0, 1, 2), возвращаемся к первой (0)
if (currentEmotion > 2) {
currentEmotion = 0;
}
// Отрисовываем нужную эмоцию в зависимости от текущего состояния
if (currentEmotion == 0) {
drawEmotion(normal_mouth);
} else if (currentEmotion == 1) {
drawEmotion(sad_mouth);
} else if (currentEmotion == 2) {
drawEmotion(even_zigzag);
}
// Защита от дребезга кнопки
delay(50);
}
lastButtonState = currentButtonState;
}
// Универсальная функция для отрисовки любого массива рта
void drawEmotion(const byte* mouthArray) {
mx.clear();
for (int i = 0; i < 32; i++) {
int leftX = 31 - i;
int rightX = 32 + i;
byte colData = mouthArray[i];
// Делаем линию толще (объединяем точку с соседней)
byte thickData = colData | (colData << 1);
if (colData == 0b10000000) {
thickData = 0b11000000;
}
for (int bit = 0; bit < 8; bit++) {
bool isOn = (thickData & (1 << bit)) != 0;
if (isOn) {
mx.setPoint(bit, leftX, true);
mx.setPoint(bit, rightX, true);
}
}
}
}