Часы с будильником DS3231 и lcd 16*2 i2c

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Искал в интернете простенькую настройку часов с функцией будильника. То что понравилось бы мне я не нашел, и пришлось гавнокодить самому. Конечно я не программист, но может кому пригодится. Тут еще добавлен датчик влажности SI7021. А еще не дописана функция настройки автоматической подсветки. Но есть ручная, что впринципе устраивает. Вообщем кому надо переделают этот код под себя без особых проблем.

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

//кнопка 0    AL.S
//кнопка 1    +
//кнопка 2    -
//кнопка 3    T.S
//кнопка 4    AL.PAUSE
//кнопка 5    ON/OFF   //не используется
//           button[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9].***
#define BUTTON_PIN   2,  3,  4,  5,  6,  7 //, 11, 21, 14, 22 // pins & buttons ***
// #define DURATION_BOUNCE           10 // custom settings
// #define DURATION_CLICK_DB        300
// #define DURATION_INACTIVITY_DN  1000
// #define DURATION_INACTIVITY_UP 5000   
#include <BUTTON.h>
#include <Wire.h>
#include <DS3231.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
DS3231  rtc(SDA, SCL);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Time RTC_Time;

int light = 11; //подсветка дисплея
int buzz = 10;  //пьезо пищалка
float brightness = 255.00;     //начальное значение яркости
float fadeAmount = 25.50;    //шаг яркости
int flagRead=0;   //переменные для блинка
int flagReadA=0;   //переменные для автовыключения будильника
int alarm_on = 0;   //включение будильника
int regim=1; // режимы часов
//int regim_light=1; //режим для яркости
int se=0; //настройка секунд
int th=0; //настройка часов времени
int tm=0; //настройка минут времени
int ah=0; //настройка часов будильника
int am=0; //настройка минут будильника
int as=0; //секунды будильника
int da=0; //число
int mo=0; //месяц
int we=0; //день недели
int ye=0; //год
int auto_light = 0;  //режим автолайт по умолчанию выключен
int th_night = 0;  //часы включения ночного режима
int tm_night = 0; //минуты включения ночного режима
int th_day = 0;  //часы включения дневного режима
int tm_day = 0;  //минуты включения дневного режима
int light_night = 0;  //яркость ночного режима
int light_day = 0; //яркость дневного режима
int addr_al = 0;  //ячейка EEPROM состояние будильника
int addr_ah = 1;  //ячейка EEPROM часы в будильнике
int addr_am = 2;  //ячейка EEPROM минуты в будильнике
int addr_li = 10;  //ячейка EEPROM уровень яркости дисплея
int addr_th_night = 20;    //ячейка EEPROM время включения часов ночного режима
int addr_tm_night = 30;   //ячейка EEPROM время включения минут ночного режима
int addr_th_day = 40;    //ячейка EEPROM время включения часов дневного режима
int addr_tm_day = 50;   //ячейка EEPROM время включения минут дневного режима
int addr_light_night = 60;   //ячейка EEPROM яркость  ночного режима
int addr_light_day = 70;   //ячейка EEPROM яркость дневного режима
int addr_auto_light = 80;  //ячейка EEPROM режим автолайт состояние
char* weekday[8] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; //массив настройки дня недели
uint8_t bell[8]  = {0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4};   //колокольчик
uint8_t temp_cel[8] = {B00111, B00101, B00111, B00000, B00000, B00000, B00000};  //значок градуса

const int ADDR =0x40;            //si7021
int Y0,Y1,Y2,Y3;           //si7021
double Y,Y_out1,Y_out2;  //si7021



void setup() {
  Serial.begin(9600);
// button_pin_auto;
   button_pin_pullUp;
// button_pin_pullDn;
   pinMode(light, OUTPUT);
   pinMode(buzz, OUTPUT);
   Wire.begin();
   rtc.begin();
   lcd.begin();
   lcd.clear();
   lcd.createChar(0, bell);  //колокольчик
   lcd.createChar(1, temp_cel); //цельсии
   Wire.beginTransmission(ADDR);  //si7021
   Wire.endTransmission();        //si7021
}

