1

Тема: Часы (DS3231) с будильником (Arduino)

Основная статья - http://rcl-radio.ru/?p=45882
Не тестировалось!

#include <Wire.h>
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
DS3231 clock;RTCDateTime DateTime;
#include <LiquidCrystal.h>  
#include <EEPROM.h> //#include <EEPROMex.h> 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
 
int k,m,h,i,w,reg,ton;
byte rom0,rom1,rom2;
unsigned long eeprom;
char * dn[7]{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
 
void setup(){Serial.begin(9600);
   lcd.begin(16,2);// LCD 16X2 
   Wire.begin(); clock.begin();
   pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);
 //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);}
  rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);}
  rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);}
  m=rom0;h=rom1;w=rom2;
}
 
void loop(){i++;if(i>4){i=0;}
 if(digitalRead(2)==HIGH){k++;reg=1;delay(300);}if(k>3){k=0;reg=0;}
 
 if(reg==1) {
 if(k==1){
 if(digitalRead(3)==HIGH){m++;}if(m>59){m=59;}
 if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
 if(k==2){
 if(digitalRead(3)==HIGH){h++;}if(h>23){h=23;}
 if(digitalRead(4)==HIGH){h--;}if(h<0){h=0;}}
 if(k==3){
 if(digitalRead(3)==HIGH){w++;delay(300);}if(w>3){w=0;}
 if(digitalRead(4)==HIGH){w--;delay(300);}if(w<0){w=3;}
 } 
 lcd.setCursor(0,0);lcd.print("Alarm ");
 if(i==1&&k==2){lcd.print("  ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
 if(i==1&&k==1){lcd.print("  ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);} 
 lcd.setCursor(0,1);
 if(i==1&&k==3){lcd.print("                 ");}
 if(w==0){lcd.print("every day");}  //каждый день 1234567
 if(w==1){lcd.print("on weekdays");}//по будням 12345
 if(w==2){lcd.print("on weekends");}//по выходным 67
 if(w==3){lcd.print("off");}
 rom0=m;rom1=h;rom2=w;
 eeprom=0;
 }
 
 if(reg==0){if(eeprom==1){EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);}
 DateTime=clock.getDateTime();   // Считываем c часов текущие значения даты и времени в сущность DateTime
 lcd.setCursor(0,0);
 // lcd.print(clock.dateFormat("H:i:s ",DateTime));// выводим часы, минуты и секунды

 lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");
 lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
 lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);lcd.print("  ");
 
 lcd.print(clock.readTemperature(),1);lcd.print((char)223);lcd.print("C");// выводим значение температуры
 lcd.setCursor(0,2);
 //lcd.print(clock.dateFormat("D d M Y", DateTime));// выводим день недели, дату, месяц и год

 lcd.print(dn[DateTime.dayOfWeek+1]);lcd.print(" ");
 lcd.print(DateTime.day/10);lcd.print(DateTime.day%10);lcd.print(" ");
 lcd.print(DateTime.month/10);lcd.print(DateTime.month%10);lcd.print(" ");
 lcd.print(DateTime.year);
 
 }
if(digitalRead(3)==HIGH||digitalRead(4)==HIGH){ton=1;}
if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}
 
 if(w==0){pic();}
 if(w==1&&(DateTime.dayOfWeek<6)){pic();}
 if(w==2&&(DateTime.dayOfWeek>5)){pic();}
 
 eeprom++;
 delay(200);
 lcd.clear();
 
}
 
void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){tone(5,1200,500);delay(500);}}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <Wire.h>
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
DS3231 clock;RTCDateTime DateTime;
#include <LiquidCrystal.h>  
#include <EEPROM.h> //#include <EEPROMex.h> 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
 
int k,m,h,i,w,reg,ton;
byte rom0,rom1,rom2;
unsigned long eeprom;
char * dn[7]{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
 
void setup(){Serial.begin(9600);
   lcd.begin(16,2);// LCD 16X2 
   Wire.begin(); clock.begin();
   pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);
 //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);}
  rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);}
  rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);}
  m=rom0;h=rom1;w=rom2;
}
 
