#include <TM1637.h>
#include <EEPROM.h>
#define ENCODER1_SW 4
#define ENCODER1_OUTA 2
#define ENCODER1_OUTB 6
#define ENCODER2_SW 10
#define ENCODER2_OUTA 3
#define ENCODER2_OUTB 7
#define DISPLAY_CLK 8
#define DISPLAY_DIO 9
#define dBounceDelay 100
uint64_t lastCalled4 = 0;
uint64_t lastCalled10 = 0;
uint64_t lastPressed = 0;
int8_t digitvalue = 0;
int8_t digitPos = 4;
int8_t number[4] = {0,0,0,0};
bool blinkEn = true;
uint8_t brightness = 5;
bool brightnessChangeEn = false;
uint8_t eepromAddr = 0;
TM1637 tm(DISPLAY_CLK, DISPLAY_DIO);
void saveFlightNumber(){
// Writing array to EEPROM
for (int i = 0; i < sizeof(number) / sizeof(number[0]); i++) {
EEPROM.put(i * sizeof(int), number[i]);
}
Serial.println("Saved data successfully");
}
void getFlightNumber(){
for (int i = 0; i < sizeof(number) / sizeof(number[0]); i++) {
EEPROM.get(i * sizeof(int), number[i]);
Serial.println(number[i]);
}
Serial.println("Get data successfully");
}
ISR (PCINT2_vect)
{
if(millis() - lastCalled4 > dBounceDelay){
if (digitalRead(ENCODER1_SW) == 0){
//Serial.println("Button pressed");
digitPos++;
if(digitPos > 4){
digitPos = 0;
}
if(digitPos != 4){
tm.display(digitPos,'.');
}
// Serial.print("Digit Position: ");
// Serial.println(digitPos);
tm.display(digitPos-1,number[digitPos-1]);
blinkEn = false;
}
//delay(100);
lastCalled4 = millis();
lastPressed = lastCalled4;
}
}
ISR (PCINT0_vect)
{
if(millis() - lastCalled10 > dBounceDelay){
if (digitalRead(ENCODER2_SW) == 0){
if(brightnessChangeEn){
brightnessChangeEn= false;
}
else{
brightnessChangeEn= true;
}
}
lastCalled10 = millis();
}
}
void rotorISR1(){
if(digitalRead(ENCODER1_OUTA) != digitalRead(ENCODER1_OUTB)){
//digitvalue++;
number[digitPos]++;
if(number[digitPos] > 9){
number[digitPos] = 0;
}
}
else{
number[digitPos]--;
if(number[digitPos] < 0){
number[digitPos] = 9;
}
}
Serial.print("Digit Value: ");
Serial.println(digitvalue);
tm.display(digitPos, number[digitPos]);
lastPressed = millis();
}
void rotorISR2(){
if(brightnessChangeEn){
if(digitalRead(ENCODER2_OUTA) != digitalRead(ENCODER2_OUTB)){
if(brightness < 7){
brightness++;
}
}
else{
if(brightness > 0){
brightness--;
}
}
}
Serial.print("Brightness: ");
Serial.println(brightness);
tm.set(brightness);
}
void setup(){
Serial.begin(115200);
Serial.println("Start");
pinMode(ENCODER1_SW, INPUT_PULLUP);
pinMode(ENCODER2_SW, INPUT_PULLUP);
PCICR |= 0b00000101; // Enable PCIE2 for PORTD (which includes Pin 4)
PCMSK2 |= 0b00010000; // Enable interrupt for Pin 4 (PD4)
PCMSK0 |= 0b00000100; // Enable interrupt for Pin 4 (PD4)
attachInterrupt(digitalPinToInterrupt(ENCODER1_OUTA), rotorISR1, RISING);
attachInterrupt(digitalPinToInterrupt(ENCODER2_OUTA), rotorISR2, RISING);
tm.init();
tm.set(brightness);
getFlightNumber();
for(int i=0;i<4;i++){
tm.display(i,number[i]);
}
}
void loop(){
tm.display(digitPos,number[digitPos]);
delay(1000);
//Serial.println(digitPos);
if(blinkEn){
tm.display(digitPos,'.');
delay(1000);
}
else{
blinkEn = true;
}
if(millis() - lastPressed > 5000){
tm.display(digitPos,number[digitPos]);
digitPos = 4;
saveFlightNumber();
}
}