151

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

В установленное время будильник не сработал. колокольчик можно включить отключить.

152

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

// Подключение сетки
#define  C1_SET  0
#define  C2_SET  1
#define  C3_SET  2
#define  C4_SET  3
#define  C5_SET  4
#define  C6_SET  5
// Подключение сегменты-аноды
#define  A_SEG   6
#define  B_SEG   7
#define  C_SEG   8
#define  D_SEG   9
#define  E_SEG  10
#define  F_SEG  11
#define  G_SEG  12
#define  H_SEG  13
// Кнопки
#define  PROG   A0  // ПРОГ
#define  UP     A1  // ПЛЮС
#define  DW     A2  // МИНУС
// Активный зуммер
#define  BUZZER A3  


#include <MsTimer2.h>   // // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip  
#include <Wire.h>
#include <EEPROM.h>
#include <DS3231.h> //https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
#include <SHT21.h>  // http://rcl-radio.ru/wp-content/uploads/2025/03/SHT21-Arduino-Library-master.zip
DS3231 clock;
RTCDateTime DateTime;
SHT21 sht; 

int i,segm,c,segm_dn, ss,mm,hh,dd,mon,gg,wesk,times;
int a[4],s_tic, bud,kolorol, prog, timers;
int fff;
unsigned long times_0, times_1, times_2,times_3;
int temp,humidity;
bool avto,w,dv_stop, bud_aktiv;
int brig = 500;
int set_time, set_time_prog, gg_reg, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg;
int times_a, times_b, times_c;
int set_time_prog_alarm,alarm_mm, alarm_hh;
bool zumm, zumm_off;


void setup(){
MsTimer2::set(4, to_Timer);MsTimer2::start(); // timer2 period 4 ms
pinMode(C1_SET,OUTPUT); pinMode(C2_SET,OUTPUT);pinMode(C3_SET,OUTPUT);
pinMode(C4_SET,OUTPUT);pinMode(C5_SET,OUTPUT);pinMode(C6_SET,OUTPUT);
pinMode(A_SEG,OUTPUT); pinMode(B_SEG,OUTPUT);pinMode(C_SEG,OUTPUT);
pinMode(D_SEG,OUTPUT);pinMode(E_SEG,OUTPUT);pinMode(F_SEG,OUTPUT);
pinMode(G_SEG,OUTPUT);pinMode(H_SEG,OUTPUT);pinMode(BUZZER,OUTPUT);
pinMode(PROG,INPUT_PULLUP);pinMode(UP,INPUT_PULLUP);pinMode(DW,INPUT_PULLUP);  
Wire.begin();clock.begin();
if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
avto = EEPROM.read(0);
times_a = EEPROM.read(1);
times_b = EEPROM.read(2);
times_c = EEPROM.read(3);
alarm_mm = EEPROM.read(10);
alarm_hh = EEPROM.read(11);
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  }

