Как установить управляющий регистр в модуле 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 извините за это, Томас, я здесь немного новичок.
@Samarth Kabbur, 👍0
Обсуждение1 ответ
Лучший ответ:
Я просмотрел библиотеку 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();
}
Внимание: не проверено.
- Установить регистр управления на низкий уровень в ds3231 rtc
- Проверка кода таймера с использованием часов реального времени и OLED-экрана
- Разница между «time_t» и «DateTime»
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Библиотека времени Arduino и библиотеки RTC
- Как запитать Arduino и 1 цветную светодиодную ленту от одного источника питания
Какую библиотеку RTC вы используете? Знаете ли вы, как напрямую обратиться к устройству I2C с помощью библиотеки [Wire](https://www.arduino.cc/en/Reference/Wire)?, @Edgar Bonet
У вас на линии тоже есть подтягивающий резистор, да?, @CrossRoads