void read_RTC(){
  RTC_Time = rtc.getTime();
  se = RTC_Time.sec;
  th = RTC_Time.hour;
  tm = RTC_Time.min;
  da = RTC_Time.date;
  mo = RTC_Time.mon;
  ye = RTC_Time.year;
  we = RTC_Time.dow;}

void printTime(){
  button_read;
  read_RTC();
  Wire.beginTransmission(ADDR);
  Wire.write(0xE3);
  Wire.endTransmission();
  Wire.beginTransmission(ADDR);                     
  Wire.write(0xE5);
  Wire.endTransmission(); 
  Wire.requestFrom(ADDR,2);
  if(Wire.available()<=2);{
    Y0 = Wire.read();
    Y2=Y0/100; 
    Y0=Y0%100;
    Y1 = Wire.read();
    Y_out1 = Y2*25600;
    Y_out2 = Y0*256+Y1;}
  Y_out1 = (125*Y_out1)/65536;                     
  Y_out2 = (125*Y_out2)/65536;
  Y = Y_out1+Y_out2;
  Y=Y-6;
  if (button[3].event_click_Dn      == 1) {SET_T();}
  if (button[0].event_click_Dn      == 1) {lcd.clear();SET_A();}
  if (button[2].event_click_Dn      == 1) {lcd.clear();SET_AUTO_LIGHT();}
  lcd.setCursor(0, 0);
  lcd.print(rtc.getTimeStr(FORMAT_SHORT)); //показать время
  auto_light = EEPROM.read(addr_auto_light); //читаем состояние автолайт
  alarm_on = EEPROM.read(addr_al); //читаем состояние буудильника
  ah = EEPROM.read(addr_ah);
  am = EEPROM.read(addr_am);
  blink_temp_rh(flagRead * 3000);  //показ температуры и влажности (смена каждые 3 сек)
  lcd.setCursor(0, 1);
  lcd.print(rtc.getDateStr());//показать дату
  lcd.setCursor(13, 1);
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));  //показать день недели 
  if(alarm_on == 1){
  lcd.setCursor(5, 0);lcd.write(0);   //показать колокольчик
  if(th==ah && tm==am && se==as){lcd.clear();Alarm_work();}}
  else{lcd.setCursor(5, 0);lcd.print(" ");}}


void blink_temp_rh(unsigned long interval){
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
      lcd.clear();
      lcd.setCursor(9, 0);
      lcd.print(rtc.getTemp());  //температура
      lcd.write(1);  //значок цельсий
      lcd.print("C");   //цельсия
    }
    else{
        lcd.clear();
        lcd.setCursor(8, 0);
        lcd.print("RH");
        lcd.print(Y);
        lcd.print("%");
      flagRead = 1;}}}