void loop(){
  if(set_time==0 && zumm == 0){ prog = 1;bud = 1;
  // управление режимом авто
  if(digitalRead(PROG)==LOW && digitalRead(UP)==HIGH && digitalRead(DW)==HIGH && avto==0){avto=1;timers=1;EEPROM.update(0,avto);delay(200);}
  if(digitalRead(PROG)==LOW && digitalRead(UP)==HIGH && digitalRead(DW)==HIGH && avto==1){avto=0;timers=0;EEPROM.update(0,avto);delay(200);}
  // основное меню настройки часов, установка времени
  if(digitalRead(PROG)==LOW && digitalRead(UP)==LOW && digitalRead(DW)==HIGH){set_time=1;a[0]=15;a[1]=16;a[2]=17;a[3]=1;delay(2000);}
  // основное меню настройки будильника
  if(digitalRead(PROG)==LOW && digitalRead(UP)==HIGH && digitalRead(DW)==LOW){set_time=2;a[0]=15;a[1]=16;a[2]=17;a[3]=2;delay(2000);}

  if(digitalRead(UP)==LOW && digitalRead(PROG)==HIGH && digitalRead(DW)==HIGH){kolorol = 0;bud_aktiv=1;delay(200);}
  if(digitalRead(DW)==LOW && digitalRead(PROG)==HIGH && digitalRead(UP)==HIGH){kolorol = 1;bud_aktiv=0;delay(200);}
  }

  
  DateTime=clock.getDateTime();// опрос времени
  ss = DateTime.second;        // секунды
  mm = DateTime.minute;        // минуты
  hh = DateTime.hour;          // часы
  dd = DateTime.day;           // дата
  mon = DateTime.month;        // месяц
  gg = DateTime.year;          // Год
  if(ss<=times_a+times_b+times_c && avto==1){wesk = 12;}
   else if(set_time==1){wesk = 12;}
    else{wesk = DateTime.dayOfWeek;}   // День недели (1 - воскресенье, 7 - суббота)

  temp = sht.getTemperature();  // Температура
  humidity = sht.getHumidity(); // Влажность
  

  gg_reg = gg-2000;
  mon_reg = mon;
  dd_reg = dd;
  hh_reg = hh;
  mm_reg = mm;
  ss_reg = ss;

if(set_time==1){ prog = 0; bud = 1;dv_stop = 0;s_tic = 0;
    if(digitalRead(PROG)==LOW){set_time_prog++;if(set_time_prog>8){set_time_prog=0;set_time=0;}delay(200);}
    if(set_time_prog==0 && (digitalRead(UP)==LOW || digitalRead(DW)==LOW)){ss_reg = 0;clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==0){a[0]=18;a[1]=0;a[2]=ss_reg/10;a[3]=ss_reg%10;}
    
    if(set_time_prog==1 && digitalRead(UP)==LOW){mm_reg ++;if(mm_reg>59){mm_reg=59;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==1 && digitalRead(DW)==LOW){mm_reg --;if(mm_reg<0){mm_reg=0;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==1){a[0]=18;a[1]=1;a[2]=mm_reg/10;a[3]=mm_reg%10;}

    if(set_time_prog==2 && digitalRead(UP)==LOW){hh_reg ++;if(hh_reg>23){hh_reg=23;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==2 && digitalRead(DW)==LOW){hh_reg --;if(hh_reg<0){hh_reg=0;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==2){a[0]=18;a[1]=2;a[2]=hh_reg/10;a[3]=hh_reg%10;}

    if(set_time_prog==3 && digitalRead(UP)==LOW){dd_reg ++;if(dd_reg>31){dd_reg=31;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==3 && digitalRead(DW)==LOW){dd_reg --;if(dd_reg<1){dd_reg=1;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==3){a[0]=18;a[1]=3;a[2]=dd_reg/10;a[3]=dd_reg%10;}

    if(set_time_prog==4 && digitalRead(UP)==LOW){mon_reg ++;if(mon_reg>12){mon_reg=12;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==4 && digitalRead(DW)==LOW){mon_reg --;if(mon_reg<1){mon_reg=1;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==4){a[0]=18;a[1]=4;a[2]=mon_reg/10;a[3]=mon_reg%10;}

    if(set_time_prog==5 && digitalRead(UP)==LOW){gg_reg ++;if(gg_reg>99){mon_reg=99;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==5 && digitalRead(DW)==LOW){gg_reg --;if(gg_reg<25){mon_reg=25;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==5){a[0]=18;a[1]=5;a[2]=gg_reg/10;a[3]=gg_reg%10;}

    if(set_time_prog==6 && digitalRead(UP)==LOW){times_a ++;if(times_a>10){times_a=10;}EEPROM.update(1,times_a);delay(100);}
    if(set_time_prog==6 && digitalRead(DW)==LOW){times_a --;if(times_a<0){times_a=0;};EEPROM.update(1,times_a);delay(100);}
    if(set_time_prog==6){a[0]=17;a[1]=1;a[2]=times_a/10;a[3]=times_a%10;}

    if(set_time_prog==7 && digitalRead(UP)==LOW){times_b ++;if(times_b>10){times_b=10;}EEPROM.update(2,times_b);delay(100);}
    if(set_time_prog==7 && digitalRead(DW)==LOW){times_b --;if(times_b<0){times_b=0;};EEPROM.update(2,times_b);delay(100);}
    if(set_time_prog==7){a[0]=17;a[1]=2;a[2]=times_b/10;a[3]=times_b%10;}

    if(set_time_prog==8 && digitalRead(UP)==LOW){times_c ++;if(times_c>10){times_c=10;}EEPROM.update(3,times_c);delay(100);}
    if(set_time_prog==8 && digitalRead(DW)==LOW){times_c --;if(times_c<0){times_c=0;};EEPROM.update(3,times_c);delay(100);}
    if(set_time_prog==8){a[0]=17;a[1]=3;a[2]=times_c/10;a[3]=times_c%10;}
    }

if(set_time==2){ prog = 1; bud = 0;dv_stop = 0;s_tic = 1;
    if(digitalRead(PROG)==LOW){set_time_prog_alarm++;if(set_time_prog_alarm>1){set_time_prog_alarm=0;set_time=0;}delay(200);}
  
    if(set_time_prog_alarm==0 && digitalRead(UP)==LOW){alarm_mm ++;if(alarm_mm>59){alarm_mm=59;}EEPROM.update(10,times_a);delay(100);}
    if(set_time_prog_alarm==0 && digitalRead(DW)==LOW){alarm_mm --;if(alarm_mm<0){alarm_mm=0;};EEPROM.update(10,times_a);delay(100);}
    if(set_time_prog_alarm==0){a[0]=19;a[1]=0;a[2]=alarm_mm/10;a[3]=alarm_mm%10;}

    if(set_time_prog_alarm==1 && digitalRead(UP)==LOW){alarm_hh ++;if(alarm_hh>23){alarm_hh=23;}EEPROM.update(11,times_a);delay(100);}
    if(set_time_prog_alarm==1 && digitalRead(DW)==LOW){alarm_hh --;if(alarm_hh<0){alarm_hh=0;};EEPROM.update(11,times_a);delay(100);}
    if(set_time_prog_alarm==1){a[0]=19;a[1]=1;a[2]=alarm_hh/10;a[3]=alarm_hh%10;}

}    



if(set_time==0){

  if(avto==1){
  if(ss < times_a){dv_stop = 0;s_tic = 0;             a[0]=temp/10;a[1]=temp%10;a[2]=13;a[3]=14;} // вывод темпер.
  if(ss >= times_a && ss <=times_a+times_b){dv_stop = 0;s_tic = 0; a[0]=10;a[1]=11;a[2]=humidity/10;a[3]=humidity%10;} // вывод влажн.
  if(ss > times_a+times_b && ss <=times_a+times_b+times_c){dv_stop = 0;s_tic = 1; a[0]=dd/10;a[1]=dd%10;a[2]=mon/10;a[3]=mon%10;} // вывод дата месяц.
  if(ss > times_a+times_b+times_c){           dv_stop=1;timm();} // вывод время
  }else{                 dv_stop=1;timm();} // если авто = 0, то выводить только время


// мигание двоеточия
 if(dv_stop==1){ mig_dv();}
  
} // set_time == 0


  if( (hh*100+mm == alarm_hh*100+alarm_mm) &&  bud_aktiv==1 && zumm_off==0){zumm = 1;}else{zumm_off=0;}
  if(zumm==1 && (digitalRead(UP)==LOW || digitalRead(DW)==LOW)){zumm=0;zumm_off=1;delay(200);}
  if(zumm==1 && zumm_off==0){digitalWrite(BUZZER,HIGH);}
  if(zumm==0){digitalWrite(BUZZER,LOW);}
  delay(100);
  digitalWrite(BUZZER,LOW);
  } 


void to_Timer(){ 
    switch(i){
    case 0:  segm=12; setka();segment(1); delayMicroseconds(brig); segm_dn=wesk; c=5;  setka();dn(bud); break;
    case 1:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[0];    c=4;  setka();segment(1); break;
    case 2:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[1];    c=3;  setka();segment(kolorol); break;
    case 3:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=s_tic;   c=2;  setka();tic(); break;
    case 4:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[2];    c=1;  setka();segment(prog); break;
    case 5:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[3];    c=0;  setka();segment(timers); break;
  }i++;if(i>5){i=0;}}

void segment(bool hhh){
  switch(segm){                                                                 
    case 0: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,1);ch(H_SEG,hhh);break;// 0
    case 1: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,hhh);break;// 1
    case 2: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,hhh);break;// 2
    case 3: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,hhh);break;// 3
    case 4: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 4
    case 5: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 5   
    case 6: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 6 
    case 7: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,hhh);break;// 7 
    case 8: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 8
    case 9: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 9
    case 10: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// Н
    case 11: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,hhh);break;// -
    case 12: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,hhh);break;// пусто
    case 13: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// * градус
    case 14: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,1);ch(H_SEG,hhh);break;// C
    case 15: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// S
    case 16: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// E
    case 17: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// t
    case 18: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// P
    case 19: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// A
    
  }} 

void dn(bool ind_bud){
  switch(segm_dn){                                                               
    case 1: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ПН
    case 2: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,0);break;// ВТ
    case 3: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,0);ch(G_SEG,1);ch(H_SEG,1);break;// СР
    case 4: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ЧТ   
    case 5: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ПТ 
    case 6: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,1);break;// СБ 
    case 7: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ВС
    case 12: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// пусто
  }}