void loop(){i++;if(i>4){i=0;}
 if(digitalRead(2)==HIGH){k++;reg=1;delay(300);}if(k>3){k=0;reg=0;}
 
 if(reg==1) {
 if(k==1){
 if(digitalRead(3)==HIGH){m++;}if(m>59){m=59;}
 if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
 if(k==2){
 if(digitalRead(3)==HIGH){h++;}if(h>23){h=23;}
 if(digitalRead(4)==HIGH){h--;}if(h<0){h=0;}}
 if(k==3){
 if(digitalRead(3)==HIGH){w++;delay(300);}if(w>3){w=0;}
 if(digitalRead(4)==HIGH){w--;delay(300);}if(w<0){w=3;}
 } 
 lcd.setCursor(0,0);lcd.print("Alarm ");
 if(i==1&&k==2){lcd.print("  ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
 if(i==1&&k==1){lcd.print("  ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);} 
 lcd.setCursor(0,1);
 if(i==1&&k==3){lcd.print("                 ");}
 if(w==0){lcd.print("every day");}  //каждый день 1234567
 if(w==1){lcd.print("on weekdays");}//по будням 12345
 if(w==2){lcd.print("on weekends");}//по выходным 67
 if(w==3){lcd.print("off");}
 rom0=m;rom1=h;rom2=w;
 eeprom=0;
 }
 
 if(reg==0){if(eeprom==1){EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);}
 DateTime=clock.getDateTime();   // Считываем c часов текущие значения даты и времени в сущность DateTime
 lcd.setCursor(0,0);
 // lcd.print(clock.dateFormat("H:i:s ",DateTime));// выводим часы, минуты и секунды

 lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");
 lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
 lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);lcd.print("  ");
 
 lcd.print(clock.readTemperature(),1);lcd.print((char)223);//lcd.print("C");// выводим значение температуры
 lcd.setCursor(0,2);
 //lcd.print(clock.dateFormat("D d M Y", DateTime));// выводим день недели, дату, месяц и год

 lcd.print(dn[DateTime.dayOfWeek+1]);lcd.print(" ");
 lcd.print(DateTime.day/10);lcd.print(DateTime.day%10);lcd.print(" ");
 lcd.print(DateTime.month/10);lcd.print(DateTime.month%10);lcd.print(" ");
 lcd.print(DateTime.year);
 
 }
if(digitalRead(3)==HIGH||digitalRead(4)==HIGH){ton=1;}
if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}
 
 if(w==0){pic();}
 if(w==1&&(DateTime.dayOfWeek<6)){pic();}
 if(w==2&&(DateTime.dayOfWeek>5)){pic();}
 
 eeprom++;
 delay(200);
 lcd.clear();
 
}
 
void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){tone(5,1200,500);delay(500);}}

2

Re: Часы (DS3231) с будильником (Arduino)

Вот работаетhttp://forum.rcl-radio.ru/uploads/images/2020/02/ac08bf65438c10aae8bd67e518c29db3.jpg

3

Re: Часы (DS3231) с будильником (Arduino)

Да так намного лучше, еще поставить разделительные точки в показателе даты.
Я считаю будет лучше восприятие показанийhttp://forum.rcl-radio.ru/uploads/images/2020/02/8a088265c60edc1668fe12ac70b9a718.jpg

4

Re: Часы (DS3231) с будильником (Arduino)

#include <Wire.h>
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
DS3231 clock;RTCDateTime DateTime;
#include <LiquidCrystal.h>  
#include <EEPROM.h> //#include <EEPROMex.h> 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
 
int k,m,h,i,w,reg,ton;
byte rom0,rom1,rom2;
unsigned long eeprom;
char * dn[7]{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
 
void setup(){Serial.begin(9600);
   lcd.begin(16,2);// LCD 16X2 
   Wire.begin(); clock.begin();
   pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);
 //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);}
  rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);}
  rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);}
  m=rom0;h=rom1;w=rom2;
}
 