void SET_T(){
  read_RTC();
  regim=2;
  while(regim==2){  //установка часов
    button_read;
    blink_th(flagRead * 250);
    if (button[1].event_click_Dn      == 1) {th++;}
    if (button[2].event_click_Dn      == 1) {th--;}
    if(th>23){th=0;}if(th<0){th=23;}
    if (button[3].event_click_Dn      == 1) {regim++;}}
  while(regim==3){   //установка минут
    button_read;
    blink_tm(flagRead * 250);
    if (button[1].event_click_Dn      == 1) {tm++;}
    if (button[2].event_click_Dn      == 1) {tm--;}
    if(tm>59){tm=0;}if(tm<0){tm=59;}
    if (button[3].event_click_Dn      == 1) {rtc.setTime(th, tm, se);regim++;}}
  while(regim==4){  //установка числа
    button_read;
    blink_da(flagRead * 250);
    if (button[1].event_click_Dn      == 1) {da++;}
    if (button[2].event_click_Dn      == 1) {da--;}    
    if(da>31){da=1;}if(da<1){da=31;}
    if (button[3].event_click_Dn      == 1) {regim++;}}
  while(regim==5){   //установка месяца
    button_read;
    blink_mo(flagRead * 250);
    if (button[1].event_click_Dn      == 1) {mo++;}
    if (button[2].event_click_Dn      == 1) {mo--;}
    if(mo>12){mo=1;}if(mo<1){mo=12;}
    if (button[3].event_click_Dn      == 1) {regim++;}}
  while(regim==6){   //установка года
    button_read;
    blink_ye(flagRead * 250);
    if (button[1].event_click_Dn      == 1) {ye++;}
    if (button[2].event_click_Dn      == 1) {ye--;}
    if(ye>2100){ye=2017;}if(ye<2017){ye=2100;}
    if (button[3].event_click_Dn      == 1) {rtc.setDate(da, mo, ye);regim++;}}    
  while(regim==7){   //установка дня недели
    button_read;
    blink_we(flagRead * 250);
    if (button[1].event_click_Dn      == 1) {we++;}
    if (button[2].event_click_Dn      == 1) {we--;}
    if(we>7){we=1;}if(we<1){we=7;}
    if (button[3].event_click_Dn      == 1) {rtc.setDOW(we);regim=1;lcd.clear();}}}
   
 void blink_th(unsigned long interval){   //мигаем переменной часов в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
  lcd.clear();
  if(th<10){
  lcd.setCursor(0, 0);
  lcd.print("0");
  lcd.setCursor(1, 0);}
  lcd.print(th); //показать врем
  lcd.print(":");
  if(tm<10){
  lcd.setCursor(3, 0);
  lcd.print("0");
  lcd.setCursor(4, 0);}
  lcd.print(tm);
  lcd.setCursor(9, 0);
  lcd.print(rtc.getTemp());  //среднее значение с 3 датчиков
  lcd.write(1);  //значок цельсий
  lcd.print("C");   //цельсия
  if(da<10){
  lcd.setCursor(0, 1);
  lcd.print("0");
  lcd.setCursor(1, 1);}
  else{lcd.setCursor(0, 1);}
  lcd.print(da);//показать дату
  lcd.print(".");
  if(mo<10){
  lcd.setCursor(3, 1);
  lcd.print("0");
  lcd.setCursor(4, 1);}
  lcd.print(mo);
  lcd.print(".");
  lcd.print(ye);
  lcd.print("   ");
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели 
    flagRead = 1;}
    else{
    lcd.setCursor(0, 0);
    lcd.print("  ");
    flagRead = 1;}}}

 void blink_tm(unsigned long interval){   //мигаем переменной минут в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
  lcd.clear();
  if(th<10){
  lcd.setCursor(0, 0);
  lcd.print("0");
  lcd.setCursor(1, 0);}
  lcd.print(th); //показать врем
  lcd.print(":");
  if(tm<10){
  lcd.setCursor(3, 0);
  lcd.print("0");
  lcd.setCursor(4, 0);}
  lcd.print(tm);
  lcd.setCursor(9, 0);
  lcd.print(rtc.getTemp());  //среднее значение с 3 датчиков
  lcd.write(1);  //значок цельсий
  lcd.print("C");   //цельсия
  if(da<10){
  lcd.setCursor(0, 1);
  lcd.print("0");
  lcd.setCursor(1, 1);}
  else{lcd.setCursor(0, 1);}  
  lcd.print(da);//показать дату
  lcd.print(".");
  if(mo<10){
  lcd.setCursor(3, 1);
  lcd.print("0");
  lcd.setCursor(4, 1);}
  else{lcd.setCursor(3, 1);}
  lcd.print(mo);
  lcd.print(".");
  lcd.print(ye);
  lcd.print("   ");
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели 
    flagRead = 1;}
    else{
    lcd.setCursor(3, 0);
    lcd.print("  ");
    flagRead = 1;}}}

 void blink_da(unsigned long interval){   //мигаем переменной число в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
  lcd.clear();
  if(th<10){
  lcd.setCursor(0, 0);
  lcd.print("0");
  lcd.setCursor(1, 0);}
  lcd.print(th); //показать врем
  lcd.print(":");
  if(tm<10){
  lcd.setCursor(3, 0);
  lcd.print("0");
  lcd.setCursor(4, 0);}
  lcd.print(tm);
  lcd.setCursor(9, 0);
  lcd.print(rtc.getTemp());  //среднее значение с 3 датчиков
  lcd.write(1);  //значок цельсий
  lcd.print("C");   //цельсия
  if(da<10){
  lcd.setCursor(0, 1);
  lcd.print("0");
  lcd.setCursor(1, 1);}
  else{lcd.setCursor(0, 1);}
  lcd.print(da);//показать дату
  lcd.print(".");
  if(mo<10){
  lcd.setCursor(3, 1);
  lcd.print("0");
  lcd.setCursor(4, 1);}
  else{lcd.setCursor(3, 1);}
  lcd.print(mo);
  lcd.print(".");
  lcd.print(ye);
  lcd.print("   ");
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели 
    flagRead = 1;}
    else{
    lcd.setCursor(0, 1);
    lcd.print("  ");
    flagRead = 1;}}}

 void blink_mo(unsigned long interval){   //мигаем переменной месяц в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
  lcd.clear();
  if(th<10){
  lcd.setCursor(0, 0);
  lcd.print("0");
  lcd.setCursor(1, 0);}
  lcd.print(th); //показать врем
  lcd.print(":");
  if(tm<10){
  lcd.setCursor(3, 0);
  lcd.print("0");
  lcd.setCursor(4, 0);}
  lcd.print(tm);
  lcd.setCursor(9, 0);
  lcd.print(rtc.getTemp());  //среднее значение с 3 датчиков
  lcd.write(1);  //значок цельсий
  lcd.print("C");   //цельсия
  if(da<10){
  lcd.setCursor(0, 1);
  lcd.print("0");
  lcd.setCursor(1, 1);}
  else{lcd.setCursor(0, 1);}
  lcd.print(da);//показать дату
  lcd.print(".");
  if(mo<10){
  lcd.setCursor(3, 1);
  lcd.print("0");
  lcd.setCursor(4, 1);}
  else{lcd.setCursor(3, 1);}
  lcd.print(mo);
  lcd.print(".");
  lcd.print(ye);
  lcd.print("   ");
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели 
    flagRead = 1;}
    else{
    lcd.setCursor(3, 1);
    lcd.print("  ");
    flagRead = 1;}}}

 void blink_ye(unsigned long interval){   //мигаем переменной год в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
  lcd.clear();
  if(th<10){
  lcd.setCursor(0, 0);
  lcd.print("0");
  lcd.setCursor(1, 0);}
  lcd.print(th); //показать врем
  lcd.print(":");
  if(tm<10){
  lcd.setCursor(3, 0);
  lcd.print("0");
  lcd.setCursor(4, 0);}
  lcd.print(tm);
  lcd.setCursor(9, 0);
  lcd.print(rtc.getTemp());  //среднее значение с 3 датчиков
  lcd.write(1);  //значок цельсий
  lcd.print("C");   //цельсия
  if(da<10){
  lcd.setCursor(0, 1);
  lcd.print("0");
  lcd.setCursor(1, 1);}
  else{lcd.setCursor(0, 1);}
  lcd.print(da);//показать дату
  lcd.print(".");
  if(mo<10){
  lcd.setCursor(3, 1);
  lcd.print("0");
  lcd.setCursor(4, 1);}
  else{lcd.setCursor(3, 1);}
  lcd.print(mo);
  lcd.print(".");
  lcd.print(ye);
  lcd.print("   ");
  lcd.print(rtc.getDOWStr(FORMAT_SHORT));//показать день недели 
    flagRead = 1;}
    else{
    lcd.setCursor(6, 1);
    lcd.print("    ");
    flagRead = 1;}}}

 void blink_we(unsigned long interval){   //мигаем переменной день недели в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
  lcd.clear();
  if(th<10){
  lcd.setCursor(0, 0);
  lcd.print("0");
  lcd.setCursor(1, 0);}
  lcd.print(th); //показать врем
  lcd.print(":");
  if(tm<10){
  lcd.setCursor(3, 0);
  lcd.print("0");
  lcd.setCursor(4, 0);}
  lcd.print(tm);
  lcd.setCursor(9, 0);
  lcd.print(rtc.getTemp());  //среднее значение с 3 датчиков
  lcd.write(1);  //значок цельсий
  lcd.print("C");   //цельсия
  if(da<10){
  lcd.setCursor(0, 1);
  lcd.print("0");
  lcd.setCursor(1, 1);}
  else{lcd.setCursor(0, 1);}
  lcd.print(da);//показать дату
  lcd.print(".");
  if(mo<10){
  lcd.setCursor(3, 1);
  lcd.print("0");
  lcd.setCursor(4, 1);}
  else{lcd.setCursor(3, 1);}
  lcd.print(mo);
  lcd.print(".");
  lcd.print(ye);
  lcd.print("   ");
  if(we==7){lcd.print(weekday[0]);}  //показать день недели
  if(we==1){lcd.print(weekday[1]);}
  if(we==2){lcd.print(weekday[2]);}
  if(we==3){lcd.print(weekday[3]);}
  if(we==4){lcd.print(weekday[4]);}
  if(we==5){lcd.print(weekday[5]);}
  if(we==6){lcd.print(weekday[6]);}
    flagRead = 1;}
    else{
    lcd.setCursor(13, 1);
    lcd.print("   ");
    flagRead = 1;}}}