void tic(){
  switch(s_tic){                                                             
    case 0: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// _
    case 1: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,0);break;// :
  }}     

void setka(){
  switch(c){                                                             
    case 0:ch(C1_SET,0);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 1:ch(C1_SET,1);ch(C2_SET,0);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 2:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,0);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 3:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,0);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 4:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,0);ch(C6_SET,1);break; 
    case 5:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,0);break; 
  }} 

void ch(int pin, int logic){digitalWrite(pin,logic);}

void mig_dv(){if(millis()-times_0<=500){s_tic = 0;}if(millis()-times_0>500){s_tic = 1;}if(millis()-times_0>1000){times_0=millis();}}
void timm(){times = hh*100+mm;a[0]=times/1000;a[1]=times/100%10;a[2]=times/10%10;a[3]=times%10;}  

153

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

В устновленное время срабатывает режим авто!! темп-влаж-дата. и т д

154

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

колокольчик должен гореть, иначе будильник не будет работать

155

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

liman324 пишет:

колокольчик должен гореть, иначе будильник не будет работать

колокольчик горит!

156

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

что то он вдруг заработал!! ))

157

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

кнопками отключить не получатся. и еще. добовьте, чтобы через 2 минуты  он сам отключился.!

158

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

кнопками принудительно  можно  отключить спустя минуту!

159

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

Возможно получилось, очень сложный алгоритм управления будильником

// Подключение сетки
#define  C1_SET  0
#define  C2_SET  1
#define  C3_SET  2
#define  C4_SET  3
#define  C5_SET  4
#define  C6_SET  5
// Подключение сегменты-аноды
#define  A_SEG   6
#define  B_SEG   7
#define  C_SEG   8
#define  D_SEG   9
#define  E_SEG  10
#define  F_SEG  11
#define  G_SEG  12
#define  H_SEG  13
// Кнопки
#define  PROG   A0  // ПРОГ
#define  UP     A1  // ПЛЮС
#define  DW     A2  // МИНУС
// Активный зуммер
#define  BUZZER A3  


#include <MsTimer2.h>   // // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip  
#include <Wire.h>
#include <EEPROM.h>
#include <DS3231.h> //https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
#include <SHT21.h>  // http://rcl-radio.ru/wp-content/uploads/2025/03/SHT21-Arduino-Library-master.zip
DS3231 clock;
RTCDateTime DateTime;
SHT21 sht; 

int i,segm,c,segm_dn, ss,mm,hh,dd,mon,gg,wesk,times;
int a[4],s_tic, bud,kolorol, prog, timers;
int fff;
unsigned long times_0, times_1, times_2,times_3;
int temp,humidity;
bool avto,w,dv_stop, bud_aktiv;
int brig = 500;
int set_time, set_time_prog, gg_reg, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg;
int times_a, times_b, times_c;
int set_time_prog_alarm,alarm_mm, alarm_hh;
bool zumm=0, zumm_off=0;


void setup(){
MsTimer2::set(4, to_Timer);MsTimer2::start(); // timer2 period 4 ms
pinMode(C1_SET,OUTPUT); pinMode(C2_SET,OUTPUT);pinMode(C3_SET,OUTPUT);
pinMode(C4_SET,OUTPUT);pinMode(C5_SET,OUTPUT);pinMode(C6_SET,OUTPUT);
pinMode(A_SEG,OUTPUT); pinMode(B_SEG,OUTPUT);pinMode(C_SEG,OUTPUT);
pinMode(D_SEG,OUTPUT);pinMode(E_SEG,OUTPUT);pinMode(F_SEG,OUTPUT);
pinMode(G_SEG,OUTPUT);pinMode(H_SEG,OUTPUT);pinMode(BUZZER,OUTPUT);
pinMode(PROG,INPUT_PULLUP);pinMode(UP,INPUT_PULLUP);pinMode(DW,INPUT_PULLUP);  
Wire.begin();clock.begin();
if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
avto = EEPROM.read(0);
times_a = EEPROM.read(1);
times_b = EEPROM.read(2);
times_c = EEPROM.read(3);
alarm_mm = EEPROM.read(10);
alarm_hh = EEPROM.read(11);
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  }

