#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
//#include <LiquidCrystal_I2C.h>
#define VERSION " QDrum_Screen v0.31"
#define TEST_BUTTON
#define SERIAL_LISTNER_ON
//#define LOG_ON
#ifdef TEST_BUTTON
#define PIN_TEST_BUTTON 13
#define PIN_TEST_SIGNAL 4
#define LENGHT_TEST_SIGNAL 10
bool isButtonWasPressed = false;
#endif
// PIN SET
#define PIN_SCREEN_MATRIX 3
#define PIN_INPUT_TO_PLAY 2
// SIGNAL SET
#define LENGHT_SIGNAL_TO_PLAY 5 //ms
// SCREEN SIZE
#define X_SIZE 13 // 13
#define Y_SIZE 10 // 29
// ANIMATION 1 FRAME
#define LENGHT_ANIMATION 2000
#define K_SMOOTH 0.85
#define FPS_ANIMATION 30
#define DEFAULT_TYPE_ANIMATION 3
#define COLOR_FRAME_R 255
#define COLOR_FRAME_G 255
#define COLOR_FRAME_B 255
// ANIMATION 2 FLAG
#define COLOR_FLAG_1_R 255
#define COLOR_FLAG_1_G 255
#define COLOR_FLAG_1_B 255
#define COLOR_FLAG_2_R 0
#define COLOR_FLAG_2_G 0
#define COLOR_FLAG_2_B 255
#define COLOR_FLAG_3_R 0
#define COLOR_FLAG_3_G 255
#define COLOR_FLAG_3_B 0
struct Color
{
uint8_t r;
uint8_t g;
uint8_t b;
};
//ANIMATION 1 CONFIG
Color colorFrame;
float kFrame = K_SMOOTH;
//ANIMATION 2 CONFIG
Color colorsRusFlag[3];
float kFlag = K_SMOOTH;
//SCREEN CONFIG
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(X_SIZE, Y_SIZE, PIN_SCREEN_MATRIX,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
NEO_RGB + NEO_KHZ800);
uint8_t typeAnimation = DEFAULT_TYPE_ANIMATION; // 1 - Frame, 2 - Fire
struct ScreenConfig {
uint8_t typeAnimation;
};
ScreenConfig screenConfig;
//LISTNER
uint8_t conditionOfAnimation = 0; // 0 - stop; 1 - start; 2 - continue
//Timers
uint64_t timerCheckSignal = millis();
uint64_t timerAnimationLenght = timerCheckSignal;
uint64_t timerAnimationFPS = timerCheckSignal;
uint64_t timerTestSignal = timerCheckSignal;
uint64_t timerSerialRead = timerCheckSignal;
//LCD
// LiquidCrystal_I2C lcd(0x27, 16, 4);
void setup() {
Serial.begin(9600);
pinMode(PIN_INPUT_TO_PLAY, INPUT);
//animationInitialisation();
SetupMatrix();
#ifdef TEST_BUTTON
pinMode(PIN_TEST_BUTTON, INPUT);
pinMode(PIN_TEST_SIGNAL, OUTPUT);
#endif
}
void loop() {
#ifdef TEST_BUTTON
buttonListner();
#endif
#ifdef SERIAL_LISTNER_ON
if ( (millis() - timerSerialRead) > 1000){
timerSerialRead = millis();
if(Serial.available())
{
if (Serial.readBytes((byte*)&screenConfig, sizeof(screenConfig)))
{
typeAnimation = screenConfig.typeAnimation;
animationInitialisation();
}
}
}
#endif
listner();
loopAnimation();
}
#ifdef TEST_BUTTON
void buttonListner()
{
if(!isButtonWasPressed)
{
if(digitalRead(PIN_TEST_BUTTON))
{
logSerialPrintln("Button pressed");
logSerialPrintln("Signal High");
digitalWrite(PIN_TEST_SIGNAL, HIGH);
timerTestSignal = millis();
isButtonWasPressed = true;
}
}
else
{
if(!digitalRead(PIN_TEST_BUTTON))
{
logSerialPrintln("Button unpressed");
isButtonWasPressed = false;
}
}
if( (millis()-timerTestSignal) > LENGHT_TEST_SIGNAL)
{
digitalWrite(PIN_TEST_SIGNAL, LOW);
logSerialPrintln("Signal Low");
}
}
#endif
void listner()
{
if(digitalRead(PIN_INPUT_TO_PLAY))
{
delay(LENGHT_SIGNAL_TO_PLAY);
if(digitalRead(PIN_INPUT_TO_PLAY))
{
logSerialPrintln("HAVE A SIGNAL TO PLAY!!!");
timerCheckSignal = millis();
conditionOfAnimation = 1;
}
}
}
void logSerialPrintln(String s)
{
#ifdef LOG_ON
Serial.println(s);
#endif
}