void loop(){i++;if(i>4){i=0;}
 if(digitalRead(2)==HIGH){k++;reg=1;delay(300);}if(k>3){k=0;reg=0;}
 
 if(reg==1) {
 if(k==1){
 if(digitalRead(3)==HIGH){m++;}if(m>59){m=59;}
 if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
 if(k==2){
 if(digitalRead(3)==HIGH){h++;}if(h>23){h=23;}
 if(digitalRead(4)==HIGH){h--;}if(h<0){h=0;}}
 if(k==3){
 if(digitalRead(3)==HIGH){w++;delay(300);}if(w>3){w=0;}
 if(digitalRead(4)==HIGH){w--;delay(300);}if(w<0){w=3;}
 } 
 lcd.setCursor(0,0);lcd.print("Alarm ");
 if(i==1&&k==2){lcd.print("  ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
 if(i==1&&k==1){lcd.print("  ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);} 
 lcd.setCursor(0,1);
 if(i==1&&k==3){lcd.print("                 ");}
 if(w==0){lcd.print("every day");}  //каждый день 1234567
 if(w==1){lcd.print("on weekdays");}//по будням 12345
 if(w==2){lcd.print("on weekends");}//по выходным 67
 if(w==3){lcd.print("off");}
 rom0=m;rom1=h;rom2=w;
 eeprom=0;
 }
 
 if(reg==0){if(eeprom==1){EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);}
 DateTime=clock.getDateTime();   // Считываем c часов текущие значения даты и времени в сущность DateTime
 lcd.setCursor(0,0);
 lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");
 lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
 lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);lcd.print("  ");
 lcd.print(clock.readTemperature(),1);lcd.print((char)223);//lcd.print("C");// выводим значение температуры
 lcd.setCursor(1,1);
 lcd.print(dn[DateTime.dayOfWeek+1]);lcd.print(".");
 lcd.print(DateTime.day/10);lcd.print(DateTime.day%10);lcd.print(".");
 lcd.print(DateTime.month/10);lcd.print(DateTime.month%10);lcd.print(".");
 lcd.print(DateTime.year);
 
 }
if(digitalRead(3)==HIGH||digitalRead(4)==HIGH){ton=1;}
if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}
 
 if(w==0){pic();}
 if(w==1&&(DateTime.dayOfWeek<6)){pic();}
 if(w==2&&(DateTime.dayOfWeek>5)){pic();}
 
 eeprom++;
 delay(200);
 lcd.clear();
 
}
 
void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){tone(5,1200,500);delay(500);}}

5

Re: Часы (DS3231) с будильником (Arduino)

подмаргивают показания на индикаторе.
Конденсаторы не помогают

6

Re: Часы (DS3231) с будильником (Arduino)

#include <Wire.h>
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
DS3231 clock;RTCDateTime DateTime;
#include <LiquidCrystal.h>  
#include <EEPROM.h> //#include <EEPROMex.h> 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
 
int k,m,h,i,w,reg,ton;
byte rom0,rom1,rom2;
unsigned long eeprom;
char * dn[7]{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
 
void setup(){Serial.begin(9600);
   lcd.begin(16,2);// LCD 16X2 
   Wire.begin(); clock.begin();
   pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);
 //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);}
  rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);}
  rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);}
  m=rom0;h=rom1;w=rom2;
}
 