void loop(){
  if(set_time==0 && zumm==0){ prog = 1;bud = 1;
  // управление режимом авто
  if(digitalRead(PROG)==LOW && digitalRead(UP)==HIGH && digitalRead(DW)==HIGH && avto==0){avto=1;timers=1;EEPROM.update(0,avto);delay(200);}
  if(digitalRead(PROG)==LOW && digitalRead(UP)==HIGH && digitalRead(DW)==HIGH && avto==1){avto=0;timers=0;EEPROM.update(0,avto);delay(200);}
  // основное меню настройки часов, установка времени
  if(digitalRead(PROG)==LOW && digitalRead(UP)==LOW && digitalRead(DW)==HIGH){set_time=1;a[0]=15;a[1]=16;a[2]=17;a[3]=1;delay(2000);}
  // основное меню настройки будильника
  if(digitalRead(PROG)==LOW && digitalRead(UP)==HIGH && digitalRead(DW)==LOW){set_time=2;a[0]=15;a[1]=16;a[2]=17;a[3]=2;delay(2000);}

  if(digitalRead(UP)==LOW && digitalRead(PROG)==HIGH && digitalRead(DW)==HIGH){kolorol = 0;bud_aktiv=1;delay(200);}
  if(digitalRead(DW)==LOW && digitalRead(PROG)==HIGH && digitalRead(UP)==HIGH){kolorol = 1;bud_aktiv=0;delay(200);}
  }

  
  DateTime=clock.getDateTime();// опрос времени
  ss = DateTime.second;        // секунды
  mm = DateTime.minute;        // минуты
  hh = DateTime.hour;          // часы
  dd = DateTime.day;           // дата
  mon = DateTime.month;        // месяц
  gg = DateTime.year;          // Год
  if(ss<=times_a+times_b+times_c && avto==1){wesk = 12;}
   else if(set_time==1){wesk = 12;}
    else{wesk = DateTime.dayOfWeek;}   // День недели (1 - воскресенье, 7 - суббота)

  temp = sht.getTemperature();  // Температура
  humidity = sht.getHumidity(); // Влажность
  

  gg_reg = gg-2000;
  mon_reg = mon;
  dd_reg = dd;
  hh_reg = hh;
  mm_reg = mm;
  ss_reg = ss;

if(set_time==1){ prog = 0; bud = 1;dv_stop = 0;s_tic = 0;
    if(digitalRead(PROG)==LOW){set_time_prog++;if(set_time_prog>8){set_time_prog=0;set_time=0;}delay(200);}
    if(set_time_prog==0 && (digitalRead(UP)==LOW || digitalRead(DW)==LOW)){ss_reg = 0;clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==0){a[0]=18;a[1]=0;a[2]=ss_reg/10;a[3]=ss_reg%10;}
    
    if(set_time_prog==1 && digitalRead(UP)==LOW){mm_reg ++;if(mm_reg>59){mm_reg=59;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==1 && digitalRead(DW)==LOW){mm_reg --;if(mm_reg<0){mm_reg=0;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==1){a[0]=18;a[1]=1;a[2]=mm_reg/10;a[3]=mm_reg%10;}

    if(set_time_prog==2 && digitalRead(UP)==LOW){hh_reg ++;if(hh_reg>23){hh_reg=23;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==2 && digitalRead(DW)==LOW){hh_reg --;if(hh_reg<0){hh_reg=0;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==2){a[0]=18;a[1]=2;a[2]=hh_reg/10;a[3]=hh_reg%10;}

    if(set_time_prog==3 && digitalRead(UP)==LOW){dd_reg ++;if(dd_reg>31){dd_reg=31;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==3 && digitalRead(DW)==LOW){dd_reg --;if(dd_reg<1){dd_reg=1;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==3){a[0]=18;a[1]=3;a[2]=dd_reg/10;a[3]=dd_reg%10;}

    if(set_time_prog==4 && digitalRead(UP)==LOW){mon_reg ++;if(mon_reg>12){mon_reg=12;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==4 && digitalRead(DW)==LOW){mon_reg --;if(mon_reg<1){mon_reg=1;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==4){a[0]=18;a[1]=4;a[2]=mon_reg/10;a[3]=mon_reg%10;}

    if(set_time_prog==5 && digitalRead(UP)==LOW){gg_reg ++;if(gg_reg>99){mon_reg=99;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==5 && digitalRead(DW)==LOW){gg_reg --;if(gg_reg<25){mon_reg=25;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==5){a[0]=18;a[1]=5;a[2]=gg_reg/10;a[3]=gg_reg%10;}

    if(set_time_prog==6 && digitalRead(UP)==LOW){times_a ++;if(times_a>10){times_a=10;}EEPROM.update(1,times_a);delay(100);}
    if(set_time_prog==6 && digitalRead(DW)==LOW){times_a --;if(times_a<0){times_a=0;};EEPROM.update(1,times_a);delay(100);}
    if(set_time_prog==6){a[0]=17;a[1]=1;a[2]=times_a/10;a[3]=times_a%10;}

    if(set_time_prog==7 && digitalRead(UP)==LOW){times_b ++;if(times_b>10){times_b=10;}EEPROM.update(2,times_b);delay(100);}
    if(set_time_prog==7 && digitalRead(DW)==LOW){times_b --;if(times_b<0){times_b=0;};EEPROM.update(2,times_b);delay(100);}
    if(set_time_prog==7){a[0]=17;a[1]=2;a[2]=times_b/10;a[3]=times_b%10;}

    if(set_time_prog==8 && digitalRead(UP)==LOW){times_c ++;if(times_c>10){times_c=10;}EEPROM.update(3,times_c);delay(100);}
    if(set_time_prog==8 && digitalRead(DW)==LOW){times_c --;if(times_c<0){times_c=0;};EEPROM.update(3,times_c);delay(100);}
    if(set_time_prog==8){a[0]=17;a[1]=3;a[2]=times_c/10;a[3]=times_c%10;}
    }

if(set_time==2){ prog = 1; bud = 0;dv_stop = 0;s_tic = 1;
    if(digitalRead(PROG)==LOW){set_time_prog_alarm++;if(set_time_prog_alarm>1){set_time_prog_alarm=0;set_time=0;}delay(200);}
  
    if(set_time_prog_alarm==0 && digitalRead(UP)==LOW){alarm_mm ++;if(alarm_mm>59){alarm_mm=59;}EEPROM.update(10,times_a);delay(100);}
    if(set_time_prog_alarm==0 && digitalRead(DW)==LOW){alarm_mm --;if(alarm_mm<0){alarm_mm=0;};EEPROM.update(10,times_a);delay(100);}
    if(set_time_prog_alarm==0){a[0]=19;a[1]=0;a[2]=alarm_mm/10;a[3]=alarm_mm%10;}

    if(set_time_prog_alarm==1 && digitalRead(UP)==LOW){alarm_hh ++;if(alarm_hh>23){alarm_hh=23;}EEPROM.update(11,times_a);delay(100);}
    if(set_time_prog_alarm==1 && digitalRead(DW)==LOW){alarm_hh --;if(alarm_hh<0){alarm_hh=0;};EEPROM.update(11,times_a);delay(100);}
    if(set_time_prog_alarm==1){a[0]=19;a[1]=1;a[2]=alarm_hh/10;a[3]=alarm_hh%10;}

}    



if(set_time==0){

  if(avto==1){
  if(ss < times_a){dv_stop = 0;s_tic = 0;             a[0]=temp/10;a[1]=temp%10;a[2]=13;a[3]=14;} // вывод темпер.
  if(ss >= times_a && ss <=times_a+times_b){dv_stop = 0;s_tic = 0; a[0]=10;a[1]=11;a[2]=humidity/10;a[3]=humidity%10;} // вывод влажн.
  if(ss > times_a+times_b && ss <=times_a+times_b+times_c){dv_stop = 0;s_tic = 1; a[0]=dd/10;a[1]=dd%10;a[2]=mon/10;a[3]=mon%10;} // вывод дата месяц.
  if(ss > times_a+times_b+times_c){           dv_stop=1;timm();} // вывод время
  }else{                 dv_stop=1;timm();} // если авто = 0, то выводить только время


// мигание двоеточия
 if(dv_stop==1){ mig_dv();}
  
} // set_time == 0


  if( (hh*100+mm == alarm_hh*100+alarm_mm) &&  bud_aktiv==1 && zumm_off==0){zumm = 1;}
  if(hh*100+mm != alarm_hh*100+alarm_mm){zumm_off=0;}
  if(zumm==1 && (digitalRead(UP)==LOW || digitalRead(DW)==LOW)){zumm=0;zumm_off=1;delay(200);}
  if(zumm==1 && zumm_off==0){digitalWrite(BUZZER,HIGH);}
  if(zumm==0){digitalWrite(BUZZER,LOW);}
  delay(100);
  digitalWrite(BUZZER,LOW);
  } 


void to_Timer(){ 
    switch(i){
    case 0:  segm=12; setka();segment(1); delayMicroseconds(brig); segm_dn=wesk; c=5;  setka();dn(bud); break;
    case 1:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[0];    c=4;  setka();segment(1); break;
    case 2:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[1];    c=3;  setka();segment(kolorol); break;
    case 3:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=s_tic;   c=2;  setka();tic(); break;
    case 4:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[2];    c=1;  setka();segment(prog); break;
    case 5:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[3];    c=0;  setka();segment(timers); break;
  }i++;if(i>5){i=0;}}

void segment(bool hhh){
  switch(segm){                                                                 
    case 0: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,1);ch(H_SEG,hhh);break;// 0
    case 1: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,hhh);break;// 1
    case 2: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,hhh);break;// 2
    case 3: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,hhh);break;// 3
    case 4: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 4
    case 5: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 5   
    case 6: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 6 
    case 7: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,hhh);break;// 7 
    case 8: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 8
    case 9: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 9
    case 10: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// Н
    case 11: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,hhh);break;// -
    case 12: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,hhh);break;// пусто
    case 13: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// * градус
    case 14: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,1);ch(H_SEG,hhh);break;// C
    case 15: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// S
    case 16: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// E
    case 17: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// t
    case 18: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// P
    case 19: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// A
    
  }} 

void dn(bool ind_bud){
  switch(segm_dn){                                                               
    case 1: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ПН
    case 2: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,0);break;// ВТ
    case 3: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,0);ch(G_SEG,1);ch(H_SEG,1);break;// СР
    case 4: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ЧТ   
    case 5: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ПТ 
    case 6: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,1);break;// СБ 
    case 7: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ВС
    case 12: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// пусто
  }}

