Часы реального времени с будильником

Тема в разделе "Arduino & Shields", создана пользователем 071Anton132, 2 сен 2018.

  1. 071Anton132

    071Anton132 Нуб

    Нужно сделать часы реального времени(с модулем RTC3231) с будильником, установка будильника должна производиться через кнопки на LCD1602. Нужна помощь, скетч к будильнику готов, все работает(но установить его можно только в скетче), и возникла большая проблема-как реализовать управление будильника через кнопки( чтобы при зажатии select включался режим установки будильника, выставление через up,down,left,right; и при повторном нажатии select переход в режим часов). Сейчас на дисплей выводятся: часы, минуты, секунды, Помогите, пожалуйста, с кодом. Скетч, которые есть, ниже
    #include <Wire.h>
    #include <ds3231.h>
    #include <LiquidCrystal.h>
    #define BUFF_MAX 256

    //Joystick
    int joyPin = 18;
    volatile int buttonState = 0;

    //LCD
    const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
    LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

    //Buzzer
    int buzzer_pin = 27;

    // time when to wake up
    uint8_t wake_HOUR = 8;
    uint8_t wake_MINUTE = 5;
    uint8_t wake_SECOND = 33;

    // how often to refresh the info on stdout (ms)
    unsigned long prev = 1000, interval = 1000;

    void set_alarm(void)
    {

    // flags define what calendar component to be checked against the current time in order
    // to trigger the alarm - see datasheet
    // A1M1 (seconds) (0 to enable, 1 to disable)
    // A1M2 (minutes) (0 to enable, 1 to disable)
    // A1M3 (hour) (0 to enable, 1 to disable)
    // A1M4 (day) (0 to enable, 1 to disable)
    // DY/DT (dayofweek == 1/dayofmonth == 0)
    uint8_t flags[5] = { 0, 0, 0, 1, 1 };

    // set Alarm1
    DS3231_set_a1(wake_SECOND, wake_MINUTE, wake_HOUR, 0, flags);

    // activate Alarm1
    DS3231_set_creg(DS3231_CONTROL_INTCN | DS3231_CONTROL_A1IE);
    }

    void setup()
    {
    lcd.begin(16, 2);
    pinMode(buzzer_pin, OUTPUT);
    Serial.begin(9600);
    Wire.begin();
    DS3231_init(DS3231_CONTROL_INTCN);
    DS3231_clear_a1f();
    set_alarm();
    pinMode(joyPin, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(joyPin), joyStick, FALLING);

    }

    void loop()
    {
    Serial.println(digitalRead(joyPin));
    char buff[BUFF_MAX];
    unsigned long now = millis();
    struct ts t;

    // once a while show what is going on
    if ((now - prev > interval) && (Serial.available() <= 0)) {
    DS3231_get(&t);

    // display current time
    snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year,
    t.mon, t.mday, t.hour, t.min, t.sec);
    lcd.setCursor(0, 0);
    lcd.print(t.hour);
    lcd.print(":");
    lcd.print(t.min);
    lcd.print(":");
    lcd.print(t.sec);
    // Serial.println(buff);

    // display a1 debug info
    DS3231_get_a1(&buff[0], 59);
    //Serial.println(buff);

    if (DS3231_triggered_a1()) {
    tone (buzzer_pin, 100);
    // INT has been pulled low
    lcd.setCursor(0, 1);
    lcd.print(" -> triggered");
    Serial.println(" -> alarm1 has been triggered");
    // clear a1 alarm flag and let INT go into hi-z
    DS3231_clear_a1f();
    }
    prev = now;
    }
    delay(100);
    }

    void joyStick()
    {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("set");
    }
     
  2. b707

    b707 Гуру

    судя по комментам в скетче, вы его не писали, а нашли в инете и скопировали. Теперь ждете, что кто-то вам и установку времени напишет?
     
  3. 071Anton132

    071Anton132 Нуб

    Половина скетча была написана самостоятельно. Я не жду, чтобы кто-то написал за меня весь скетч. Мне бы хотелось, чтобы кто-нибудь просто объяснил логику, как это сделать. Дальше могу сам.
     
  4. Mitrandir

    Mitrandir Гуру

    А в чем загвоздка?
    Посмотрите в вики амперки есть ссылки на уроки джереми блюма есть как работать с кнопками. При нажатии на кнопки запоминает параметры в еепром в функции setup восстанавливаете
     
  5. DIYMan

    DIYMan Guest

    Какая именно половина? А то что-то не верится, Станиславский не даст соврать. Значения переменных поменяли, да? Пины переназначили, да?
     
  6. Mitrandir

    Mitrandir Гуру

    Логика такая, есть глобальная переменная Mode. Она хранит режим работы.

    Переписать вывод на экран.
    Сделать одну функцию draw(), которая в зависимости от переменной Mode будет рисовать на экране.

    При нажатии на другие кнопки будут меняться параметры в зависимости от режимы
     
  7. 071Anton132

    071Anton132 Нуб

    Был добавлен вывод на LCD keypad shield, добавил джойстик, бузер. Сам будильник взял с примера библиотеки
     
  8. parovoZZ

    parovoZZ Гуру

    8D654555-C39A-4ED4-9FAB-0856F0538C0A.jpeg
    А у меня все получилось. И календарик есть, вторые часы, будильник.
     
    071Anton132 и Mitrandir нравится это.
  9. 071Anton132

    071Anton132 Нуб

    Можешь, пожалуйста, поделиться скетчем?
     
  10. Limoney

    Limoney Гик

    ардуино без батареи))))))))))
     
  11. SergeiL

    SergeiL Оракул Модератор

    Там и провода не подключены.
    Это часы с будильником и календарем на ардуине! :)
     
    Последнее редактирование: 2 сен 2018
    Limoney, parovoZZ и Mitrandir нравится это.
  12. DetSimen

    DetSimen Guest

    А где на 1602 кнопки? Мошт, я не вижу чо?
     
  13. Airbus

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

    Кетайпром.
     
  14. Mitrandir

    Mitrandir Гуру

  15. DetSimen

    DetSimen Guest

    это уже не 1602 называется, а 1602 Shield. :)
     
    Mitrandir нравится это.
  16. parovoZZ

    parovoZZ Гуру

    да не там никакого скетча...в 2001 году и слово такое не употреблялось. Да и архитектура не AVR. Да я и сам заплатил 700 рублев. Это в ценах 2001 года. У меня доход тогда был 5000 рублев...на сделке...