#define RX 2
#define TX 3
#define time_offset 21600 // смещение от UTC 1 час = 3600
#define KORR_T 2.5
#include <Wire.h>
#include <4x14LED.h> // http://rcl-radio.ru/wp-content/uploads/2021/09/4x14LED.zip
#include <EEPROM.h>
#include <TinyGPS++.h> // https://github.com/mikalhart/TinyGPSPlus/archive/refs/heads/master.zip
#include <TimeLib.h> // https://github.com/PaulStoffregen/Time/archive/master.zip
#include <SoftwareSerial.h>
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
TinyGPSPlus gps;
SoftwareSerial SoftSerial(TX,RX);
HT4x14LED led;
OneWire ds(5); // Вход датчика 18b20
unsigned long times;
byte last_second, Second, Minute, Hour, Day, Month;
int Year;
int timer;
void setup() {
Wire.begin();
SoftSerial.begin(9600);
Serial.begin(9600);
led.init(1);
led.brig(5);//0...15
led.blink(1);
led.clear();
analogReadResolution(4);// АЦП 4 БИТ
pinMode(A0,INPUT_PULLUP); // INPUT AUDIO
Serial.println("SERIAL OK");
}
void loop() {
led.brig(15-analogRead(A0));
while (SoftSerial.available() > 0){
if (gps.encode(SoftSerial.read())){
if (gps.time.isValid()){
Minute = gps.time.minute();
Second = gps.time.second();
Hour = gps.time.hour();
Serial.println("UTC");
Serial.print(Hour);Serial.print(":");
Serial.print(Minute);Serial.print(":");
Serial.println(Second);
}
if (gps.date.isValid()){
Day = gps.date.day();
Month = gps.date.month();
Year = gps.date.year();
Serial.print(Day);Serial.print("-");
Serial.print(Month);Serial.print("-");
Serial.println(Year);
}}}
if(last_second != gps.time.second()){
last_second = gps.time.second();
setTime(Hour, Minute, Second, Day, Month, Year);
adjustTime(time_offset);
Serial.println("UTC+");
Serial.print(hour());Serial.print(":");
Serial.print(minute());Serial.print(":");
Serial.print(second());
Serial.print(day());Serial.print("-");
Serial.print(month());Serial.print("-");
Serial.println(year());
Serial.println(week_day());
}
if (millis() > 5000 && gps.charsProcessed() < 10){
Serial.println("No GPS detected");
while(true);}
if(Year>=2023){
if(second()>=55){
switch(week_day()){
case 1:led.print(day()*100, 0, -1, -1,0x37,0xF6);break;
case 2:led.print(day()*100, 0, -1, -1,0x2479,0x1201);break;
case 3:led.print(day()*100, 0, -1, -1,0x39,0x471);break;
case 4:led.print(day()*100, 0, -1, -1,0xE6,0x1201);break;
case 5:led.print(day()*100, 0, -1, -1,0x37,0x1201);break;
case 6:led.print(day()*100, 0, -1, -1,0x39,0x2079);break;
case 7:led.print(day()*100, 0, -1, -1,0x2479,0x39);break;
}
delay(1000);
}
if(second()>=50 && second()<55){
led.print(int(dsRead(0)*100), 2, -1, -1,-1,0x39);
delay(1000);
}
if(second()<50){
timer=hour()*100+minute();
led.print(timer, 0, -1, -1,-1,-1);
delay(500);
led.print(timer, 2, -1, -1,-1,-1);
delay(500);
}
}// 2023
else{
led.print(timer, 0, 0xed, 0x39,0xf7,0x2136);
delay(500);
led.print(timer, 0, 0, 0,0,0);
delay(500);
}
//Serial.println(dsRead(0));
}// end loop
unsigned int f_div(unsigned int x, unsigned int y){
unsigned int result;
result = (x - (x % y)) / y;
return result;
}
byte week_day(){
byte a = f_div((14 - month()), 12);
unsigned int y = year() - a;
byte m = month() + 12 * a - 2;
unsigned int y4 = f_div(y, 4);
byte y100 = f_div(y, 100);
byte y400 = f_div(y, 400);
byte x = f_div(31 * m, 12);
byte wd = (day() + y + y4 - y100 + y400 + x) % 7;
return wd;
}
float dsRead(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;
}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
for (byte i=0; i<9; i++) data[i]=ds.read();
int raw=(data[1]<<8)|data[0];
float value = (float)raw / 16.0 - KORR_T; return value; // Расчет температуры и вывод
}