void tic(){
  switch(s_tic){                                                             
    case 0: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// _
    case 1: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,0);break;// :
  }}     

void setka(){
  switch(c){                                                             
    case 0:ch(C1_SET,0);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 1:ch(C1_SET,1);ch(C2_SET,0);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 2:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,0);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 3:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,0);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 4:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,0);ch(C6_SET,1);break; 
    case 5:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,0);break; 
  }} 

void ch(int pin, int logic){digitalWrite(pin,logic);}

void mig_dv(){if(millis()-times_0<=500){s_tic = 0;}if(millis()-times_0>500){s_tic = 1;}if(millis()-times_0>1000){times_0=millis();}}
void timm(){times = hh*100+mm;a[0]=times/1000;a[1]=times/100%10;a[2]=times/10%10;a[3]=times%10;}  

160

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

Будильник сработал. отключить кнопками можно.. Но. сам он не отключается.. через 2 мин.

161

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

// Подключение сетки
#define  C1_SET  0
#define  C2_SET  1
#define  C3_SET  2
#define  C4_SET  3
#define  C5_SET  4
#define  C6_SET  5
// Подключение сегменты-аноды
#define  A_SEG   6
#define  B_SEG   7
#define  C_SEG   8
#define  D_SEG   9
#define  E_SEG  10
#define  F_SEG  11
#define  G_SEG  12
#define  H_SEG  13
// Кнопки
#define  PROG   A0  // ПРОГ
#define  UP     A1  // ПЛЮС
#define  DW     A2  // МИНУС
// Активный зуммер
#define  BUZZER A3  


