#include <Adafruit_NeoPixel.h>
#define NUMPIXELS 81
#define RED 16711680
#define YELLOW 16776960
#define GREEN 65280
#define PIZZA_PIN 42
#define PERIOD 420
const byte avtoPins[5] = {2, 3, 4, 5, 6};
int getPixel(int row, int col) {
return row * 9 + col;
}
const uint8_t digits[10][9][9] = {
{ // Цифра 0
{0, 0, 0, 0, 0, 0, 0, 0, 0}, // Отступ
{0, 0, 0, 0, 0, 0, 0, 0, 0}, // Отступ
{0, 1, 1, 1, 0, 0, 0, 0, 0}, // Начало 5x4
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0}, // Конец 5x4
{0, 0, 0, 0, 0, 0, 0, 0, 0}, // Отступ
{0, 0, 0, 0, 0, 0, 0, 0, 0} // Отступ
},
{ // Цифра 1
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{ // Цифра 2
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{ // Цифра 3
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{ // Цифра 4
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{ // Цифра 5
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{ // Цифра 6
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{ // Цифра 7
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{ // Цифра 8
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{ // Цифра 9
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
}
};
const byte man[2][9][9] = {
{ // Ряды: 0 (верхний) до 8 (нижний)
{0, 0, 0, 0, 1, 0, 0, 0, 0}, // Ряд 0: Пусто
{0, 0, 0, 0, 1, 0, 0, 0, 0}, // Ряд 1: Пусто
{0, 0, 0, 1, 1, 1, 0, 0, 0}, // Ряд 2: Голова (1 пиксель)
{0, 0, 1, 0, 1, 0, 1, 0, 0}, // Ряд 3: Шея/Верх тела
{0, 0, 0, 1, 1, 1, 0, 0, 0}, // Ряд 4: Руки/Плечи (T-форма)
{0, 0, 0, 0, 1, 0, 0, 0, 0}, // Ряд 5: Тело/Бедра
{0, 0, 0, 1, 0, 1, 0, 0, 0}, // Ряд 6: Ноги (Прямо)
{0, 0, 0, 1, 0, 1, 0, 0, 0}, // Ряд 7: Ноги
{0, 0, 0, 1, 0, 1, 0, 0, 0} // Ряд 8: Пусто
},
{ // Ряды: 0 (верхний) до 8 (нижний)
{0, 0, 0, 0, 1, 0, 0, 0, 0}, // Ряд 0: Пусто
{0, 0, 0, 0, 1, 0, 0, 0, 0}, // Ряд 1: Пусто
{0, 0, 0, 1, 1, 1, 0, 0, 0}, // Ряд 2: Голова
{0, 0, 1, 0, 1, 0, 1, 0, 0}, // Ряд 3: Руки/Тело (начало диагонали)
{0, 1, 0, 0, 1, 0, 0, 1, 0}, // Ряд 4: Центр тела
{0, 0, 0, 1, 0, 1, 0, 0, 0}, // Ряд 5: Руки/Бедра (продолжение диагонали)
{0, 0, 1, 0, 0, 0, 1, 0, 0}, // Ряд 6: Ноги (первый ряд "X")
{0, 0, 1, 0, 0, 0, 1, 0, 0}, // Ряд 7: Ноги (второй ряд "X")
{0, 1, 0, 0, 0, 0, 0, 1, 0} // Ряд 8: Пусто
}
};
short timerSec = 1000;
uint64_t lTimeSec = 1000;
int timerRedA = 10000;
uint64_t lTimeRedA = 0;
int timerY = 7000;
int timerY2 = 3000;
uint64_t lTimeY = 0;
int timerGA = 7000;
uint64_t lTimeGA = 0;
int timerGMA = 3000;
uint64_t lTimeGMA = 0;
short timerMig = 500;
uint64_t lTimeMig = 0;
short timerPiz = PERIOD;
uint64_t lTimePiz = 0;
bool state = true;
bool first = true;
bool mig = false;
bool yellow = false;
bool pizza = false;
byte mode = 1;
byte max_red = 9;
byte max_green = 12;
byte s = max_red;
byte last_s = s;
byte d = s / 10;
byte e = s % 10;
Adafruit_NeoPixel matrix1(NUMPIXELS, 2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel matrix2(NUMPIXELS, 3, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel matrix3(NUMPIXELS, 4, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel matrix4(NUMPIXELS, 5, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel matrix5(NUMPIXELS, 6, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(9600);
matrix1.begin();
matrix2.begin();
matrix3.begin();
matrix4.begin();
matrix5.begin();
setColor(&matrix1, RED);
lTimeY = millis();
pinMode(PIZZA_PIN, OUTPUT);
}
void loop() {
if(mode == 1) {
if(millis() - lTimeRedA > timerRedA || first) {
first = false;
lTimeRedA = millis();
setColor(&matrix1, RED);
setMan(&matrix5, 1, GREEN);
//setColor(&matrix5, GREEN);
setDigit(&matrix2, d, false, RED);
setDigit(&matrix2, e, true, RED);
setDigit(&matrix4, d, false, GREEN);
setDigit(&matrix4, e, true, GREEN);
state = !state;
if(state) {
mode = 2;
clear(&matrix1);
clear(&matrix2);
clear(&matrix5);
clear(&matrix4);
yellow = false;
s = max_green;
lTimeSec = 0;
timerPiz = PERIOD;
noTone(PIZZA_PIN);
return;
}
}
else if(millis() - lTimeY > timerY) {
clear(&matrix5);
lTimeY = millis();
setColor(&matrix2, YELLOW);
yellow = true;
mig = true;
}
if(millis() - lTimeSec > timerSec) {
lTimeSec = millis();
if(yellow) {
if(s > 8) {setDigit(&matrix2, d, false, YELLOW);}
setDigit(&matrix2, e, true, YELLOW);
}
else {
if(s > 8) {setDigit(&matrix2, d, false, 0);}
setDigit(&matrix2, e, true, 0);
}
d = s / 10;
e = s % 10;
setDigit(&matrix2, d, false, RED);
setDigit(&matrix2, e, true, RED);
if(s > 0) { s--;}
if (!yellow) {
matrix4.clear();
setDigit(&matrix4, d, false, GREEN);
setDigit(&matrix4, e, true, GREEN);
}
}
if(yellow) {
if(millis() - lTimeMig > timerMig) {
lTimeMig = millis();
mig = !mig;
if(mig) {
setMan(&matrix5, 1, GREEN);
//setColor(&matrix5, GREEN);
setDigit(&matrix4, d, false, GREEN);
setDigit(&matrix4, e, true, GREEN);
}
else {
clear(&matrix5);
clear(&matrix4);
}
}
piz_action();
if(!mig) {
noTone(PIZZA_PIN);
}
}
else {
piz_action();
}
}
else if(mode == 2) {
if(millis() - lTimeGA > timerGA) {
lTimeGA = millis();
setColor(&matrix3, GREEN);
setMan(&matrix4, 0, RED);
//setColor(&matrix4, RED);
setDigit(&matrix2, d, false, GREEN);
setDigit(&matrix2, e, true, GREEN);
setDigit(&matrix5, d, false, RED);
setDigit(&matrix5, e, true, RED);
state = !state;
if (state) {
mode = 3;
clear(&matrix3);
clear(&matrix2);
lTimeMig = millis();
mig = false;
return;
}
}
if(millis() - lTimeSec > timerSec) {
lTimeSec = millis();
if(s > 8) {setDigit(&matrix2, d, false, 0);}
setDigit(&matrix2, e, true, 0);
d = s / 10;
e = s % 10;
setDigit(&matrix2, d, false, GREEN);
setDigit(&matrix2, e, true, GREEN);
matrix5.clear();
setDigit(&matrix5, d, false, RED);
setDigit(&matrix5, e, true, RED);
if(s > 0) { s--;}
}
}
else if(mode == 3) {
if(millis() - lTimeGMA > timerGMA) {
lTimeGMA = millis();
state = !state;
if(state) {
mode = 4;
clear(&matrix3);
return;
}
}
if(millis() - lTimeMig > timerMig) {
lTimeMig = millis();
mig = !mig;
if(mig) {
setColor(&matrix3, GREEN);
setDigit(&matrix2, d, false, GREEN);
setDigit(&matrix2, e, true, GREEN);
}
else {
clear(&matrix3);
clear(&matrix2);
}
}
if(millis() - lTimeSec > timerSec) {
lTimeSec = millis();
d = s / 10;
e = s % 10;
matrix5.clear();
setDigit(&matrix5, d, false, RED);
setDigit(&matrix5, e, true, RED);
if(s > 0) { s--;}
}
}
else if(mode == 4) {
if(millis() - lTimeY > timerY2 && mode == 4) {
lTimeY = millis();
setColor(&matrix2, YELLOW);
state = !state;
if (state) {
mode = 1;
clear(&matrix2);
clear(&matrix4);
clear(&matrix5);
lTimeY = millis();
s = max_red;
lTimeSec = 0;
return;
}
}
if(millis() - lTimeSec > timerSec) {
lTimeSec = millis();
d = s / 10;
e = s % 10;
matrix5.clear();
setDigit(&matrix5, d, false, RED);
setDigit(&matrix5, e, true, RED);
if(s > 0) { s--;}
}
}
//Serial.println(mode);
}
void setColor(Adafruit_NeoPixel *matrix, uint32_t color) {
for(byte i {0}; i < NUMPIXELS; i++) {
matrix->setPixelColor(i, color);
}
matrix->show();
}
void setDigit(Adafruit_NeoPixel *matrix, int digit, bool right, uint32_t color) {
for (int r = 0; r < 9; r++) { // Проходим по рядам
for (int c = 0; c < 9; c++) { // Проходим по колонкам
// Проверяем, должен ли пиксель [r][c] быть включен для этой цифры
if (digits[digit][r][c] == 1) {
// Преобразуем 2D [r][c] в 1D индекс пикселя
int pixelIndex = getPixel(r, c);
if (right) {
pixelIndex += 4;
}
// Устанавливаем цвет
matrix->setPixelColor(pixelIndex, color);
}
}
}
matrix->show();
}
void setMan(Adafruit_NeoPixel *matrix, byte state, uint32_t color) {
for (int r = 0; r < 9; r++) { // Проходим по рядам
for (int c = 0; c < 9; c++) { // Проходим по колонкам
// Проверяем, должен ли пиксель [r][c] быть включен для этой цифры
if (man[state][r][c] == 1) {
// Преобразуем 2D [r][c] в 1D индекс пикселя
int pixelIndex = getPixel(r, c);
// Устанавливаем цвет
matrix->setPixelColor(pixelIndex, color);
}
}
}
matrix->show();
}
void clear(Adafruit_NeoPixel *matrix) {
matrix->clear();
matrix->show();
}
void piz_action() {
if(s != last_s) {
timerPiz -= 38;
last_s = s;
}
if (millis() - lTimePiz > timerPiz) {
lTimePiz = millis();
pizza = !pizza;
if(pizza) {
tone(PIZZA_PIN, 750);
} else {
noTone(PIZZA_PIN);
}
}
}