Не отключается будильник на DS3231

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Laminar, 8 фев 2019.

  1. Laminar

    Laminar Нерд

    Добрых суток всем!
    Нуждаюсь в помощи понимающих людей.
    Проблема вот в чем, делаю часы на SD3231, добавил будильник, но он срабатывае даже если я оключаю его в коде.
    инициализации и прочее не прописываю чтоб не захламлять
    Код (C++):
    boolean alarmState; // состояние будильникаб значение сохраняется и бнрется из EEPROM при старте МК

    void setup (){
    clock.begin();
    alarmState = EEPROM.read(8);
      clock.armAlarm1(alarmState);
      clock.armAlarm2(false);
      clock.clearAlarm1();
      clock.clearAlarm2();
    // используется только первый будильник
    }

    void loop(){
      if (clock.isAlarm1()) {
        isAlarm = true; //переменная для активации сигнала
        clock.clearAlarm1();
        clock.clearAlarm2();
      }

      if (clock.isArmed1()) {  // индикация состояния будильника
        digitalWrite(RED, HIGH);
        digitalWrite(GREEN, LOW);
    else {
        digitalWrite(RED, LOW);
        digitalWrite(GREEN, HIGH);
      }
      }

    void click_Alarm() { // функция кнопки переключателя состояния

        alarmState = !alarmState;
        EEPROM.write (8, alarmState);
        clock.armAlarm1(alarmState);
        clock.armAlarm2(false);
        clock.clearAlarm1();
        clock.clearAlarm2();

    }
     
    То есть, даже когда горит зеленая лампочка и вернувшееся значение состояния будильника false он все равно срабатывает.
    Думал, может это из за вторго, поэтому везде прописал установку второго в неактивное состояние.

    Библиотека DS3231.h с Github

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

    Зарание спасибо!
     
  2. Vovka

    Vovka Гик

    Вот не понимаю, зачем в такой простой операции еще и библиотеку использовать?
    Просто сравниваем текущее время с временем будильника и разрешение работы пищалки будильника - все!
     
    parovoZZ нравится это.
  3. Laminar

    Laminar Нерд

    А мне вот непонятно, зачем отвечать если сказать по теме нечего. Просто поумничать?
    Не если уж вам ничего не понятно, я объясню... Библиотека там уже используется для массы других вещей и в том числе для проверки будильника, и эта операция выполняется в две строчки.

    Я надеюсь, Вы сочтете мои доводы убедительными и сочтете возможным ответить на мой вопрос.
     
    Andrey12 нравится это.
  4. Vovka

    Vovka Гик

    А это не ответ?
    Что подобные библиотеки делают я в курсе, а вот что делает используемая вами библиотека - это вопрос, который вы задали. Лично мое мнение по поводу этой библиотеки, так она должна делать только работу с железкой, а вся остальная логика должна быть реализована программистом. Допустим, я использую эту библиотеку, но не пользуюсь будильником - у меня его вообще нет. Зачем мне лишний код, бесполезно тратящий ресурсы, которых и так мало?
     
  5. Laminar

    Laminar Нерд

    Она с железкой и работает сставит, снимает и проверяет биты отвечающие за те или иные функции, тем более что вся логика уже реализованна в самой железке, в оригинале я собирался использовать прерывание, что вообще исключат обработку в коде. А то что предложили вы и есть костыли.
     
  6. Vovka

    Vovka Гик

    Жесть! Срочно выучите, что такое "прерывания"!

    Хорошо, тогда почему, например, в библиотеке для работы с датчиком температуры нет функций для терморегулятора и приходится писать "костыли" для управлением нагревателем?
     
    parovoZZ нравится это.
  7. Laminar

    Laminar Нерд

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

    Я вобще не вижу смысла в этой дискуссии, я не мнение о своих методах спрашивал, а о работе с модулем rtc.
     
  8. Vovka

    Vovka Гик

    Так выражайтесь точнее: я понял, что библиотечные функции будут вызываться в прерывании, а теперь оказывается, что просто обработка флага прерывания!
     
  9. Что значит что вы его отключаете?
    Если Вы его просто уберёте из скетча, но задействован в жизни то он будет работать
    Я не очень понял в чём вопрос
     
  10. Laminar

    Laminar Нерд

    Вот эта строчка, судя из описания активирует\деактивирует будильник

    clock.armAlarm1(alarmState);
    а эта: clock.isArmed1();
    проверяет состояние будильника.
    В железе реализованно просто, если вернулся false- горит зеленый светодиод, если true- красный, кнопка перключает эти два состояния. Бит устанавливается, все отображается корректно но при совпадении времени будильник упрямо срабатывет.
    Конечно первая мысль была просто не проверять флаг будильника если alarmState==false, либо в обработке прерывания при alarmState==false сразу сбрасывать будильник.
    Но это те самые костыли, а хотелось бы чтоб модуль сам делал свою работу, плюс можно будет усыплять контроллер (но это так, на будущие).
     
  11. parovoZZ

    parovoZZ Гуру

    А что их делать? Их и так валом
    часы.JPG
    И с будильником, и с радивом, и с фонарями - любая фантазия уже в продаже.

    Я бы ещё понял, если есть интерес потренироваться в написании изысканного кода без каких-либо библиотек (в обнимку с даташитами). Но писать то, что уже написано 1000 и 1 раз, спотыкаться на неведомые костыли, огрызаться на опытных кодеров...К чему это всё? Залез на любую кодерскую файлопомойку, скачал любую реализацию - сиди да и изучай.
     
    DetSimen нравится это.
  12. а это кто?