// nastaveni času, hodiny
#include <LiquidCrystal.h>
const int rs = 9, en = 8, d4 = 7, d5 = 6, d6 = 5, d7 = 4;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#include <IRremote.h>
#define PIN_RECEIVER 3 // Signal Pin of IR receiver
IRrecv receiver(PIN_RECEIVER);
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val){ return( (val/10*16) + (val%10) );}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val){return( (val/16*10) + (val%16) );}
//int counter = 0;
byte LT[8] = {0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x1F}; //levý trojúhelník
byte ST[8] = {0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F}; //střed
byte PT[8] = {0x00, 0x00, 0x00, 0x00, 0x18, 0x1C, 0x1E, 0x1F}; //pravý trojúhelník
byte LD[8] = {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x0F, 0x07, 0x03}; //levý dolní
byte PD[8] = {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1E, 0x1C, 0x18}; //pravý dolní
byte PS[8] = {0x1F, 0x1F, 0x1F, 0x1E, 0x1C, 0x18, 0x10, 0x00}; //pravý střed sedmička
byte LP[8] = {0x00, 0x00, 0x00, 0x00, 0x1F, 0x0F, 0x07, 0x03}; //levý dole pětka
byte SC[8] = {0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00}; //stupen_celsia
// int digits;
int x=0; int Desitky =0;int Pom_v=0;int Jednotky=0 ;int _min =0 ;
// Pin 13 je na většině Arduino deskách spojen s LED
int led1 = A0;int led2 = A1;int led3 = A2;int led4 = A3;
void setup()
{
Wire.begin();
Serial.begin(9600);
lcd.begin(20,4); // initializade displeje
receiver.enableIRIn(); // Start the receiver
// DS3231 Vteřiny, minuty, hodiny, day v týdnu, den, měsíc, rok
setDS3231time(00,58,23, 0,30,9,23);//nastaveni vstupnich hodnot
lcd.createChar(1, LT); lcd.createChar(2, ST); lcd.createChar(3, PT); lcd.createChar(4, LD);
lcd.createChar(5, PD); lcd.createChar(6, PS); lcd.createChar(7, LP); lcd.createChar(0, SC);
//lcd.backlight();
lcd.clear();
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year){
// sets time and date data to DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
void readDS3231time(byte *second,byte *minute, byte *hour,
byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read());
}
void displayTime(){
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
//Zobrazení casu
//lcd.setCursor(18, 1);if (hour<10){lcd.print(" ");} lcd.print(hour, DEC);//hodina
//lcd.setCursor(18, 2);if (minute<10){lcd.print("0");} lcd.print(minute, DEC);//minuta
lcd.setCursor(18, 3);if (second<10){lcd.print("0");} lcd.print(second, DEC);//vteřina
Desitky = minute;Desitky = minute / 10 ; //56; 56/10 = 5
Pom_v = Desitky * 10; Jednotky = minute - Pom_v ; //5*10 = 50; 56-50 = 6
printDigits(Desitky, 10);printDigits(Jednotky, 14); //velike minuty
Desitky = hour ; Desitky = hour / 10; //56; 56/10 = 5
Pom_v = Desitky * 10; Jednotky = hour - Pom_v ; //5*10 = 50; 56-50 = 6
printDigits(Desitky, 0);printDigits(Jednotky, 4); //velike hodiny
lcd.setCursor(8, 2);lcd.write(2);lcd.setCursor(8, 3);lcd.write(2);//desetinná tečka
//Zobrazení Datumu
lcd.setCursor(0, 0);
if (dayOfMonth<10){ lcd.print(" ");} lcd.print(dayOfMonth, DEC);//den
lcd.print(".");if (month<10){ lcd.print(" ");} lcd.print(month, DEC);//měsíc
lcd.print(" 20"); lcd.print(year, DEC);//rok
switch(dayOfWeek){
case 1: lcd.setCursor(12, 0);lcd.print("Nedele"); break;
case 2: lcd.setCursor(12, 0);lcd.print("Pondeli"); break;
case 3: lcd.setCursor(12, 0);lcd.print("Utery"); break;
case 4: lcd.setCursor(12, 0);lcd.print("Streda"); break;
case 5: lcd.setCursor(12, 0);lcd.print("Ctvrtek"); break;
case 6: lcd.setCursor(12, 0); lcd.print("Patek"); break;
case 7: lcd.setCursor(12, 0);lcd.print("Sobota"); break;
}
}
void loop() {
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second
// Checks received an IR signal
if (receiver.decode()) {
translateIR();
receiver.resume(); // Receive the next value
}
}
void cislo0(int x){ //veliká čísla, X -pozice na displeji
lcd.setCursor(x, 1);lcd.write(1); lcd.write(2); lcd.write(3);
lcd.setCursor(x, 2);lcd.print((char)255); lcd.print((char)16);; lcd.print((char)255);
lcd.setCursor(x, 3);lcd.write(4); lcd.write(2); ; lcd.write(5);}
void cislo1(int x){
lcd.setCursor(x, 1);lcd.write(1); lcd.write(2); lcd.print(" ");
lcd.setCursor(x, 2);lcd.print(" "); lcd.print((char)255); lcd.print(" ");
lcd.setCursor(x, 3);lcd.write(2); lcd.print((char)255); lcd.write(2);}
void cislo2(int x){
lcd.setCursor(x, 1);lcd.write(1); lcd.write(2); lcd.write(3);
lcd.setCursor(x, 2);lcd.write(1); lcd.write(2); lcd.write(5);
lcd.setCursor(x, 3);lcd.print((char)255); lcd.write(2); lcd.write(2);}
void cislo3(int x){
lcd.setCursor(x, 1);lcd.write(1); lcd.write(2); lcd.write(3);
lcd.setCursor(x, 2);lcd.print((char)16); lcd.write(2); lcd.print((char)255);
lcd.setCursor(x, 3);lcd.write(7); lcd.write(2); lcd.write(5);}
void cislo4(int x){
lcd.setCursor(x, 1);lcd.write(1); lcd.print((char)16); lcd.write(2);
lcd.setCursor(x, 2);lcd.print((char)255); lcd.write(2); lcd.print((char)255);
lcd.setCursor(x, 3);lcd.print((char)16); lcd.print((char)16); lcd.print((char)255);}
void cislo5(int x){
lcd.setCursor(x, 1);lcd.write(2); lcd.write(2); lcd.write(2);
lcd.setCursor(x, 2);lcd.print((char)255); lcd.write(2); lcd.write(3);
lcd.setCursor(x, 3);lcd.write(7); lcd.write(2); lcd.write(5);}
void cislo6(int x){
lcd.setCursor(x, 1);lcd.write(1); lcd.write(2); lcd.write(3);
lcd.setCursor(x, 2);lcd.print((char)255); lcd.write(2); lcd.write(3);
lcd.setCursor(x, 3);lcd.write(4); lcd.write(2); lcd.write(5);}
void cislo7(int x){
lcd.setCursor(x, 1);lcd.write(2); lcd.write(2); lcd.write(2);
lcd.setCursor(x, 2);lcd.print((char)16); lcd.write(1); lcd.write(6);
lcd.setCursor(x, 3);lcd.print((char)16); lcd.print((char)255); lcd.print((char)16);}
void cislo8(int x){
lcd.setCursor(x, 1);lcd.write(1); lcd.write(2); lcd.write(3);
lcd.setCursor(x, 2);lcd.print((char)255); lcd.write(2); lcd.print((char)255);
lcd.setCursor(x, 3);lcd.write(4); lcd.write(2); lcd.write(5);}
void cislo9(int x){
lcd.setCursor(x, 1);lcd.write(1); lcd.write(2); lcd.write(3);
lcd.setCursor(x, 2);lcd.write(4); lcd.write(2); lcd.print((char)255);
lcd.setCursor(x, 3);lcd.write(7); lcd.write(2); lcd.write(5);}
void printDigits(int digits, int x){
switch (digits) {
case 0: cislo0(x); break; case 1: cislo1(x); break;
case 2: cislo2(x); break; case 3: cislo3(x); break;
case 4: cislo4(x); break; case 5: cislo5(x); break;
case 6: cislo6(x); break; case 7: cislo7(x); break;
case 8: cislo8(x); break; case 9: cislo9(x); break;}
}
void translateIR()
{
lcd.setCursor(0, 2);
// Takes command based on IR code received
switch (receiver.decodedIRData.command) {
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
case 162: lcd.print("POWER");
digitalWrite(led1, LOW); // vypnuti LED
digitalWrite(led2, LOW); // vypnuti LED
digitalWrite(led3, LOW); // vypnuti LED
digitalWrite(led4, LOW); // vypnuti LED
break;
case 226: lcd.print("MENU"); break;
case 34: lcd.print("TEST"); break;
case 2: lcd.print("PLUS"); break;
case 194: lcd.print("BACK"); break;
case 224: lcd.print("PREV."); break;
case 168: lcd.print("PLAY"); break;
case 144: lcd.print("NEXT"); break;
case 104: lcd.print("num: 0");
digitalWrite(led1, HIGH); //zapnutí led
break;
case 152: lcd.print("MINUS"); break;
case 176: lcd.print("key: C"); break;
case 48: lcd.print("num: 1");
digitalWrite(led2, HIGH); //zapnutí led
break;
case 24: lcd.print("num: 2");
digitalWrite(led3, HIGH); //zapnutí led
break;
case 122: lcd.print("num: 3");
digitalWrite(led4, HIGH); //zapnutí led
break;
case 16: //klávesnice 4 - nastavení dne
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//načte aktuální hodnoty
dayOfMonth = dayOfMonth + 1; if (dayOfMonth > 31) {
dayOfMonth = 1;
}
setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
break;
case 56: //klávesnice 5 - nastavení mesíce
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//načte aktuální hodnoty
month = month + 1; if (month > 12) {
month = 1;
}
setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
break;
case 90: //klávesnice 6 - nastavení roku
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//načte aktuální hodnoty
year = year + 1; if (year > 99) {
year = 23;
}
setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
break;
case 66: //klávesnice 7 - nastavení hodin
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//načte aktuální hodnoty
hour = hour + 1; if (hour > 23) {
hour = 0;
}
setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
break;
case 74: //klávesnice 8 - nastavení minut
// byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//načte aktuální hodnoty
minute = minute + 1; if (minute > 59) {
minute = 0;
}
lcd.setCursor(10, 2); lcd.print(" ");
lcd.setCursor(10, 2); lcd.print(minute);
setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
break;
case 82: //klávesnice 9 - nastavení vteřin
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);//načte aktuální hodnoty
second = 0; setDS3231time(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
break;
default:
lcd.clear();
// lcd.print(receiver.decodedIRData.command);
// lcd.print(" other button");
}
}