void loop(){i++;if(i>4){i=0;}
 if(digitalRead(2)==HIGH){k++;reg=1;delay(300);}if(k>3){k=0;reg=0;}
 
 if(reg==1) {
 if(k==1){
 if(digitalRead(3)==HIGH){m++;}if(m>59){m=59;}
 if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
 if(k==2){
 if(digitalRead(3)==HIGH){h++;}if(h>23){h=23;}
 if(digitalRead(4)==HIGH){h--;}if(h<0){h=0;}}
 if(k==3){
 if(digitalRead(3)==HIGH){w++;delay(300);}if(w>3){w=0;}
 if(digitalRead(4)==HIGH){w--;delay(300);}if(w<0){w=3;}
 } 
 lcd.setCursor(0,0);lcd.print("Alarm ");
 if(i==1&&k==2){lcd.print("  ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
 if(i==1&&k==1){lcd.print("  ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);} 
 lcd.setCursor(0,1);
 if(i==1&&k==3){lcd.print("                 ");}
 if(w==0){lcd.print("every day");}  //каждый день 1234567
 if(w==1){lcd.print("on weekdays");}//по будням 12345
 if(w==2){lcd.print("on weekends");}//по выходным 67
 if(w==3){lcd.print("off");}
 rom0=m;rom1=h;rom2=w;
 eeprom=0;
 }
 
 if(reg==0){if(eeprom==1){EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);}
 DateTime=clock.getDateTime();   // Считываем c часов текущие значения даты и времени в сущность DateTime
 lcd.setCursor(0,0);
 lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");
 lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
 lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);lcd.print("  ");
 lcd.print(clock.readTemperature(),1);lcd.print((char)223);lcd.print("C");// выводим значение температуры
 lcd.setCursor(1,1);
 lcd.print(dn[DateTime.dayOfWeek+1]);lcd.print(".");
 lcd.print(DateTime.day/10);lcd.print(DateTime.day%10);lcd.print(".");
 lcd.print(DateTime.month/10);lcd.print(DateTime.month%10);lcd.print(".");
 lcd.print(DateTime.year);
 
 }
if(digitalRead(3)==HIGH||digitalRead(4)==HIGH){ton=1;}
if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}
 
 if(w==0){pic();}
 if(w==1&&(DateTime.dayOfWeek<6)){pic();}
 if(w==2&&(DateTime.dayOfWeek>5)){pic();}
 
 eeprom++;
 delay(200);
 if(reg==1){lcd.clear();}
 
}
 
void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){tone(5,1200,500);delay(500);}}

или


#include <Wire.h>
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
DS3231 clock;RTCDateTime DateTime;
#include <LiquidCrystal.h>  
#include <EEPROM.h> //#include <EEPROMex.h> 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
 
int k,m,h,i,w,reg,ton;
byte rom0,rom1,rom2;
unsigned long eeprom;
char * dn[7]{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
 
void setup(){Serial.begin(9600);
   lcd.begin(16,2);// LCD 16X2 
   Wire.begin(); clock.begin();
   pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);
 //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);}
  rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);}
  rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);}
  m=rom0;h=rom1;w=rom2;
}
 
