#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// Uncomment according to your hardware type
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
//#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW
// Defining size, and output pins
#define MAX_DEVICES 4
#define CLK_PIN 23 // Changed for ESP32 in Wokwi
#define DATA_PIN 19 // Changed for ESP32 in Wokwi
#define CS_PIN 22
// Create a new instance of the MD_Parola class with hardware SPI connection
MD_Parola ledMatrix = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
// Конфігурація станів
enum State {
STATE_HELLO,
STATE_IP,
STATE_TEMP,
STATE_DONE,
NUM_STATES // Загальна кількість станів
};
State currentState = STATE_HELLO; // Початковий стан
unsigned long stateStartTime = 0; // Час початку стану
const unsigned long stateDuration = 5000; // Тривалість стану в мс (5 сек)
unsigned long lastUpdateTime = 0; // Останнє оновлення для стану з оновленням даних
// Текст для кожного стану
const char* stateTexts[NUM_STATES] = {
"Hello, world!", // STATE_HELLO
"IP: 192.168.1.1", // STATE_IP (замінити на ваш IP)
"Temp: 25C", // STATE_TEMP (замінити на ваші дані)
"Cycle complete!" // STATE_DONE
};
// Режими анімації для кожного стану
textEffect_t stateEffects[NUM_STATES] = {
PA_SCROLL_LEFT, // Для STATE_HELLO — прокручування
PA_SCROLL_LEFT, // Для STATE_IP — прокручування
PA_PRINT, // Для STATE_TEMP — статичний текст
PA_SCROLL_LEFT // Для STATE_DONE — прокручування
};
char tempText[16];
void setup() {
Serial.begin(115200);
ledMatrix.begin();
ledMatrix.setIntensity(5); // Яскравість дисплея (0-15)
ledMatrix.displayClear();
// Виводимо текст для першого стану
ledMatrix.displayText(stateTexts[currentState], PA_CENTER, 100, 0, stateEffects[currentState]);
stateStartTime = millis(); // Запускаємо перший стан
lastUpdateTime = millis(); // Ініціалізуємо останнє оновлення
}
void loop() {
// Анімація тексту
if (ledMatrix.displayAnimate()) {
ledMatrix.displayReset();
}
// Перевірка часу для переходу до наступного стану
if (millis() - stateStartTime >= stateDuration) {
nextState(); // Перехід до наступного стану
}
// Оновлення даних в стані STATE_TEMP кожну секунду
if (currentState == STATE_TEMP && millis() - lastUpdateTime >= 1000) {
updateTempData(); // Оновлюємо дані температури
lastUpdateTime = millis(); // Оновлюємо час останнього оновлення
}
}
void nextState() {
// Перехід до наступного стану
currentState = static_cast<State>((currentState + 1) % NUM_STATES);
// Виводимо текст і режим для нового стану
ledMatrix.displayText(stateTexts[currentState], PA_CENTER, 100, 0, stateEffects[currentState]);
// Оновлюємо час початку стану
stateStartTime = millis();
}
// Функція для оновлення даних температури (приклад)
void updateTempData() {
// Замінимо значення температури на нове значення
// Тут можна отримати дані від датчика, наприклад:
// int temperature = getTemperature(); // Ваш код для отримання температури
int temperature = random(20, 30); // Для прикладу генеруємо випадкову температуру від 20 до 30
// Оновлюємо текст на дисплеї
snprintf(tempText, sizeof(tempText), "T: %dC", temperature);
// Оновлюємо текст на матриці
ledMatrix.displayText(tempText, PA_CENTER, 100, 0, PA_PRINT);
}