void SET_A(){
  regim=2;
  while(regim==2){  //включение отключение будильника
    button_read;
    if (button[1].event_click_Dn      == 1) {alarm_on = !alarm_on;lcd.clear();}
    if (button[2].event_click_Dn      == 1) {alarm_on = !alarm_on;lcd.clear();}
    lcd.setCursor(3, 0);
    lcd.print("Alarm");
    if(alarm_on == 1){blink_alarm_on(flagRead * 250);}
    else{blink_alarm_off(flagRead * 250);}
    ah = EEPROM.read(addr_ah);
    am = EEPROM.read(addr_am);
    lcd.setCursor(5, 1);
    if(ah<10){lcd.setCursor(5, 1);lcd.print("0");lcd.setCursor(6, 1);}
    lcd.print(ah);
    lcd.setCursor(7, 1);
    lcd.print(":");
    if(am<10){lcd.setCursor(8, 1);lcd.print("0");lcd.setCursor(9, 1);}
    lcd.print(am);
    if (button[0].event_click_Dn      == 1) {regim++;}}
  while(regim==3){  //установка часов будильника
    button_read;
    blink_ah(flagRead * 250);
    if (button[1].event_click_Dn      == 1) {ah++;}
    if (button[2].event_click_Dn      == 1) {ah--;}
    if(ah>23){ah=0;}if(ah<0){ah=23;}
    if (button[0].event_click_Dn      == 1) {regim++;}}
  while(regim==4){  //установка минут будильника
    button_read;
    blink_am(flagRead * 250);
    if (button[1].event_click_Dn      == 1) {am++;}
    if (button[2].event_click_Dn      == 1) {am--;}
    if(am>59){am=0;}if(am<0){am=59;}
    if (button[0].event_click_Dn      == 1) {
      lcd.clear();
      EEPROM.write(addr_al, alarm_on);
      EEPROM.write(addr_ah, ah);
      EEPROM.write(addr_am, am);
      regim=1;}}}