#include <MsTimer2.h>   // // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip  
#include <Wire.h>
#include <EEPROM.h>
#include <DS3231.h> //https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
#include <SHT21.h>  // http://rcl-radio.ru/wp-content/uploads/2025/03/SHT21-Arduino-Library-master.zip
DS3231 clock;
RTCDateTime DateTime;
SHT21 sht; 

int i,segm,c,segm_dn, ss,mm,hh,dd,mon,gg,wesk,times;
int a[4],s_tic, bud,kolorol, prog, timers;
int fff;
unsigned long times_0, times_1, times_2,times_3;
int temp,humidity;
bool avto,w,dv_stop, bud_aktiv;
int brig = 500;
int set_time, set_time_prog, gg_reg, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg;
int times_a, times_b, times_c;
int set_time_prog_alarm,alarm_mm, alarm_hh;
bool zumm=0, zumm_off=0;


void setup(){
MsTimer2::set(4, to_Timer);MsTimer2::start(); // timer2 period 4 ms
pinMode(C1_SET,OUTPUT); pinMode(C2_SET,OUTPUT);pinMode(C3_SET,OUTPUT);
pinMode(C4_SET,OUTPUT);pinMode(C5_SET,OUTPUT);pinMode(C6_SET,OUTPUT);
pinMode(A_SEG,OUTPUT); pinMode(B_SEG,OUTPUT);pinMode(C_SEG,OUTPUT);
pinMode(D_SEG,OUTPUT);pinMode(E_SEG,OUTPUT);pinMode(F_SEG,OUTPUT);
pinMode(G_SEG,OUTPUT);pinMode(H_SEG,OUTPUT);pinMode(BUZZER,OUTPUT);
pinMode(PROG,INPUT_PULLUP);pinMode(UP,INPUT_PULLUP);pinMode(DW,INPUT_PULLUP);  
Wire.begin();clock.begin();
if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
avto = EEPROM.read(0);
times_a = EEPROM.read(1);
times_b = EEPROM.read(2);
times_c = EEPROM.read(3);
alarm_mm = EEPROM.read(10);
alarm_hh = EEPROM.read(11);
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  }

