#include <Wire.h>
#include <LiquidCrystal.h>
#define DS1307_ADDRESS 0x68
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
// Arrays for creating segments and customizing numbers
byte segment[8][8] =
{
{ B01111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000 },
{ B11110, B11111, B11111, B11111, B11111, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B11111, B01111 },
{ B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111 },
{ B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11110 },
{ B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11111 },
{ B11111, B00000, B00000, B00000, B00000, B11111, B11111, B11111 }
};
byte zero = 0x00;
int col = 0;
int number, lastMin1, lastMin2, lastHour1, lastHour2;
int myHor = -1;
int myMin = -1;
int myHorOff = -1;
int myMinOff = -1;
void setup()
{
Wire.begin();
// Initializes the LCD
lcd.begin(16, 2);
Serial.begin(115200);
pinMode(A1, OUTPUT);
// Serial.println("Введите нужный час отключения");
// Serial.println("Введите нужное минуту отключения");
// Serial.println("Введите нужное время отключения");
Serial.println("Введите нужное время включения");
while(myHor == -1 && myMin == -1){
if(Serial.available() > 0){
myHor = Serial.parseInt();
myMin = Serial.parseInt();
// Serial.print(myHor);
// Serial.print(myMin);
}
if(myMin != -1 && myMin != 0){
Serial.print("Ваше время включения ");
Serial.print(myHor);
Serial.print(":");
Serial.println(myMin);
break;
}
}
Serial.println("Введите нужное время выключения");
while(myHorOff == -1 && myMinOff == -1){
if(Serial.available() > 0){
myHorOff = Serial.parseInt();
myMinOff = Serial.parseInt();
Serial.print(myHorOff);
Serial.print(myMinOff);
}
if(myMinOff != -1 && myMinOff != 0){
Serial.print("Ваше время отключения ");
Serial.print(myHorOff);
Serial.print(":");
Serial.println(myMinOff);
break;
}
}
// Связывает каждый созданный сегмент с номером
for (byte i = 0; i < 8; i++) {
lcd.createChar(i, segment[i]);
}
}
int q = 0;
void loop()
{
// Извлекает время из DS1307 и показывает его на ЖК-дисплее.
showClock();
delay(1000);
}
byte convertToBCD(byte val) { // Преобразует десятичное число в BCD
return ( (val / 10 * 16) + (val % 10) );
}
byte convertToDecimal(byte val) { // Преобразует из BCD в десятичный
return ( (val / 16 * 10) + (val % 16) );
}
void digit0() // Установите сегменты на номер 0
{
lcd.setCursor(col, 0); // Выберите верхнюю строку
lcd.write((byte)0); // Сегмент 0 выбран
lcd.write(1); // Выбран сегмент 1
lcd.write(2);
lcd.setCursor(col, 1); // Выберите нижнюю строку
lcd.write(3);
lcd.write(4);
lcd.write(5);
}
void digit1() // Установите сегменты на число 1
{
lcd.setCursor(col, 0);
lcd.write(1);
lcd.write(2);
lcd.setCursor(col + 1, 1);
lcd.write(5);
}
void digit2() // Установите сегменты на число 2
{
lcd.setCursor(col, 0);
lcd.write(6);
lcd.write(6);
lcd.write(2);
lcd.setCursor(col, 1);
lcd.write(3);
lcd.write(7);
lcd.write(7);
}
void digit3() // Установите сегменты на число 3
{
lcd.setCursor(col, 0);
lcd.write(6);
lcd.write(6);
lcd.write(2);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(7);
lcd.write(5);
}
void digit4() // Установите сегменты на число 4
{
lcd.setCursor(col, 0);
lcd.write(3);
lcd.write(4);
lcd.write(2);
lcd.setCursor(col + 2, 1);
lcd.write(5);
}
void digit5() // Установите сегменты на число 5
{
lcd.setCursor(col, 0);
lcd.write((byte)0);
lcd.write(6);
lcd.write(6);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(7);
lcd.write(5);
}
void digit6() // Установите сегменты на число 6
{
lcd.setCursor(col, 0);
lcd.write((byte)0);
lcd.write(6);
lcd.write(6);
lcd.setCursor(col, 1);
lcd.write(3);
lcd.write(7);
lcd.write(5);
}
void digit7() // Установите сегменты на число 7
{
lcd.setCursor(col, 0);
lcd.write(1);
lcd.write(1);
lcd.write(2);
lcd.setCursor(col + 1, 1);
lcd.write((byte)0);
}
void digit8() // Установите сегменты на число 8
{
lcd.setCursor(col, 0);
lcd.write((byte)0);
lcd.write((byte)6);
lcd.write(2);
lcd.setCursor(col, 1);
lcd.write(3);
lcd.write(7);
lcd.write(5);
}
void digit9() // Установите сегменты на число 9
{
lcd.setCursor(col, 0);
lcd.write((byte)0);
lcd.write((byte)6);
lcd.write((byte)2);
lcd.setCursor(col + 2, 1);
lcd.write((byte)5);
}
void showDigit() // Показывает число в позиции, определяемой «X»
{
switch (number) {
case 0: digit0();
break;
case 1: digit1();
break;
case 2: digit2();
break;
case 3: digit3();
break;
case 4: digit4();
break;
case 5: digit5();
break;
case 6: digit6();
break;
case 7: digit7();
break;
case 8: digit8();
break;
case 9: digit9();
break;
}
}
int hour(){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int seconds = convertToDecimal(Wire.read());
int hours = convertToDecimal(Wire.read() & 0b111111);
return convertToDecimal(Wire.read());
}
int minute(){
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int seconds = convertToDecimal(Wire.read());
return convertToDecimal(Wire.read());
}
int a = 0;
void showClock()
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int seconds = convertToDecimal(Wire.read());
int minutes = convertToDecimal(Wire.read());
int hours = convertToDecimal(Wire.read() & 0b111111);
int dayWeek = convertToDecimal(Wire.read());
int dayMonth = convertToDecimal(Wire.read());
int month = convertToDecimal(Wire.read());
int year = convertToDecimal(Wire.read());
// char snum[5];
// itoa(year, snum, 10);
if(myHor != -1 && myMin != -1){
if(hour() == myHor){
if(a == 0){
if(minute() == myMin){
Serial.print(hours);
Serial.print(":");
Serial.print(minutes);
Serial.println(" Включили");
digitalWrite(A1,HIGH);
++a;
}
}
}
}
if(myHorOff != -1 && myMinOff != -1){
if(hour() == myHorOff){
if(a == 0){
if(minute() == myMinOff){
Serial.print(hours);
Serial.print(":");
Serial.print(minutes);
Serial.println(" Выключили");
digitalWrite(A1,LOW);
++a;
}
}
}
}
if (seconds & 1) {
lcd.setCursor(8, 0);
lcd.print(".");
lcd.setCursor(8, 1);
lcd.print(".");
} else {
lcd.setCursor(8, 0);
lcd.print(" ");
lcd.setCursor(8, 1);
lcd.print(" ");
}
col = 0;
number = hours / 10;
// Условно, чтобы избежать перекрывающихся символов
if (lastHour1 != minutes % 10) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
lastHour1 = minutes % 10;
}
showDigit(); // Показать настроенный номер на дисплее
col = 4;
number = hours % 10;
if (lastHour2 != minutes % 10) {
lcd.setCursor(4, 0);
lcd.print(" ");
lcd.setCursor(4, 1);
lcd.print(" ");
lastHour2 = minutes % 10;
}
showDigit();
col = 9;
number = minutes / 10;
if (lastMin1 != minutes % 10) {
lcd.setCursor(9, 0);
lcd.print(" ");
lcd.setCursor(9, 1);
lcd.print(" ");
lastMin1 = minutes % 10;
}
showDigit();
col = 13;
number = minutes % 10;
if (lastMin2 != minutes % 10) {
lcd.setCursor(13, 0);
lcd.print(" ");
lcd.setCursor(13, 1);
lcd.print(" ");
lastMin2 = minutes % 10;
}
showDigit();
}