void blink_alarm_on(unsigned long interval){
      static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
    lcd.setCursor(10, 0);lcd.print("on");}
    else{lcd.setCursor(10, 0);lcd.print("  ");flagRead = 1;}}}

void blink_alarm_off(unsigned long interval){
      static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){lcd.setCursor(10, 0);lcd.print("off");}
    else{lcd.setCursor(10, 0);lcd.print("   ");flagRead = 1;}}}

 void blink_ah(unsigned long interval){   //мигаем переменной включаем будильник
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print("Alarm");
    if(alarm_on == 1){lcd.setCursor(10, 0);lcd.print("on");}
    else{lcd.setCursor(10, 0);lcd.print("off");}
    lcd.setCursor(5, 1);
    if(ah<10){lcd.setCursor(5, 1);lcd.print("0");lcd.setCursor(6, 1);}
    lcd.print(ah);
    lcd.setCursor(7, 1);
    lcd.print(":");
    if(am<10){lcd.setCursor(8, 1);lcd.print("0");lcd.setCursor(9, 1);}
    lcd.print(am);
    flagRead = 1;}
    else{lcd.setCursor(5, 1);lcd.print("  ");flagRead = 1;}}}

 void blink_am(unsigned long interval){   //мигаем переменной включаем будильник
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print("Alarm");
    if(alarm_on == 1){lcd.setCursor(10, 0);lcd.print("on");}
    else{lcd.setCursor(10, 0);lcd.print("off");}
    lcd.setCursor(5, 1);
    if(ah<10){lcd.setCursor(5, 1);lcd.print("0");lcd.setCursor(6, 1);}
    lcd.print(ah);
    lcd.setCursor(7, 1);
    lcd.print(":");
    lcd.setCursor(8, 1);
    if(am<10){lcd.setCursor(8, 1);lcd.print("0");lcd.setCursor(9, 1);}
    lcd.print(am);
    flagRead = 1;}
    else{lcd.setCursor(8, 1);lcd.print("  ");flagRead = 1;}}}

