#include <GyverEncoder.h>
#define LED 3
#define INDYKATOR_1 10
#define INDYKATOR_2 11
#define INDYKATOR_3 12
#define DP 13
//--------------------
#define BTN_Boom 2
//--------------------
#define A 6
#define B 5
#define C A2
#define D A1
#define F 7
#define G 8
#define E A0
#define CLK A5
#define DT A4
#define SW A3
Encoder enc(CLK, DT, SW);
int ryba = 0;
bool IsPositive = false;
bool DigitalTemplate [12] [8] = {
// A B C D F G E DP
{0, 0, 0, 0, 0, 1, 0, 1}, // 0 DigitalTemplate [0] [0] = 0
{1, 0, 0, 1, 1, 1, 1, 1}, // 1
{0, 0, 1, 0, 1, 0, 0, 1}, // 2
{0, 0, 0, 0, 1, 0, 1, 1}, // 3
{1, 0, 0, 1, 0, 0, 1, 1}, // 4
{0, 1, 0, 0, 0, 0, 1, 1}, // 5
{0, 1, 0, 0, 0, 0, 0, 1}, // 6
{0, 0, 0, 1, 1, 1, 1, 1}, // 7
{0, 0, 0, 0, 0, 0, 0, 1}, // 8
{0, 0, 0, 0, 0, 0, 1, 1}, // 9
{1, 0, 0, 1, 0, 0, 0, 1}, // Н - негативне
{0, 0, 0, 1, 0, 1, 0, 1} // П - позитивне
};
void PrintMode ();
void setup() {
// put your setup code here, to run once:
pinMode(INDYKATOR_1, OUTPUT);
pinMode(INDYKATOR_2, OUTPUT);
pinMode(INDYKATOR_3, OUTPUT);
pinMode(DP, OUTPUT);
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(E, OUTPUT);
pinMode(BTN_Boom, INPUT_PULLUP);
pinMode(LED, OUTPUT);
enc.setType(TYPE2);
//attachInterrupt(digitalPinToInterrupt(StartStop), toggleTimer, HIGH);
}
void number(int timer) {
int num_1 = timer / 100 ;
int num_2 = timer / 10 % 10 ;
int num_3 = timer % 10 ;
digitalWrite(INDYKATOR_3, LOW);
digitalWrite(INDYKATOR_2, LOW);
digitalWrite(INDYKATOR_1, LOW);
digitalWrite(A, DigitalTemplate [num_1] [0] ? HIGH : LOW );
digitalWrite(B, DigitalTemplate [num_1] [1] ? HIGH : LOW );
digitalWrite(C, DigitalTemplate [num_1] [2] ? HIGH : LOW );
digitalWrite(D, DigitalTemplate [num_1] [3] ? HIGH : LOW );
digitalWrite(F, DigitalTemplate [num_1] [4] ? HIGH : LOW );
digitalWrite(G, DigitalTemplate [num_1] [5] ? HIGH : LOW );
digitalWrite(E, DigitalTemplate [num_1] [6] ? HIGH : LOW );
digitalWrite(DP, DigitalTemplate [num_1] [7] ? HIGH : LOW );
if (num_1 > 0) {
digitalWrite(INDYKATOR_3, HIGH);
}
digitalWrite(INDYKATOR_3, LOW);
digitalWrite(A, DigitalTemplate [num_2] [0] ? HIGH : LOW );
digitalWrite(B, DigitalTemplate [num_2] [1] ? HIGH : LOW );
digitalWrite(C, DigitalTemplate [num_2] [2] ? HIGH : LOW );
digitalWrite(D, DigitalTemplate [num_2] [3] ? HIGH : LOW );
digitalWrite(F, DigitalTemplate [num_2] [4] ? HIGH : LOW );
digitalWrite(G, DigitalTemplate [num_2] [5] ? HIGH : LOW );
digitalWrite(E, DigitalTemplate [num_2] [6] ? HIGH : LOW );
digitalWrite(DP, DigitalTemplate [num_2] [7] ? HIGH : LOW );
if (timer > 9) {
digitalWrite(INDYKATOR_2, HIGH); //
}
digitalWrite(INDYKATOR_2, LOW);
digitalWrite(A, DigitalTemplate [num_3] [0] ? HIGH : LOW );
digitalWrite(B, DigitalTemplate [num_3] [1] ? HIGH : LOW );
digitalWrite(C, DigitalTemplate [num_3] [2] ? HIGH : LOW );
digitalWrite(D, DigitalTemplate [num_3] [3] ? HIGH : LOW );
digitalWrite(F, DigitalTemplate [num_3] [4] ? HIGH : LOW );
digitalWrite(G, DigitalTemplate [num_3] [5] ? HIGH : LOW );
digitalWrite(E, DigitalTemplate [num_3] [6] ? HIGH : LOW );
digitalWrite(DP, DigitalTemplate [num_3] [7] ? HIGH : LOW );
digitalWrite(INDYKATOR_1, HIGH);
digitalWrite(INDYKATOR_1, LOW);
}
void Enko_fun1() {
if (enc.isRight()) {
ryba++;
}
if (enc.isLeft()) {
ryba--;
}
if (ryba > 999) {
ryba = 0;
}
if (ryba < 0) {
ryba = 999;
}
}
void Enko_fun2() {
enc.tick();
unsigned long last = millis();
if (enc.isHold()) {
while (millis() - last <= 2000) {
PrintMode();
}
} enc.tick();
if (enc.isHold()) {
IsPositive = !IsPositive;
while (millis() - last <= 4000) {
PrintMode();
}
}
}
void PrintMode () {
if (IsPositive == false) {
digitalWrite(A, DigitalTemplate [10] [0] ? HIGH : LOW );
digitalWrite(B, DigitalTemplate [10] [1] ? HIGH : LOW );
digitalWrite(C, DigitalTemplate [10] [2] ? HIGH : LOW );
digitalWrite(D, DigitalTemplate [10] [3] ? HIGH : LOW );
digitalWrite(F, DigitalTemplate [10] [4] ? HIGH : LOW );
digitalWrite(G, DigitalTemplate [10] [5] ? HIGH : LOW );
digitalWrite(E, DigitalTemplate [10] [6] ? HIGH : LOW );
digitalWrite(DP, DigitalTemplate [10] [7] ? HIGH : LOW );
digitalWrite(INDYKATOR_3, LOW);
digitalWrite(INDYKATOR_2, HIGH);
digitalWrite(INDYKATOR_1, LOW);
}
if (IsPositive == true) {
digitalWrite(A, DigitalTemplate [11] [0] ? HIGH : LOW );
digitalWrite(B, DigitalTemplate [11] [1] ? HIGH : LOW );
digitalWrite(C, DigitalTemplate [11] [2] ? HIGH : LOW );
digitalWrite(D, DigitalTemplate [11] [3] ? HIGH : LOW );
digitalWrite(F, DigitalTemplate [11] [4] ? HIGH : LOW );
digitalWrite(G, DigitalTemplate [11] [5] ? HIGH : LOW );
digitalWrite(E, DigitalTemplate [11] [6] ? HIGH : LOW );
digitalWrite(DP, DigitalTemplate [11] [7] ? HIGH : LOW );
digitalWrite(INDYKATOR_3, LOW);
digitalWrite(INDYKATOR_2, HIGH);
digitalWrite(INDYKATOR_1, LOW);
}
digitalWrite(INDYKATOR_3, LOW);
digitalWrite(INDYKATOR_2, LOW);
digitalWrite(INDYKATOR_1, LOW);
}
void TimerBomb( ) {
if (digitalRead(BTN_Boom) == LOW ) {
digitalWrite(3, HIGH);
if (IsPositive == false) {
for ( int timer = ryba ; timer > -1 ; timer --) {
unsigned long last = millis();
while (millis() - last <= 1000) {
number(timer);
}
}
} else {
for (int timer = 0; timer <= ryba; timer++) {
unsigned long last = millis();
while (millis() - last <= 1000) {
number(timer);
}
}
}
digitalWrite(3, LOW);
}
}
void loop() {
// put your main code here, to run repeatedly:
TimerBomb();
number(ryba);
enc.tick();
if (enc.isTurn()) {
Enko_fun1 ();
}
enc.tick();
if (enc.isHolded()) {
Enko_fun2();
}
}
/* SKLAD---------------------------------------------------------------------------------
пофіксити баг відлік від 2 і 1 баг в тому шо зациклює таймер при будь якому значині
enc.isRight()
enc.isLeft()
millis();
now - lastPrint >= printInterval
const unsigned long printInterval = 500; // друкувати кожні 500 ms
enc.isHold()
#include <avr/eeprom.h>
eeprom_update_block((void*)&timer, 0, sizeof(timer));
eeprom_read_block((void*)&timer, 0, sizeof(timer));
if(enc.isHold()){
digitalWrite(INDYKATOR_3, HIGH);
digitalWrite(INDYKATOR_2, LOW);
digitalWrite(INDYKATOR_1, HIGH);
digitalWrite(A, DigitalTemplate [num_1] [0] ? HIGH : LOW );
digitalWrite(B, DigitalTemplate [num_1] [1] ? HIGH : LOW );
digitalWrite(C, DigitalTemplate [num_1] [2] ? HIGH : LOW );
digitalWrite(D, DigitalTemplate [num_1] [3] ? HIGH : LOW );
digitalWrite(F, DigitalTemplate [num_1] [4] ? HIGH : LOW );
digitalWrite(G, DigitalTemplate [num_1] [5] ? HIGH : LOW );
digitalWrite(E, DigitalTemplate [num_1] [6] ? HIGH : LOW );
digitalWrite(DP,DigitalTemplate [num_1] [7] ? HIGH : LOW );
}
*/