void loop(){
  if(set_time==0 && zumm==0){ prog = 1;bud = 1;
  // управление режимом авто
  if(digitalRead(PROG)==LOW && digitalRead(UP)==HIGH && digitalRead(DW)==HIGH && avto==0){avto=1;timers=1;EEPROM.update(0,avto);delay(200);}
  if(digitalRead(PROG)==LOW && digitalRead(UP)==HIGH && digitalRead(DW)==HIGH && avto==1){avto=0;timers=0;EEPROM.update(0,avto);delay(200);}
  // основное меню настройки часов, установка времени
  if(digitalRead(PROG)==LOW && digitalRead(UP)==LOW && digitalRead(DW)==HIGH){set_time=1;a[0]=15;a[1]=16;a[2]=17;a[3]=1;delay(2000);}
  // основное меню настройки будильника
  if(digitalRead(PROG)==LOW && digitalRead(UP)==HIGH && digitalRead(DW)==LOW){set_time=2;a[0]=15;a[1]=16;a[2]=17;a[3]=2;delay(2000);}

  if(digitalRead(UP)==LOW && digitalRead(PROG)==HIGH && digitalRead(DW)==HIGH){kolorol = 0;bud_aktiv=1;delay(200);}
  if(digitalRead(DW)==LOW && digitalRead(PROG)==HIGH && digitalRead(UP)==HIGH){kolorol = 1;bud_aktiv=0;delay(200);}
  }

  
  DateTime=clock.getDateTime();// опрос времени
  ss = DateTime.second;        // секунды
  mm = DateTime.minute;        // минуты
  hh = DateTime.hour;          // часы
  dd = DateTime.day;           // дата
  mon = DateTime.month;        // месяц
  gg = DateTime.year;          // Год
  if(ss<=times_a+times_b+times_c && avto==1){wesk = 12;}
   else if(set_time==1){wesk = 12;}
    else{wesk = DateTime.dayOfWeek;}   // День недели (1 - воскресенье, 7 - суббота)

  temp = sht.getTemperature();  // Температура
  humidity = sht.getHumidity(); // Влажность
  

  gg_reg = gg-2000;
  mon_reg = mon;
  dd_reg = dd;
  hh_reg = hh;
  mm_reg = mm;
  ss_reg = ss;

if(set_time==1){ prog = 0; bud = 1;dv_stop = 0;s_tic = 0;
    if(digitalRead(PROG)==LOW){set_time_prog++;if(set_time_prog>8){set_time_prog=0;set_time=0;}delay(200);}
    if(set_time_prog==0 && (digitalRead(UP)==LOW || digitalRead(DW)==LOW)){ss_reg = 0;clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==0){a[0]=18;a[1]=0;a[2]=ss_reg/10;a[3]=ss_reg%10;}
    
    if(set_time_prog==1 && digitalRead(UP)==LOW){mm_reg ++;if(mm_reg>59){mm_reg=59;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==1 && digitalRead(DW)==LOW){mm_reg --;if(mm_reg<0){mm_reg=0;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==1){a[0]=18;a[1]=1;a[2]=mm_reg/10;a[3]=mm_reg%10;}

    if(set_time_prog==2 && digitalRead(UP)==LOW){hh_reg ++;if(hh_reg>23){hh_reg=23;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==2 && digitalRead(DW)==LOW){hh_reg --;if(hh_reg<0){hh_reg=0;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==2){a[0]=18;a[1]=2;a[2]=hh_reg/10;a[3]=hh_reg%10;}

    if(set_time_prog==3 && digitalRead(UP)==LOW){dd_reg ++;if(dd_reg>31){dd_reg=31;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==3 && digitalRead(DW)==LOW){dd_reg --;if(dd_reg<1){dd_reg=1;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==3){a[0]=18;a[1]=3;a[2]=dd_reg/10;a[3]=dd_reg%10;}

    if(set_time_prog==4 && digitalRead(UP)==LOW){mon_reg ++;if(mon_reg>12){mon_reg=12;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==4 && digitalRead(DW)==LOW){mon_reg --;if(mon_reg<1){mon_reg=1;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==4){a[0]=18;a[1]=4;a[2]=mon_reg/10;a[3]=mon_reg%10;}

    if(set_time_prog==5 && digitalRead(UP)==LOW){gg_reg ++;if(gg_reg>99){mon_reg=99;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==5 && digitalRead(DW)==LOW){gg_reg --;if(gg_reg<25){mon_reg=25;}clock.setDateTime(gg_reg+2000, mon_reg, dd_reg, hh_reg, mm_reg, ss_reg);delay(100);}
    if(set_time_prog==5){a[0]=18;a[1]=5;a[2]=gg_reg/10;a[3]=gg_reg%10;}

    if(set_time_prog==6 && digitalRead(UP)==LOW){times_a ++;if(times_a>10){times_a=10;}EEPROM.update(1,times_a);delay(100);}
    if(set_time_prog==6 && digitalRead(DW)==LOW){times_a --;if(times_a<0){times_a=0;};EEPROM.update(1,times_a);delay(100);}
    if(set_time_prog==6){a[0]=17;a[1]=1;a[2]=times_a/10;a[3]=times_a%10;}

    if(set_time_prog==7 && digitalRead(UP)==LOW){times_b ++;if(times_b>10){times_b=10;}EEPROM.update(2,times_b);delay(100);}
    if(set_time_prog==7 && digitalRead(DW)==LOW){times_b --;if(times_b<0){times_b=0;};EEPROM.update(2,times_b);delay(100);}
    if(set_time_prog==7){a[0]=17;a[1]=2;a[2]=times_b/10;a[3]=times_b%10;}

    if(set_time_prog==8 && digitalRead(UP)==LOW){times_c ++;if(times_c>10){times_c=10;}EEPROM.update(3,times_c);delay(100);}
    if(set_time_prog==8 && digitalRead(DW)==LOW){times_c --;if(times_c<0){times_c=0;};EEPROM.update(3,times_c);delay(100);}
    if(set_time_prog==8){a[0]=17;a[1]=3;a[2]=times_c/10;a[3]=times_c%10;}
    }

if(set_time==2){ prog = 1; bud = 0;dv_stop = 0;s_tic = 1;
    if(digitalRead(PROG)==LOW){set_time_prog_alarm++;if(set_time_prog_alarm>1){set_time_prog_alarm=0;set_time=0;}delay(200);}
  
    if(set_time_prog_alarm==0 && digitalRead(UP)==LOW){alarm_mm ++;if(alarm_mm>59){alarm_mm=59;}EEPROM.update(10,times_a);delay(100);}
    if(set_time_prog_alarm==0 && digitalRead(DW)==LOW){alarm_mm --;if(alarm_mm<0){alarm_mm=0;};EEPROM.update(10,times_a);delay(100);}
    if(set_time_prog_alarm==0){a[0]=19;a[1]=0;a[2]=alarm_mm/10;a[3]=alarm_mm%10;}

    if(set_time_prog_alarm==1 && digitalRead(UP)==LOW){alarm_hh ++;if(alarm_hh>23){alarm_hh=23;}EEPROM.update(11,times_a);delay(100);}
    if(set_time_prog_alarm==1 && digitalRead(DW)==LOW){alarm_hh --;if(alarm_hh<0){alarm_hh=0;};EEPROM.update(11,times_a);delay(100);}
    if(set_time_prog_alarm==1){a[0]=19;a[1]=1;a[2]=alarm_hh/10;a[3]=alarm_hh%10;}

}    



if(set_time==0){

  if(avto==1){
  if(ss < times_a){dv_stop = 0;s_tic = 0;             a[0]=temp/10;a[1]=temp%10;a[2]=13;a[3]=14;} // вывод темпер.
  if(ss >= times_a && ss <=times_a+times_b){dv_stop = 0;s_tic = 0; a[0]=10;a[1]=11;a[2]=humidity/10;a[3]=humidity%10;} // вывод влажн.
  if(ss > times_a+times_b && ss <=times_a+times_b+times_c){dv_stop = 0;s_tic = 1; a[0]=dd/10;a[1]=dd%10;a[2]=mon/10;a[3]=mon%10;} // вывод дата месяц.
  if(ss > times_a+times_b+times_c){           dv_stop=1;timm();} // вывод время
  }else{                 dv_stop=1;timm();} // если авто = 0, то выводить только время


// мигание двоеточия
 if(dv_stop==1){ mig_dv();}
  
} // set_time == 0


  if( (hh*100+mm == alarm_hh*100+alarm_mm) &&  bud_aktiv==1 && zumm_off==0){zumm = 1;}
  if(hh*100+mm != alarm_hh*100+alarm_mm){zumm = 0;zumm_off=0;}
  if(zumm==1 && (digitalRead(UP)==LOW || digitalRead(DW)==LOW)){zumm=0;zumm_off=1;delay(200);}
  if(zumm==1 && zumm_off==0){digitalWrite(BUZZER,HIGH);}
  if(zumm==0){digitalWrite(BUZZER,LOW);}
  delay(100);
  digitalWrite(BUZZER,LOW);
  } 


void to_Timer(){ 
    switch(i){
    case 0:  segm=12; setka();segment(1); delayMicroseconds(brig); segm_dn=wesk; c=5;  setka();dn(bud); break;
    case 1:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[0];    c=4;  setka();segment(1); break;
    case 2:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[1];    c=3;  setka();segment(kolorol); break;
    case 3:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=s_tic;   c=2;  setka();tic(); break;
    case 4:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[2];    c=1;  setka();segment(prog); break;
    case 5:  segm=12; setka();segment(1); delayMicroseconds(brig); segm=a[3];    c=0;  setka();segment(timers); break;
  }i++;if(i>5){i=0;}}

void segment(bool hhh){
  switch(segm){                                                                 
    case 0: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,1);ch(H_SEG,hhh);break;// 0
    case 1: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,hhh);break;// 1
    case 2: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,hhh);break;// 2
    case 3: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,hhh);break;// 3
    case 4: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 4
    case 5: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 5   
    case 6: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 6 
    case 7: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,hhh);break;// 7 
    case 8: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 8
    case 9: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// 9
    case 10: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// Н
    case 11: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,hhh);break;// -
    case 12: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,hhh);break;// пусто
    case 13: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// * градус
    case 14: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,1);ch(H_SEG,hhh);break;// C
    case 15: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,0);ch(E_SEG,1);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// S
    case 16: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// E
    case 17: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// t
    case 18: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// P
    case 19: ch(A_SEG,0);ch(B_SEG,0);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,0);ch(F_SEG,0);ch(G_SEG,0);ch(H_SEG,hhh);break;// A
    
  }} 