void Alarm_work(){
  regim=2;
  while(regim==2){
  button_read;
  light_lcd();  //почему то мигает дисплеем(может так и лучше???)
  //if(auto_light==1){auto_light_on();}
  Alarm_buzz(flagRead * 500);
  lcd.setCursor(0, 0);
  lcd.print("Alarm activated!");
  lcd.setCursor(4, 1);  
  lcd.print(rtc.getTimeStr()); //показать время
  Alarm_auto_off(flagReadA * 30000);  //автовыключение будильника через 30 сек (получилось что через минуту???)
  if (button[4].event_click_Dn      == 1) {noTone(buzz);lcd.clear();regim=1;}}}

void Alarm_buzz(unsigned long interval){   //пищим будильником
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
  tone(buzz, 500, 500);
    flagRead = 1;}
    else{
      tone(buzz, 1000, 500);
      flagRead = 1;}}}

void Alarm_auto_off(unsigned long interval){   ////автовыключение будильника через 30 сек
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
    noTone(buzz);lcd.clear();regim=1;
    flagReadA = 1;}}}

void SET_AUTO_LIGHT(){
  regim=2;
  while(regim==2){  //включение-отключение автолайт
    button_read;
    if (button[1].event_click_Dn      == 1) {auto_light = !auto_light;lcd.clear();}
    if (button[2].event_click_Dn      == 1) {auto_light = !auto_light;lcd.clear();}
    lcd.setCursor(0, 0);
    lcd.print("Auto light:");
    if(auto_light == 1){blink_auto_light_on(flagRead * 250);}
    else{blink_auto_light_off(flagRead * 250);}
    
    if (auto_light==1 && button[3].event_click_Dn      == 1) {
      lcd.clear();
      EEPROM.write(addr_auto_light, auto_light);
      regim++;
    }
      if (auto_light==0 && button[3].event_click_Dn      == 1) {
      lcd.clear();
      EEPROM.write(addr_auto_light, auto_light);
      regim=9;
    }
  }
  while(regim==3){  //установка часов включения ночного режима
    button_read;
    if (button[1].event_click_Dn      == 1) {th_night++;}
    if (button[2].event_click_Dn      == 1) {th_night--;}

        if (button[3].event_click_Dn      == 1) {
      lcd.clear();
      EEPROM.write(addr_th_night, th_night);
      regim++;
    }
  }
  while(regim==4){  //установка минут включения ночного режима
    button_read;
    if (button[1].event_click_Dn      == 1) {tm_night++;}
    if (button[2].event_click_Dn      == 1) {tm_night--;}

      if (button[3].event_click_Dn      == 1) {
      lcd.clear();
      EEPROM.write(addr_tm_night, tm_night);
      regim++;
    }
  }
  while(regim==5){  //установка яркости ночного режима
    button_read;
    if (button[1].event_click_Dn      == 1) {light_night++;}
    if (button[2].event_click_Dn      == 1) {light_night--;}

      if (button[3].event_click_Dn      == 1) {
      lcd.clear();
      EEPROM.write(addr_light_night, light_night);
      regim++;
    }
  }
    while(regim==6){  //установка часов включениядневного режима
    button_read;
    if (button[1].event_click_Dn      == 1) {th_day++;}
    if (button[2].event_click_Dn      == 1) {th_day--;}

      if (button[3].event_click_Dn      == 1) {
      lcd.clear();
      EEPROM.write(addr_th_day, th_day);
      regim++;
    }
  }
    while(regim==7){  //установка минут включения дневного режима
    button_read;
    if (button[1].event_click_Dn      == 1) {tm_day++;}
    if (button[2].event_click_Dn      == 1) {tm_day--;}

      if (button[3].event_click_Dn      == 1) {
      lcd.clear();
      EEPROM.write(addr_tm_day, tm_day);
      regim++;
    }
  }
    while(regim==8){  //установка яркости дневного режима
    button_read;
    if (button[1].event_click_Dn      == 1) {light_day++;}
    if (button[2].event_click_Dn      == 1) {light_day--;}

    if (button[3].event_click_Dn      == 1) {
    lcd.clear();
    EEPROM.write(addr_light_day, light_day);
    regim=1;
     }
   }
    while(regim==9){  //установка яркости обычного режима
    button_read;
    if (button[1].event_click_Dn      == 1) {if(brightness < 255){brightness = brightness + fadeAmount;}}
    if (button[2].event_click_Dn      == 1) {if(brightness > 0){lcd.clear();brightness = brightness - fadeAmount;}}
    //Serial.println(brightness);
    lcd.setCursor(3, 0);
    lcd.print("Set light");
    lcd.setCursor(5, 1);
    lcd.print(brightness/255*100);
    if(brightness < 255){lcd.setCursor(10, 1);lcd.print("%");}
    else{lcd.setCursor(11, 1);lcd.print("%");}
    analogWrite(light, brightness);
    if (button[3].event_click_Dn      == 1) {
      EEPROM.put(addr_li, brightness);
      lcd.clear();regim=1;}}}



