Как установить управляющий регистр в модуле RTC DS3231 для Arduino UNO R3?

Для проекта я использую DS3231 RTC, подключенный к Arduino UNO R3. Я не буду вдаваться в подробности, но мне нужно экономить энергию, поэтому я использую аварийное прерывание DS3231, чтобы вывести Arduino из спящего режима. Прерывание по сигналу тревоги работает нормально, когда Arduino находится в спящем режиме и подключен к контактам 5V и GND Arduino, однако оказывается, что DS3231 не будет запускать прямоугольное прерывание при питании от батареи. Чтобы включить его, мне нужно установить бит 7 регистра управления (0Eh) в логическую 1, а бит 6 в логическую единицу. Я не могу найти никакой документации о том, как это сделать , за исключением нескольких форумов, говорящих об этом. Каков конкретный код для этого и где я могу разместить код?

Технические данные DS3231 (контрольный регистр на стр. 13)

#include <Wire.h>
#include <RTClibExtended.h>
#include <LowPower.h>

#define wakePin 2    //используем прерывание 0 (вывод 2) и запускаем функцию wakeUp, когда вывод 2 становится НИЗКИМ
#define ledPin 13    //используйте встроенный светодиод Arduino для индикации состояния сна или пробуждения

RTC_DS3231 RTC;      //мы используем DS3231 RTC

byte AlarmFlag = 0;
byte ledStatus = 1;

//------------------------------------------------ -

void wakeUp()        // здесь прерывание обрабатывается после пробуждения
{
}

//------------------------------------------------ ------------

void setup() {
  //digitalWrite(wakePin,HIGH);
  // Установите контакт D2 как INPUT для приема сигнала прерывания от DS3231
  pinMode(wakePin, INPUT);

  // включаем светодиод на плате на 1 секунду, чтобы указать, что скетч в порядке и работает
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  delay(1000);

  //Инициализируем связь с часами
  Wire.begin();
  RTC.begin();
  RTC.adjust(DateTime(__DATE__, __TIME__));   // устанавливаем дату и время RTC на время COMPILE

  //очистить все ожидающие тревоги
  RTC.armAlarm(1, false);
  RTC.clearAlarm(1);
  RTC.alarmInterrupt(1, false);
  RTC.armAlarm(2, false);
  RTC.clearAlarm(2);
  RTC.alarmInterrupt(2, false);

  // Установите вывод SQW в положение OFF (в моем случае он был установлен по умолчанию на 1 Гц)
  //Выход вывода INT DS3231 подключен к этому выводу
  // Он должен быть подключен к выводу D2 Arduino для пробуждения
  RTC.writeSqwPinMode(DS3231_OFF);

  // Устанавливаем alarm1 каждый день в 18:33
  RTC.setAlarm(ALM1_MATCH_HOURS, 16, 19, 0);   // установите здесь время пробуждения
  RTC.alarmInterrupt(1, true);
}

//------------------------------------------------ ------------

void loop() {

  //В первом цикле мы входим в спящий режим
  if (AlarmFlag == 0) {
    attachInterrupt(0, wakeUp, LOW);                       //используем прерывание 0 (вывод 2) и запускаем функцию wakeUp, когда вывод 2 становится НИЗКИМ
    digitalWrite(ledPin, LOW);                             //выключаем светодиод для индикации перехода в спящий режим
    ledStatus = 0;                                         //устанавливаем статус светодиода соответственно
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);   //arduino переходит в спящий режим здесь
    detachInterrupt(0);                                    //выполнение возобновляется отсюда после пробуждения

    //При выходе из спящего режима сбрасываем будильник
    RTC.armAlarm(1, false);
    RTC.clearAlarm(1);
    RTC.alarmInterrupt(1, false);
    AlarmFlag++;
  }

  //включает светодиод, чтобы указать, что мы больше не находимся в спящем режиме
  if (ledStatus == 0) {
    ledStatus = 1;
    digitalWrite(ledPin, HIGH);
  }
  else {
    ledStatus = 0;
    digitalWrite(ledPin, LOW);
  }

  delay(500);
}

Кроме того, как настроить переход в спящий режим после будильника?

Спасибо!

Ps извините за это, Томас, я здесь немного новичок.

, 👍0

Обсуждение

Какую библиотеку RTC вы используете? Знаете ли вы, как напрямую обратиться к устройству I2C с помощью библиотеки [Wire](https://www.arduino.cc/en/Reference/Wire)?, @Edgar Bonet

У вас на линии тоже есть подтягивающий резистор, да?, @CrossRoads


1 ответ


Лучший ответ:

0

Я просмотрел библиотеку FabioCuomo-DS3231, так как думаю, это то, что вы используете, и я не видел ничего, связанного с настройкой эти два бита. Однако вы можете черпать вдохновение из кода в библиотека для самостоятельной реализации функциональности.

Я бы попробовал это:

void enableAlarmInLowPower(void) {
    // Чтение управляющего регистра.
    Wire.beginTransmission(DS3231_ADDRESS);
    Wire.write(DS3231_CONTROL);
    Wire.endTransmission();
    Wire.requestFrom((uint8_t)DS3231_ADDRESS, (uint8_t)1);
    uint8_t value = Wire.read();
    Wire.endTransmission();

    // Обновить его.
    value |= bit(6) | bit(7);  // устанавливаем биты 6 и 7

    // Написать обратно.
    Wire.beginTransmission(DS3231_ADDRESS);
    Wire.write(DS3231_CONTROL);
    Wire.write(value);
    Wire.endTransmission();
}

Внимание: не проверено.

,