Коррекция времени кнопками (не тестировалось)
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h>
#include <DS3231.h> // https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
DS3231 clock;RTCDateTime DateTime;
int an, segm,times,i,pd,pd_p,hh,mm;
byte a[4],w;
void setup(){ Wire.begin();clock.begin();
MsTimer2::set(2, to_Timer);MsTimer2::start();
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
pinMode(9,OUTPUT); // D9 === A0
pinMode(10,OUTPUT); // D10 === A1
pinMode(11,OUTPUT); // D11 === A2
pinMode(12,OUTPUT); // D12 === A3
pinMode(13,OUTPUT); // D13 === PD
pinMode(2,OUTPUT); // D2 === a
pinMode(3,OUTPUT); // D3 === b
pinMode(4,OUTPUT); // D4 === c
pinMode(5,OUTPUT); // D5 === d
pinMode(6,OUTPUT); // D6 === e
pinMode(7,OUTPUT); // D7 === f
pinMode(8,OUTPUT); // D8 === g
clock.setOutput(DS3231_1HZ);
pinMode(A0,INPUT); // SQW DS3231
pinMode (A1,INPUT_PULLUP); // часы +
pinMode (A2,INPUT_PULLUP); // минуты +
// кнопки коррекци времени - нажатие === замыкание на GND
}
void loop(){
DateTime=clock.getDateTime();// опрос времени
hh=DateTime.hour;mm=DateTime.minute;
times = DateTime.hour*100+DateTime.minute;
a[0]=times/1000;
a[1]=times/100%10;
a[2]=times/10%10;
a[3]=times%10%10;
if(analogRead(A0)>900){pd_p=1;}else{pd_p=0;}
///////////////////////////////////// коррекция времени - часы и минуты
if(analogRead(A1)<900){w=1;hh++;if(hh>23){hh=0;}delay(300);}
if(analogRead(A2)<900){w=1;mm++;if(mm>59){mm=0;}delay(300);}
if(w==1){w=0;clock.setDateTime(2020, 01, 01, hh, mm, 0);}
}// loop
void to_Timer(){
switch(i){
case 0: cl(); segm=a[0]; pd=0; an=0; anod(); segment();break;
case 1: cl(); segm=a[1]; pd=pd_p; an=1; anod(); segment();break;
case 2: cl(); segm=a[2]; pd=0; an=2; anod(); segment();break;
case 3: cl(); segm=a[3]; pd=0; an=3; anod(); segment();break;}i++;
if(i>3){i=0;}}
void segment(){
switch(segm){
// A B C D E F G PD
case 0: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,0);ch(13,pd);break;// 0
case 1: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// 1
case 2: ch(2,1);ch(3,1);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,1);ch(13,pd);break;// 2
case 3: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,0);ch(8,1);ch(13,pd);break;// 3
case 4: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 4
case 5: ch(2,1);ch(3,0);ch(4,1);ch(5,1);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 5
case 6: ch(2,1);ch(3,0);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// 6
case 7: ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// 7
case 8: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// 8
case 9: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 9
case 10: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// пусто
}}
void anod(){
switch(an){
case 0:ch(9,1);ch(10,0);ch(11,0);ch(12,0);break;
case 1:ch(9,0);ch(10,1);ch(11,0);ch(12,0);break;
case 2:ch(9,0);ch(10,0);ch(11,1);ch(12,0);break;
case 3:ch(9,0);ch(10,0);ch(11,0);ch(12,1);break;
}}
void cl(){
segm=10; pd=0; an=0; segment(); anod(); an=1; segment(); anod(); an=2; segment(); anod(); an=3; segment();anod();
}
void ch(int pin, int logic){digitalWrite(pin,logic);}
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <DS3231.h>
#include <DHT.h>
DHT dht(A1, DHT11); // выход DAT подключен к A1
DS3231 clock;RTCDateTime DateTime;
Adafruit_BMP280 bmp; // I2C
int an, segm,times,i,pd,pd_p,sek,hh,mm;
byte a[4],w;
void setup(){ Wire.begin();clock.begin();bmp.begin();dht.begin();
MsTimer2::set(2, to_Timer);MsTimer2::start();
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
pinMode(9,OUTPUT); // D9 === A0
pinMode(10,OUTPUT); // D10 === A1
pinMode(11,OUTPUT); // D11 === A2
pinMode(12,OUTPUT); // D12 === A3
pinMode(13,OUTPUT); // D13 === PD
pinMode(2,OUTPUT); // D2 === a
pinMode(3,OUTPUT); // D3 === b
pinMode(4,OUTPUT); // D4 === c
pinMode(5,OUTPUT); // D5 === d
pinMode(6,OUTPUT); // D6 === e
pinMode(7,OUTPUT); // D7 === f
pinMode(8,OUTPUT); // D8 === g
clock.setOutput(DS3231_1HZ);
pinMode(A0,INPUT); // SQW DS3231
pinMode (A2,INPUT_PULLUP); // часы +
pinMode (A3,INPUT_PULLUP); // минуты +
// кнопки коррекци времени - нажатие === замыкание на GND
}
void loop(){
DateTime=clock.getDateTime();// опрос времени
hh=DateTime.hour;mm=DateTime.minute;
sek=DateTime.second;
if((sek>=10&&sek<=15)||(sek>=30&&sek<=35)){
times = bmp.readTemperature();
a[0]=times/10;
a[1]=times%10;
a[2]=11;
a[3]=12;
pd_p=0;}
else if((sek>=15&&sek<=20)||(sek>=35&&sek<=40)){
times = bmp.readPressure()/133.3224;
a[0]=13;
a[1]=times/100;
a[2]=times/10%10;
a[3]=times%10;
pd_p=0;}
else if((sek>=20&&sek<=25)||(sek>=40&&sek<=45)){
times = dht.readHumidity();
a[0]=14;
a[1]=10;
a[2]=times/10;
a[3]=times%10;
pd_p=0;}
else{
times = DateTime.hour*100+DateTime.minute;
a[0]=times/1000;
a[1]=times/100%10;
a[2]=times/10%10;
a[3]=times%10%10;
if(analogRead(A0)>900){pd_p=1;}else{pd_p=0;}
}
///////////////////////////////////// коррекция времени - часы и минуты
if(analogRead(A2)<900){w=1;hh++;if(hh>23){hh=0;}delay(300);}
if(analogRead(A3)<900){w=1;mm++;if(mm>59){mm=0;}delay(300);}
if(w==1){w=0;clock.setDateTime(2020, 01, 01, hh, mm, 0);}
}// loop
void to_Timer(){
switch(i){
case 0: cl(); segm=a[0]; pd=0; an=0; anod(); segment();break;
case 1: cl(); segm=a[1]; pd=pd_p; an=1; anod(); segment();break;
case 2: cl(); segm=a[2]; pd=0; an=2; anod(); segment();break;
case 3: cl(); segm=a[3]; pd=0; an=3; anod(); segment();break;}i++;
if(i>3){i=0;}}
void segment(){
switch(segm){
// A B C D E F G PD
case 0: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,0);ch(13,pd);break;// 0
case 1: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// 1
case 2: ch(2,1);ch(3,1);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,1);ch(13,pd);break;// 2
case 3: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,0);ch(8,1);ch(13,pd);break;// 3
case 4: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 4
case 5: ch(2,1);ch(3,0);ch(4,1);ch(5,1);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 5
case 6: ch(2,1);ch(3,0);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// 6
case 7: ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// 7
case 8: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// 8
case 9: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 9
case 10: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// пусто
case 11: ch(2,1);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// градус
case 12: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,0);ch(13,pd);break;// C
case 13: ch(2,1);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// P
case 14: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// H
}}
void anod(){
switch(an){
case 0:ch(9,1);ch(10,0);ch(11,0);ch(12,0);break;
case 1:ch(9,0);ch(10,1);ch(11,0);ch(12,0);break;
case 2:ch(9,0);ch(10,0);ch(11,1);ch(12,0);break;
case 3:ch(9,0);ch(10,0);ch(11,0);ch(12,1);break;
}}
void cl(){
segm=10; pd=0; an=0; segment(); anod(); an=1; segment(); anod(); an=2; segment(); anod(); an=3; segment();anod();
}
void ch(int pin, int logic){digitalWrite(pin,logic);}