void blink_auto_light_on(unsigned long interval){
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
    lcd.setCursor(12, 0);lcd.print("on");}
    else{lcd.setCursor(12, 0);lcd.print("  ");flagRead = 1;}}}

void blink_auto_light_off(unsigned long interval){
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){lcd.setCursor(12, 0);lcd.print("off");}
    else{lcd.setCursor(12, 0);lcd.print("   ");flagRead = 1;}}}


void light_lcd(){
  //brightness = EEPROM.read(addr_li);
  EEPROM.get(addr_li, brightness);
  analogWrite(light, brightness);
  //Serial.println(brightness);
  //Serial.println("light_lcd");
}

void auto_light_on(){
  EEPROM.get(addr_li, brightness);
  analogWrite(light, brightness);
  //Serial.println(brightness);
  //Serial.println("auto_light_on");
}


void loop() {

    if(regim==1){printTime();}
    if(auto_light==0){light_lcd();}
    if(auto_light==1){auto_light_on();}

}







 

bizzon
Offline
Зарегистрирован: 29.03.2016

А откуда библиотека  BUTTON.h ? Ссылочку хочу.

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015
bizzon
Offline
Зарегистрирован: 29.03.2016

Вот же блин.. Не дочитал. Спасибо.

bester
Offline
Зарегистрирован: 25.06.2016

Тоже не могу эту библиотеку найти

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Вот прямая ссылка на библиотеку https://dl.dropboxusercontent.com/u/3671035/BUTTON_v4f/BUTTON_v4f.zip

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А эти откуда, с моими не компилируется

#include <DS3231.h>
#include <LiquidCrystal_I2C.h>

 

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Вот все мои библиотеки

https://yadi.sk/d/OHJTrtEp3FdTvr

 

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

и контакт где написано LED посадить на 11 пин ардуинки. это нужно для управлением яркостью дисплея.

VITCHINOFF
Offline
Зарегистрирован: 14.03.2017

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

IvanZah
Offline
Зарегистрирован: 26.03.2017

Подозреваю что половину кода (большую). Есть куча примеров на ваш индикатор, спросите у гугла)

veroni0803
Offline
Зарегистрирован: 18.01.2018

А нельзя ли разместить схему часов или кратенькое описание работы кнопок. Хочу сделать такие часы на DS3231. Там ведь есть два будильника, надо ли использовать ардуиновский еепром?