void dn(bool ind_bud){
  switch(segm_dn){                                                               
    case 1: ch(A_SEG,0);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ПН
    case 2: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,0);break;// ВТ
    case 3: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,0);ch(G_SEG,1);ch(H_SEG,1);break;// СР
    case 4: ch(A_SEG,1);ch(B_SEG,0);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ЧТ   
    case 5: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,0);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ПТ 
    case 6: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,0);ch(H_SEG,1);break;// СБ 
    case 7: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,0);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// ВС
    case 12: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,ind_bud);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// пусто
  }}

void tic(){
  switch(s_tic){                                                             
    case 0: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,1);break;// _
    case 1: ch(A_SEG,1);ch(B_SEG,1);ch(C_SEG,1);ch(D_SEG,1);ch(E_SEG,1);ch(F_SEG,1);ch(G_SEG,1);ch(H_SEG,0);break;// :
  }}     

void setka(){
  switch(c){                                                             
    case 0:ch(C1_SET,0);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 1:ch(C1_SET,1);ch(C2_SET,0);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 2:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,0);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 3:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,0);ch(C5_SET,1);ch(C6_SET,1);break; 
    case 4:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,0);ch(C6_SET,1);break; 
    case 5:ch(C1_SET,1);ch(C2_SET,1);ch(C3_SET,1);ch(C4_SET,1);ch(C5_SET,1);ch(C6_SET,0);break; 
  }} 

void ch(int pin, int logic){digitalWrite(pin,logic);}

void mig_dv(){if(millis()-times_0<=500){s_tic = 0;}if(millis()-times_0>500){s_tic = 1;}if(millis()-times_0>1000){times_0=millis();}}
void timm(){times = hh*100+mm;a[0]=times/1000;a[1]=times/100%10;a[2]=times/10%10;a[3]=times%10;}  

162

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

вроде все норма. через 2 мин. отключается. Но. когда нужно отключитьпринудительно. он выключается. А вот колокольчик светиться. нужно еще раз нажать,чтобы он погас.

163

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

Колокольчик это значит что будильник активен и должен запищать в нужное время, если колокольчик не горит, значит будильник не будет пищать в нужное время. Или сейчас не так работает как я написал?

164

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

Он так работает.  все норма. я немного по другому подоумал.

165

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

Я это сделал для того, что если Вы не захотите чтобы завтра например будильник не сработал, то можно было его деактивировать. Например на выходные. А потом активировать, и Вы когда видите что горит колокольчик, значит завтра будильник будет пищать в назначенное время.

166

Re: Часы+будильник на П543 (ИЛЦ5-4/7М)

liman324 пишет:

Я это сделал для того, что если Вы не захотите чтобы завтра например будильник не сработал, то можно было его деактивировать. Например на выходные. А потом активировать, и Вы когда видите что горит колокольчик, значит завтра будильник будет пищать в назначенное время.


Все верно. Это удобно. В основном я просыпаюсь в однои тоже время. Каждый раз буд..  выставлять не нужно. Достаточно включить или отключить колокольчик.