Κώδικας:
//==========================================
#include <TimerOne.h> //Βιβλιοθήκη διαχείρησης TIMER1
#include <MsTimer2.h> //Βιβλιοθήκη διαχείρησης TIMER2
#include <Wire.h> //Βιβλιοθήκη διαχείρησης σειριακής πόρτας
#include <RTClib.h> //Βιβλιοθήκη διαχείρησης RTC
#include "defines.h"
//==========================================
RTC_DS1307 rtc; //Ορισμός κλάσσης RTC
//==========================================
//SETUP
//==========================================
void setup()
{
Wire.begin();
Serial.begin(9600);
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
Timer1.initialize(500000); //Αρχικοποίησε Timer1 στα 0.5sec διακοπές
Timer1.attachInterrupt(blinkLED); //Ενεργοποίησε τη ρουτίνα διακοπής blinkLED();
MsTimer2::set(250, timer2Isr); //Αρχικοποίησε Timer2 στα 0.25sec διακοπές
MsTimer2::start(); //Ενεργοποίησε τη ρουτίνα διακοπής timer2Isr();
pinMode(LED_BUILTIN, OUTPUT); //Όρισε το LED του Arduino σαν έξοδο
digitalWrite(LED_BUILTIN, state); //Δώσε έξοδο στο pin D13 ανάλογα με την boolean state
pinMode(BUTTONS_PIN, INPUT_PULLUP); //Όρισε το pin A3 σαν αναλογική είσοδο για διάβασμα μπουτόν
for (int y = 0; y < 7; y++) //Ρουτίνα αρχικοποίησης των τμημάτων των LED displays σαν έξοδοι
{
pinMode(DIGITS[y], OUTPUT);
}
for (int x = 0; x < 8; x++) //Ρουτίνα αρχικοποίησης των ανόδων τωνLED displays σαν έξοδοι
{
pinMode(SEGMENTS[x], OUTPUT);
}
menu = 0; //Όρισε σαν αρχικό μενού 0 την ένδειξη ώρας
}
//==========================================
//MAIN LOOP
//==========================================
void loop()
{
readRTC(); //Ρουτίνα ανάγμωσης του RTC
navigate(); //Πλοήγηση στα μενού
}
//==========================================
//ΡΙΝΤ ΤΙΜΕ
//==========================================
void printTime() //Ρουτίνα διαχείρισης πληροφορίας ώρας και ημερομηνίας
{ //ανά καταχωρητή ώρας, λεπτού, δευτερολέπτου, ημέρας, μήνα και έτους
printDigit(setHourTemp / 10, hoursTenths); //Διαίρεση δια 10 για να πάρεις τις δεκάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit(setHourTemp % 10, hoursUnits); //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit(setMinuteTemp / 10, minutesTenths); //Διαίρεση δια 10 για να πάρεις τις δεκάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit(setMinuteTemp % 10, minutesUnits); //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit(setSecondTemp / 10, secondsTenths); //Διαίρεση δια 10 για να πάρεις τις δεκάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit(setSecondTemp % 10, secondsUnits); //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
}
//==========================================
void printDate()
{
printDigit((setYearTemp - 2000) / 10, yearsTenths); //Διαίρεση δια 10 για να πάρεις τις δεκάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit((setYearTemp - 2000) % 10, yearsUnits); //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit(setMonthTemp / 10, monthsTenths); //Διαίρεση δια 10 για να πάρεις τις δεκάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit(setMonthTemp % 10, monthsUnits); //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit(setDateTemp / 10, daysTenths); //Διαίρεση δια 10 για να πάρεις τις δεκάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
printDigit(setDateTemp % 10, daysUnits); //Διαίρεση με modulo 10 για να πάρεις τις μονάδες
delay(del_2); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
}
//==========================================
void printDigit(int number, int position) //Ρουτίνα διαχείρησης 'ενδειξης στα 7 segments
{
for (int j = 0; j < 7; j++) //Απαριθμητής για 7 επαναλήψεις
{
digitalWrite(SEGMENTS[j], num_array[number][j]); //Γράψε στα OUTPUTS των 7 segments τα δεδομένα των πινάκων SEGMENTS, num_array[number]
delay(scTime); //Καθυστέρηση απαραίτητη για να δείχνει σωστά
}
for (int y = 0; y < 6; y++) //Γράψε στα OUTPUTS των ΑΝΟΔΩΝ κάθε ψηφίου τα δεδομένα των πινάκων DIGITS, digits_array
{
digitalWrite(DIGITS[y], digits_array[position][y]);
}
}
//==========================================
//ΡΟΥΤΙΝΑ ΕΞΥΠΗΡΕΤΗΣΗΣ ΔΙΑΚΟΠΗΣ ΤΙΜΕR2
//==========================================
void timer2Isr(void)
{
readButtons(); //Διάβασε τα μπουτόν ανά 250ms
}
//==========================================
//ΡΟΥΤΙΝΑ ΕΞΥΠΗΡΕΤΗΣΗΣ ΔΙΑΚΟΠΗΣ ΤΙΜΕR1
//==========================================
void blinkLED(void)
{
cli(); //Απενεργοποίησε τις διακοπές
returningCounter++; //Αύξησε κατά 1 τον απαριθμητή που κρατάει το χρόνο επιστροφής στο αρχικό μενου
state = !state; //Εναλλαγή κατάστασης ανα 500ms για το αναβόσβημα των τελείων
digitalWrite(LED_BUILTIN, state); //Άναψε ή σβήσε τα LED των δευτερολέπτων
sei(); //Ενεργοποίησε τις διακοπές
}
//==========================================
// !!!!!!!! ΤΕΛΟΣ ΚΩΔΙΚΑ !!!!!!!!!!!!!
//==========================================
Κώδικας:
#define segA 12 //Όρισε το pin D12 σαν segment A
#define segB 11 //Όρισε το pin D11 σαν segment B
#define segC 10 //Όρισε το pin D9 σαν segment C
#define segD 9 //Όρισε το pin D8 σαν segment D
#define segE 8 //Όρισε το pin D7 σαν segment E
#define segF 7 //Όρισε το pin D6 σαν segment F
#define segG 6 //Όρισε το pin D5 σαν segment G
#define UP 1 //Όρισε το μπουτόν ΠΑΝΩ σαν τιμή 1
#define MIDDLE 2 //Όρισε το μπουτόν ΜΕΣΣΑΙΟ σαν τιμή 2
#define DOWN 3 //Όρισε το μπουτόν ΚΑΤΩ σαν τιμή 3
#define NONE 0 //Όρισε το μπουτόν ΚΑΝΕΝΑ σαν τιμή 0
#define hoursTenths 0
#define hoursUnits 1
#define minutesTenths 2
#define minutesUnits 3
#define secondsTenths 4
#define secondsUnits 5
#define daysTenths 0
#define daysUnits 1
#define monthsTenths 2
#define monthsUnits 3
#define yearsTenths 4
#define yearsUnits 5
#define del_1 50 //Καθυστέρηση 50ms
#define del_2 3 //Καθυστέρηση 3ms
#define scTime 0 //Καθυστέρηση 0ms
#define returningDelay 15 //Καθυστέρηση 15ms
//==========================================
int DIG1 = 15; //Όρισε το pin D15/A1 σαν ψηφίο δεκάδων ωρών
int DIG2 = 14; //Όρισε το pin D14/A0 σαν ψηφίο μονάδων ωρών
int DIG3 = 2; //Όρισε το pin D2 σαν ψηφίο δεκάδων λεπτών
int DIG4 = 3; //Όρισε το pin D3 σαν ψηφίο μονάδων λεπτών
int DIG5 = 4; //Όρισε το pin D4 σαν ψηφίο δεκάδων δευτερολέπτων
int DIG6 = 5; //Όρισε το pin D5 σαν ψηφίο μονάδων δευτερολέπτων
const int BUTTONS_PIN = PIN_A3; //Όρισε το pin D5 σαν αναλογική είσοδο ανάγνωσης μπουτόν
int old_button = 0;
int pressed_button = 0;
int button, button2;
int i, sum;
int val;
int scanningTime = 0;
int returningCounter = 0;
int menu = 1;
boolean state = false;
boolean dateState = false;
int counterDate = 0;
unsigned int second = 0;
unsigned int minute = 0;
long hour = 0;
long date = 0;
unsigned int month = 0;
unsigned int year = 0;
//==========================================
byte DIGITS[6] = {DIG1, DIG2, DIG3, DIG4, DIG5, DIG6};
byte SEGMENTS[8] = {segA, segB, segC, segD, segE, segF, segG};
int num_array[11][7] = {{ 1, 1, 1, 1, 1, 1, 0 }, // 0
{ 0, 1, 1, 0, 0, 0, 0 }, // 1
{ 1, 1, 0, 1, 1, 0, 1 }, // 2
{ 1, 1, 1, 1, 0, 0, 1 }, // 3
{ 0, 1, 1, 0, 0, 1, 1 }, // 4
{ 1, 0, 1, 1, 0, 1, 1 }, // 5
{ 1, 0, 1, 1, 1, 1, 1 }, // 6
{ 1, 1, 1, 0, 0, 0, 0 }, // 7
{ 1, 1, 1, 1, 1, 1, 1 }, // 8
{ 1, 1, 1, 0, 0, 1, 1 }, // 9
{ 0, 0, 0, 0, 0, 0, 0 }
}; //blank
int digits_array[7][6] = {{0, 1, 1, 1, 1, 1},
{1, 0, 1, 1, 1, 1},
{1, 1, 0, 1, 1, 1},
{1, 1, 1, 0, 1, 1},
{1, 1, 1, 1, 0, 1},
{1, 1, 1, 1, 1, 0}
};
//==========================================
uint16_t setYearTemp;
int setMonthTemp;
int setDateTemp;
int setHourTemp;
int setMinuteTemp;
int setSecondTemp;