Помогите пожалуйста с часами

Тема в разделе "Arduino & Shields", создана пользователем tukaj, 9 ноя 2021.

  1. tukaj

    tukaj Нуб

    Помогите пожалуйста, знающие люди. Собрал часы https://rcl-radio.ru/?p=66530, но есть одно но, кнопками можно установить только будильник, надо чтобы можно было настроить и часы. При вынимании батарейки обнуляется и надо ждать 00.00. Спасибо большое. часыбуд1602_I2c.gif


    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h> //Библиотека - http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
    #include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.zip
    #include <EEPROM.h>
    DS3231 clock;RTCDateTime DateTime;
    LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
    byte v1[8] = {31,31,31,31,31,31,31,31};
    byte v2[8] = {31,31,31, 0, 0, 0, 0, 0};
    byte v3[8] = { 0, 0, 0, 0, 0,31,31,31};
    byte v4[8] = {31,31, 0, 0, 0, 0,31,31};
    byte v5[8] = { 0, 0, 0, 0, 0, 0, 0, 0};
    byte v6[8] = { 0, 0,14,31,31,14, 0, 0}; //*
    byte v7[8] = { 0, 0, 0, 0, 0, 0,31,31};
    byte v8[8] = { 0, 4,14,14,14,31, 4, 0};// alarm
    int a[4],time,k,reg,m,h,w,i0,led,ton,w1;
    byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3;
    unsigned long eeprom;
    byte rom0,rom1,rom2;

    void setup(){ Wire.begin(); clock.begin();
    pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);pinMode(5,INPUT); // кнопки
    pinMode(13,INPUT); // ds3231 SQW
    //clock.setDateTime(__DATE__, __TIME__);
    lcd.init();lcd.backlight();// Включаем подсветку дисплея
    lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
    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;
    clock.setOutput(DS3231_1HZ);
    }

    void loop(){ if(digitalRead(5)==HIGH&&led==0&&w1==0){led=1;lcd.noBacklight();delay(500);}
    if(digitalRead(5)==HIGH&&led==1&&w1==0){led=0;lcd.backlight();delay(500);}


    i0++;if(i0>4){i0=0;}
    if(digitalRead(2)==HIGH){k++;reg=1;lcd.clear();delay(300);}if(k>3){k=0;reg=0;}
    if(reg==1) {
    if(k==1){
    if(digitalRead(3)==HIGH){m++;}if(m>59){m=0;}
    if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
    if(k==2){
    if(digitalRead(3)==HIGH){h++;}if(h>23){h=0;}
    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(i0==1&&k==2){lcd.print(" ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
    if(i0==1&&k==1){lcd.print(" ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);}
    lcd.setCursor(0,1);
    if(i0==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();
    time = DateTime.hour*100+DateTime.minute;
    a[0]=time/1000;
    a[1]=time/100%10;
    a[2]=time/10%10;
    a[3]=time%10%10;

    for(i=0;i<4;i++){
    switch(i){
    case 0: e1=0,e2=1,e3=2;break;
    case 1: e1=4,e2=5,e3=6;break;
    case 2: e1=9,e2=10,e3=11;break;
    case 3: e1=13,e2=14,e3=15;break;}
    switch(a){
    case 0: d1=1,d2=2,d3=1,d4=1,d5=3,d6=1;break;
    case 1: d1=2,d2=1,d3=5,d4=7,d5=1,d6=7;break;
    case 2: d1=2,d2=4,d3=1,d4=1,d5=3,d6=3;break;
    case 3: d1=2,d2=4,d3=1,d4=3,d5=3,d6=1;break;
    case 4: d1=1,d2=3,d3=1,d4=5,d5=5,d6=1;break;
    case 5: d1=1,d2=4,d3=2,d4=3,d5=3,d6=1;break;
    case 6: d1=1,d2=4,d3=2,d4=1,d5=3,d6=1;break;
    case 7: d1=2,d2=2,d3=1,d4=5,d5=5,d6=1;break;
    case 8: d1=1,d2=4,d3=1,d4=1,d5=3,d6=1;break;
    case 9: d1=1,d2=4,d3=1,d4=3,d5=3,d6=1;break;
    }

    lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
    lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);

    }
    if(digitalRead(13) == HIGH){lcd.setCursor(7,0);lcd.write((uint8_t)6);}else{ lcd.setCursor(7,0);lcd.write((uint8_t)5);}
    //lcd.setCursor(8,0);lcd.write((uint8_t)8);
    lcd.setCursor(7,1);if(DateTime.second<10){lcd.print("0");}lcd.print(DateTime.second);

    if(digitalRead(5)==HIGH&&ton==0){lcd.backlight();ton=1;w1=0;delay(300);}
    if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}

    if(w==0){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}
    else if(w==1&&(DateTime.dayOfWeek<6)){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}
    else if(w==2&&(DateTime.dayOfWeek>5)){pic();lcd.setCursor(8,0);lcd.write((uint8_t)8);}
    else {lcd.setCursor(8,0);lcd.write((uint8_t)5);}
    }//reg=0
    eeprom++;
    delay(100);
    }

    void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){w1=1;tone(6,1200,500);delay(500);}}
     
    Последнее редактирование: 10 ноя 2021
  2. Asper Daffy

    Asper Daffy Иксперд

    А чё автор говорит?
     
  3. parovoZZ

    parovoZZ Гуру

    а вот что

     
  4. parovoZZ

    parovoZZ Гуру

    но автор вроде как не русский: кино немое, часы с ангельскими буквами.
     
  5. Airbus

    Airbus Радиохулиган Модератор

  6. Airbus

    Airbus Радиохулиган Модератор

    Для кого на странице Автора русским по белому написано?
     
    Рокки1945, DetSimen и issaom нравится это.
  7. tukaj

    tukaj Нуб

    Спасибо. Я это уже прочитал. Но если Вы заметили у меня как раз вопрос: как сделать чтобы с кнопок можно было?
     
  8. issaom

    issaom Гуру

    Код переписать, за вечер сделать можно.
     
  9. Andy16

    Andy16 Гик

    Я, наверное, не совсем по теме... Но, зачем в наше время делать умные часы, которые не берут время с серверов точного времени в инете?
     
    b707 нравится это.
  10. Airbus

    Airbus Радиохулиган Модератор

    Дак ясен пень
    ХЗ.Может интернета нету.Может esp нету.У меня дома все с NTP коррекцией включая те которые на ГРИ.Говорят DS3231 достаточно точно идут.Как по мне так лучше когда временем компиляции в авте зарядить чем ручками.
     
    issaom нравится это.
  11. tukaj

    tukaj Нуб

    Я понимаю что это просто, но для меня сложно, так как не разбираюсь.
     
  12. DetSimen

    DetSimen Гуру

    2000р
     
    issaom нравится это.
  13. vvr

    vvr Инженерище

    а обработка кнопок без учёта дребезга....
     
  14. issaom

    issaom Гуру

    Там дисплей тормознутый... Чего то я так по первой писал с ним - кнопки подглючивают, но в целом пользоваться можно....
     
  15. Airbus

    Airbus Радиохулиган Модератор

    Можо еще по IR канал сделать. С пульта цыфры устанавливать напрямую.Когда то так извращался. Поищу скетч
     
    DetSimen нравится это.
  16. Airbus

    Airbus Радиохулиган Модератор

    А погуглить? В сети масса кодов где ручками
     
  17. parovoZZ

    parovoZZ Гуру

    тогда быстрее, проще и дешевле купить часы из ассортимента алишечки
     
  18. KindMan

    KindMan Гуру

    Я так чаще всего делаю для разных устройств вместо кнопок, гораздо удобней и проще. Или через web интерфейс если есп'шка.
     
    DetSimen и Airbus нравится это.