void loop(){i++;if(i>4){i=0;}
 if(digitalRead(2)==HIGH){k++;reg=1;delay(300);}if(k>3){k=0;reg=0;}
 
 if(reg==1) {
 if(k==1){
 if(digitalRead(3)==HIGH){m++;}if(m>59){m=59;}
 if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
 if(k==2){
 if(digitalRead(3)==HIGH){h++;}if(h>23){h=23;}
 if(digitalRead(4)==HIGH){h--;}if(h<0){h=0;}}
 if(k==3){
 if(digitalRead(3)==HIGH){w++;delay(300);}if(w>3){w=0;}
 if(digitalRead(4)==HIGH){w--;delay(300);}if(w<0){w=3;}
 } 
 lcd.setCursor(0,0);lcd.print("Alarm ");
 if(i==1&&k==2){lcd.print("  ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
 if(i==1&&k==1){lcd.print("  ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);} 
 lcd.setCursor(0,1);
 if(i==1&&k==3){lcd.print("                 ");}
 if(w==0){lcd.print("every day");}  //каждый день 1234567
 if(w==1){lcd.print("on weekdays");}//по будням 12345
 if(w==2){lcd.print("on weekends");}//по выходным 67
 if(w==3){lcd.print("off");}
 rom0=m;rom1=h;rom2=w;
 eeprom=0;
 }
 
 if(reg==0){if(eeprom==1){EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);}
 DateTime=clock.getDateTime();   // Считываем c часов текущие значения даты и времени в сущность DateTime
 lcd.setCursor(0,0);
 lcd.print(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");
 lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
 lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);lcd.print("  ");
 lcd.print(clock.readTemperature(),1);lcd.print((char)223);//lcd.print("C");// выводим значение температуры
 lcd.setCursor(1,1);
 lcd.print(dn[DateTime.dayOfWeek+1]);lcd.print(".");
 lcd.print(DateTime.day/10);lcd.print(DateTime.day%10);lcd.print(".");
 lcd.print(DateTime.month/10);lcd.print(DateTime.month%10);lcd.print(".");
 lcd.print(DateTime.year);
 
 }
if(digitalRead(3)==HIGH||digitalRead(4)==HIGH){ton=1;}
if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}
 
 if(w==0){pic();}
 if(w==1&&(DateTime.dayOfWeek<6)){pic();}
 if(w==2&&(DateTime.dayOfWeek>5)){pic();}
 
 eeprom++;
 if(reg==0){delay(10);}else{delay(200);}
 lcd.clear();
 
}
 
void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){tone(5,1200,500);delay(500);}}

7 (2020-02-14 19:49:45 отредактировано sanj76a)

Re: Часы (DS3231) с будильником (Arduino)

первая прошивка работает  отлично (нет знака (с)).
Вторая моргает еше сильней, нижняя строка светит в пол яркости, не знака (С),
но не моргает

8

Re: Часы (DS3231) с будильником (Arduino)

Первую прошивку поправил (С).

9

Re: Часы (DS3231) с будильником (Arduino)

думаю нет смысла вторую править

10

Re: Часы (DS3231) с будильником (Arduino)

Месяц можно заменить на Jan Feb Mar и так далее

11 (2020-02-14 20:00:22 отредактировано sanj76a)

Re: Часы (DS3231) с будильником (Arduino)

перегрузил первую прошивка, все работает красиво.
Тест прошел нормально.
Думаю тему можно закрывать

12

Re: Часы (DS3231) с будильником (Arduino)

Не надо!!!
А почему вы все пишите на английском?

13

Re: Часы (DS3231) с будильником (Arduino)

У меня LCD не поддерживает англ., если у Вас LCD стоит больше 250 руб, то возможно он поддерживает рус. Тогда можно надписи переделать.

14

Re: Часы (DS3231) с будильником (Arduino)

Второй вариант часов с будильником на  базе драйвера TM1637. Пока едет от наших друзей модуль DS3231, решил собрать в Протеусе. Двоеточие не мигает ! что не так? пож

15

Re: Часы (DS3231) с будильником (Arduino)

В setup() в самый конец добавьте:
clock.setOutput(DS3231_1HZ);

16

Re: Часы (DS3231) с будильником (Arduino)

спс. прекрасно мигает! а можно регулировку яркости завести с фоторезистора? и включение кнопок поменять на обычное - замыканием на общий провод?

17

Re: Часы (DS3231) с будильником (Arduino)

Да, это не сложно. Как будете готовы к тестированию, сообщите.

18

Re: Часы (DS3231) с будильником (Arduino)

Да, это не сложно. Как будете готовы к тестированию, сообщите.

19

Re: Часы (DS3231) с будильником (Arduino)

DS3231 пока еще в пути. Но возможно всё тестировать и в Proteus .

20

Re: Часы (DS3231) с будильником (Arduino)

Укажите какой скетч используете.

21

Re: Часы (DS3231) с будильником (Arduino)

#include <Wire.h>
#include <TM1637Display.h>
#include <DS3231.h>
#include <EEPROM.h>  //#include <EEPROMex.h>
DS3231 clock; // ПОДКЛЮЧЕНИЕ DS3231 SDA, SCL, SQW / A4, A5, D6
RTCDateTime DateTime;
TM1637Display display(4, 5);// ПОДКЛЮЧЕНИЕ TM1637 CLK,DIO / 4, 5
int k, alarm_m, alarm_h;
byte w = 1, x, y, z, menu, ton, on = 1;
uint8_t date_s[] {0, 0, 0, 0}; // second
uint8_t date_t[] {0, 0, 0x63, 0x39}; // °C
uint8_t date_on[] {0, 0, 0x3f, 0x37}; // ON
uint8_t date_off[] {0, 0x3f, 0x71, 0x71}; // OFF

void setup() {
  clock.setDateTime(__DATE__, __TIME__);
  display.setBrightness(7);// яркость TM1637 0-7
  Wire.begin(); clock.begin();
  pinMode(6, INPUT); pinMode(10, INPUT_PULLUP); pinMode(11, INPUT_PULLUP); pinMode(12, INPUT_PULLUP);
  alarm_m = EEPROM.read(0); alarm_h = EEPROM.read(1); z = EEPROM.read(3); // ЧТЕНИЕ EEPROM
  clock.setOutput(DS3231_1HZ); // вход секундных импульсов
}

void loop() {
  DateTime = clock.getDateTime(); // ОПРОС ВРЕМЕНИ
  k = DateTime.hour * 100 + DateTime.minute; // ВРЕМЯ КАК ЧИСЛО ННММ

  if (digitalRead(6) == HIGH) {// МИГАНИЕ ДВОЕТОЧИЯ
    x = 0x40;
  } else {
    x = 0x00;
  }
  if (digitalRead(10) == LOW) { // ПЕРЕБОР МЕНЮ
    menu++;
    delay(300);
    if (menu > 6) {
      menu = 0;
    }
  }

  if (menu == 0) {
    y = true; if (w == 0) {
      EEPROM.update(0, alarm_m);
      EEPROM.update(1, alarm_h);
      EEPROM.update(3, z);// ПРИ ВЫХОДЕ ИЗ МЕНЮ ОБНОВЛЕНИЕ EEPROM
    }
    w = 1;
  }

  if (menu == 1) { // ВЫВОД СЕКУНД
    k = DateTime.second; date_s[2] = display.encodeDigit((k / 10) % 10);
    date_s[3] = display.encodeDigit((k % 10) % 10); display.setSegments(date_s);
  }

  if (menu == 2) {// ВЫВОД ДАТЫ И МЕСЯЦА
    k = DateTime.day * 100 + DateTime.month;
    x = 0x40;
  }

  if (menu == 3) { // ВЫВОД ТЕМПЕРАТУРЫ
    k = clock.readTemperature(); date_t[0] = display.encodeDigit((k / 10) % 10);
    date_t[1] = display.encodeDigit((k % 10) % 10); display.setSegments(date_t);
  }

  if (menu == 4) { // УСТАНОВКА БУДИЛЬНИКА
    y = true; x = 0x40; k = alarm_h * 100 + alarm_m;
    if (digitalRead(12) == LOW) {
      alarm_m++;  // МИНУТЫ БУДИЛЬНИКА
      delay(300);
    } if (alarm_m > 59) {
      alarm_m = 0;
    }
    if (digitalRead(11) == LOW) {
      alarm_h++;  // ЧАСЫ БУДИЛЬНИКА
      delay(500);
    } if (alarm_h > 23) {
      alarm_h = 0;
    }
    w = 0;
  }

  if (menu == 5) { // БУДИЛЬНИК ВКЛЮЧЕН/ВЫКЛЮЧЕН
    if (digitalRead(11) == LOW) {
      on = 1;  // БУДИЛЬНИК ВКЛЮЧЕН
      delay(300);
    } if (on == 1) {
      display.setSegments(date_on);
    }
    if (digitalRead(12) == LOW) {
      on = 0;  // БУДИЛЬНИК ВЫКЛЮЧЕН
      delay(300);
    } if (on == 0) {
      display.setSegments(date_off);
    }
  }

  if (menu == 6) {// НАСТРОЙКА ЯРКОСТИ ИНДИКАТОРА
    y = false; x = 0x00; k = z;
    if (digitalRead(11) == LOW) {
      z++;
      delay(500);
    } if (z > 7) {
      z = 0;
    }
    if (digitalRead(12) == LOW) {
      z--;
      delay(500);
    } if (z > 8) {
      z = 7;
    }
    w = 0;
  }

  if (digitalRead(11) == LOW || digitalRead(12) == LOW) { // ПРИ НАЖАТИИ НА КНОПУ + ИЛИ - ПРЕРЫВАЕТСЯ СИГНАЛ БУДИЛНИКА
    ton = 1;
  }
  if (DateTime.hour * 100 + DateTime.minute != alarm_h * 100 + alarm_m) {
    ton = 0;
  }
  if (on == 1) {
    pic();
  }

  display.setBrightness(z);
  if (menu == 3 || menu == 5 || menu == 1) {} else {
    display.showNumberDecEx(k, x, y);
  }

}
void pic() {  // СИГНАЛ БУДИЛЬНИКА, 7 ЦИФРОВОЙ ВЫХОД
  if (ton == 0 && (DateTime.hour * 100 + DateTime.minute == alarm_h * 100 + alarm_m)) {
    tone(7, 1000, 500);
    delay(1000);
  }
}

22

Re: Часы (DS3231) с будильником (Arduino)

С кнопками Вы сами справились, остается только только регулировка яркости при помощи фоторезистора.

В setup() добавьте:
pinMode(A0, INPUT_PULLUP); // питание фоторезистора будет от внутреннего подтягивающего резистора, тем самым образуется делитель напряжения.

Фоторезистор подключите к А0 и GND.

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

display.setBrightness(z);

переменная z меняться от 0 до 7, от нее зависит яркость индикатора
z = map(analogRead(A0), 300 , 1000 , 7, 0);
display.setBrightness(z);

или так

z = map(analogRead(A0), 300 , 1000 , 0, 7);
display.setBrightness(z);

в зависимости от характеристики фоторезистора (при увеличении освещения сопротивление увеличивается или наоборот)

если меню регулировки яркости не удалять то:

byte z1 = map(analogRead(A0), 300 , 1000 , z, 0);
display.setBrightness(z1);

или так

byte z1 = map(analogRead(A0), 300 , 1000 , 0, z);
display.setBrightness(z1);

цифры 300 и 1000 тоже надо уточнить, это минимальное и максимальное значение сопротивления фоторезистора при минимальном и максимальном освещении.

23

Re: Часы (DS3231) с будильником (Arduino)

#include <Wire.h>
#include <TM1637Display.h>
#include <DS3231.h>
#include <EEPROM.h>  //#include <EEPROMex.h>
DS3231 clock; // ПОДКЛЮЧЕНИЕ DS3231 SDA, SCL, SQW / A4, A5, D6
RTCDateTime DateTime;
TM1637Display display(4, 5);// ПОДКЛЮЧЕНИЕ TM1637 CLK,DIO / 4, 5
int k, alarm_m, alarm_h;
byte w = 1, x, y, z, menu, ton, on = 1;
uint8_t date_s[] {0, 0, 0, 0}; // second
uint8_t date_t[] {0, 0, 0x63, 0x39}; // °C
uint8_t date_on[] {0, 0, 0x3f, 0x37}; // ON
uint8_t date_off[] {0, 0x3f, 0x71, 0x71}; // OFF
#define BUTTON_PIN 10  // номер вывода кнопки равен 10
// переменные и константы для обработки сигнала кнопки
bool flagPress = false;   // признак кнопка в нажатом состоянии
bool flagClick = false;   // признак нажатия кнопки (фронт)
byte  buttonCount = 0;       // счетчик подтверждений состояния кнопки
#define TIME_BUTTON 10       // время устойчивого состояния кнопки (* 2 мс) 

void setup() {
  clock.setDateTime(__DATE__, __TIME__);
  Wire.begin(); clock.begin();
  pinMode(6, INPUT_PULLUP); pinMode(10, INPUT_PULLUP); pinMode(11, INPUT_PULLUP); pinMode(12, INPUT_PULLUP); pinMode(A0, INPUT_PULLUP);
  alarm_m = EEPROM.read(0); alarm_h = EEPROM.read(1); // ЧТЕНИЕ EEPROM
  clock.setOutput(DS3231_1HZ); // вход секундных импульсов
}


void loop() {
  DateTime = clock.getDateTime(); // ОПРОС ВРЕМЕНИ
  k = DateTime.hour * 100 + DateTime.minute; // ВРЕМЯ КАК ЧИСЛО ННММ
  z = map(analogRead(A0), 100 , 1000 , 1, 7);
  display.setBrightness(z);// яркость TM1637 0-7
  if (digitalRead(6) == HIGH) // МИГАНИЕ ДВОЕТОЧИЯ
  {
    x = 0x40;
  }
  else
  {
    x = 0x00;
  }
  if ( flagPress == (! digitalRead(BUTTON_PIN)) )
  {
    buttonCount = 0; // сброс счетчика подтверждений состояния кнопки
  }
  else {
    buttonCount++;   // +1 к счетчику состояния кнопки

    if ( buttonCount >= TIME_BUTTON )
    {
      flagPress = ! flagPress; // инверсия признака состояния
      buttonCount = 0; // сброс счетчика подтверждений состояния кнопки
      if ( flagPress == true ) flagClick = true; // признак фронта кнопки на нажатие
    }
  }
  if ( flagClick == true ) // было нажатие кнопки
  {
    flagClick = false;      // сброс признака фронта кнопки
    menu++;  // ПЕРЕБОР МЕНЮ
    delay(2);
    if (menu > 5) {
      menu = 0;
    }
  }
  if (menu == 0) {
    y = true; if (w == 0) {
      EEPROM.update(0, alarm_m);
      EEPROM.update(1, alarm_h);
      // ПРИ ВЫХОДЕ ИЗ МЕНЮ ОБНОВЛЕНИЕ EEPROM
    }
    w = 1;
  }

  if (menu == 1) { // ВЫВОД СЕКУНД
    k = DateTime.second; date_s[2] = display.encodeDigit((k / 10) % 10);
    date_s[3] = display.encodeDigit((k % 10) % 10); display.setSegments(date_s);
  }

  if (menu == 2) {// ВЫВОД ДАТЫ И МЕСЯЦА
    k = DateTime.day * 100 + DateTime.month;
    x = 0x40;
  }

  if (menu == 3) { // ВЫВОД ТЕМПЕРАТУРЫ
    k = clock.readTemperature(); date_t[0] = display.encodeDigit((k / 10) % 10);
    date_t[1] = display.encodeDigit((k % 10) % 10); display.setSegments(date_t);
  }

  if (menu == 4) { // УСТАНОВКА БУДИЛЬНИКА
    y = true; x = 0x40; k = alarm_h * 100 + alarm_m;
    if (digitalRead(12) == LOW) {
      alarm_m++;  // МИНУТЫ БУДИЛЬНИКА
      delay(300);
    } if (alarm_m > 59) {
      alarm_m = 0;
    }
    if (digitalRead(11) == LOW) {
      alarm_h++;  // ЧАСЫ БУДИЛЬНИКА
      delay(500);
    } if (alarm_h > 23) {
      alarm_h = 0;
    }
    w = 0;
  }

  if (menu == 5) { // БУДИЛЬНИК ВКЛЮЧЕН/ВЫКЛЮЧЕН
    if (digitalRead(11) == LOW) {
      on = 1;  // БУДИЛЬНИК ВКЛЮЧЕН
      delay(300);
    } if (on == 1) {
      display.setSegments(date_on);
    }
    if (digitalRead(12) == LOW) {
      on = 0;  // БУДИЛЬНИК ВЫКЛЮЧЕН
      delay(300);
    } if (on == 0) {
      display.setSegments(date_off);
    }
  }

  if (digitalRead(11) == LOW || digitalRead(12) == LOW) { // ПРИ НАЖАТИИ НА КНОПУ + ИЛИ - ПРЕРЫВАЕТСЯ СИГНАЛ БУДИЛНИКА
    ton = 1;
  }
  if (DateTime.hour * 100 + DateTime.minute != alarm_h * 100 + alarm_m) {
    ton = 0;
  }
  if (on == 1) {
    pic();
  }

  if (menu == 3 || menu == 5 || menu == 1)
  {
  }
  else
  {
    display.showNumberDecEx(k, x, y);
  }
}

void pic() {  // СИГНАЛ БУДИЛЬНИКА, 7 ЦИФРОВОЙ ВЫХОД
  if (ton == 0 && (DateTime.hour * 100 + DateTime.minute == alarm_h * 100 + alarm_m)) {
    tone(7, 1000, 100);
    delay(300);
    tone(7, 1000, 100);
    delay(1000);
  }
}

24 (2021-02-23 07:32:54 отредактировано sanj76a)

Re: Часы (DS3231) с будильником (Arduino)

нужен второй датчик температуры.
и LCD на шину i2c