// SQW -D2
// SCL - A5
// SDA - A4
#include <avr/sleep.h>
#include <Wire.h>
#include <DS3231.h>
#include <Servo.h>
Servo servo;
DS3231 clock;
void alarmFunction() {
// Обработчик ничего не делает
}
void setup() {
// Инициализация RTC, сброс будильников
clock.begin();
clock.enableOutput(false); // INT/SQW используем для генерации прерываний
clock.armAlarm1(false); // Запрещаем прерывания от будильников
clock.armAlarm2(false);
clock.clearAlarm1(); // Сбрасываем флаги будильников
clock.clearAlarm2();
// Выставляем будильник 1
//clock.setAlarm1(0, 0, 0, 10, DS3231_MATCH_S); // Сигнал в 10 секунд каждой минуты
clock.setAlarm1(0, 8, 10, 10, DS3231_MATCH_H_M_S); // Сигнал ежедневно в 8:10:00
//clock.setAlarm1(0, 0, 0, 5, DS3231_EVERY_SECOND);
// Выставляем будильник 2
//clock.setAlarm2(0, 0, 0, DS3231_EVERY_MINUTE);
//clock.setAlarm2(0, 14, 10, DS3231_MATCH_H_M);
// Разрешаем внешнее прерывание по сигналу будильника
pinMode(2, INPUT_PULLUP); // Вход нужно подтянуть к питанию
attachInterrupt(0, alarmFunction, FALLING); // Разрешаем прерывание
servo.attach(3); //
pinMode(8, OUTPUT); // питание сервопривода
pinMode(13, OUTPUT); // Светодиод на 13 выводе
ADCSRA &= ~(1 << ADEN); // Отключаем АЦП
}
void loop() {
//Переходим в режим энергосбережения
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
noInterrupts();
sleep_enable();
MCUCR = bit (BODS) | bit (BODSE);
MCUCR = bit (BODS);
interrupts();
sleep_cpu();
// Проснулись
sleep_disable();
// Проверка флага будильника может оказаться полезной
// на случай пробуждения по другой причине
if (clock.isAlarm1()) {
// Будильник 1, действительно, сработал
clock.clearAlarm1(); // Сбрасываем его флаг
//}
//if (clock.isAlarm2()) { // Сработал второй будильник
// clock.clearAlarm2();
digitalWrite(8, HIGH);
servo.write(180);
delay(2000); //ждем 2 секунды
servo.write(50);
delay(10);
//Включаем светодиод на 2 секунды
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
//delay(200);
digitalWrite(8, LOW);
delay(100);
// Можно спать дальше
}
}