Перепутал название темы, шилд на DS3231. Хочу будить будильником шилдом на DS3231 спящую ардуину уно по порту 2. Использовал англоязычные скечи, ардуино благополучно засыпает, но уже не просыпается. В программировании ардуин не силен, своими силами не могу найти ошибку. И вообще не понятно включил ли я будильник, так как if (Clock.checkAlarmEnabled(1)) { Serial.print("enabled"); не выполняеться. Какой параметр правельнее использовать в прерывании attachInterrupt(0, wakeUpNow, CHANGE); Пока остановился на CHANGE. Какой сигнал будет при срабатывании будильника на пине SQW? Код (Text): #include <avr/sleep.h> #include <DS3231.h> #include <Wire.h> int wakePin = 2; // Пин используемый для просыпания (прерывания) int count = 0; // Счетчик int LedPin = 13; // Светодиод DS3231 Clock; bool Century = false; bool h12; bool PM; byte ADay, AHour, AMinute, ASecond, ABits; bool ADy, A12h, Apm; byte year, month, date, DoW, hour, minute, second; void wakeUpNow() // Прерывание сработает после пробуждения { sleep_disable(); // то первое, что нужно сделать после просыпания - выключить спящий режим digitalWrite(LedPin, HIGH); // Включаем светодиод } void setup() { // Start the I2C interface Wire.begin(); Clock.setSecond(45);//Set the second Clock.setMinute(59);//Set the minute Clock.setHour(22); //Set the hour Clock.setDoW(5); //Set the day of the week Clock.setDate(10); //Set the date of the month Clock.setMonth(5); //Set the month of the year Clock.setYear(13); //Set the year (Last two digits of the year) // Start the serial interface Serial.begin(9600); pinMode(LedPin, OUTPUT); digitalWrite(LedPin, HIGH); // Включаем светодиод pinMode(wakePin, INPUT); digitalWrite(wakePin, LOW); // Подтягивем ногу к 0. Serial.begin(9600); attachInterrupt(0, wakeUpNow, CHANGE); // Используем прерывание 0 (pin 2) для выполнения функции wakeUpNow (прерывание вызывается только при смене значения на порту с HIGH на LOW - подтянуть ногу 2 на 5в.) } void ReadDS3231() { int second, minute, hour, date, month, year, temperature; second = Clock.getSecond(); minute = Clock.getMinute(); hour = Clock.getHour(h12, PM); date = Clock.getDate(); month = Clock.getMonth(Century); year = Clock.getYear(); temperature = Clock.getTemperature(); Serial.print(hour, DEC); Serial.print(':'); Serial.print(minute, DEC); Serial.print(':'); Serial.print(second, DEC); Serial.print('\n'); Serial.print("Temperature="); Serial.print(temperature); Serial.print('\n'); //WARNING!! It is possible to set stupid values eg 43rd day of a month, or 27th Hour or 70th Minute //The values shown for Alarm 1 & 2 are the 'acceptable' ranges or values // There are two other sketches to help with Interupts // 1) Clock_Read_Alarm.ino Displays settings for both alarms // 2) Clock_Test_Int.ino Simple example of using an external interupt ADay = 10; //If ADoW is False ADay Value is 1 to 31 or if ADoW is True ADay Value is 1 to 7 AHour = 23; // If A12h=False Hour is 00 to 23 or if A12h=True Hour is 01 to 12 AMinute = 00; // Minutes = 00 to 59 ASecond = 00; // Seconds= 00 to 59 ABits = 15; //Match Type Values. 0=Day/Date, 8=Hrs/Min/Sec, 12=Min/Sec, 14=Sec, 15=Every Sec boolean ADoW = false; //False= Match on Date, True= Match on DoW A12h = false; //False= Use 24Hour Clock format, True= Use 12Hour Clock format Apm = true; // If False time is 1AM to 12AM, if True time is 1PM to 12PM Clock.setA1Time(ADay, AHour, AMinute, ASecond, ABits, ADoW, A12h, Apm); Clock.turnOffAlarm(0); } void sleepNow() // Функция увода ардуины в спячку. { digitalWrite(LedPin, LOW); // Выключаем светодиод set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Здесь устанавливается режим сна sleep_enable(); // Включаем sleep-бит в регистре mcucr. Теперь возможен слип count = 0; // Обнуляем счетчик прошедших секунд sleep_mode(); // Здесь устройство перейдет в режим сна!!! // -----------------------------------------------ПОСЛЕ ПРОСЫПАНИЯ ВЫПОЛНЕНИЕ КОДА ПРОДОЛЖИТСЯ ОТСЮДА!!! sleep_disable(); // Первое, что нужно сделать после просыпания - выключить спящий режим detachInterrupt(0); // Выключаем прерывание - при нормальном режиме wakeUpNow() не будет вызываться } void loop() { ReadDS3231(); Serial.print("Alarm 1: "); Clock.getA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm); Serial.print(ADay, DEC); if (ADy) { Serial.print(" DoW"); } else { Serial.print(" Date"); } Serial.print(' '); Serial.print(AHour, DEC); Serial.print(' '); Serial.print(AMinute, DEC); Serial.print(' '); Serial.print(ASecond, DEC); Serial.print(' '); if (Clock.checkAlarmEnabled(1)) { Serial.print("enabled"); } // Отображаем информацию о счетчике Serial.print("Awake for "); Serial.print(count); Serial.println("sec"); count++; delay(1000); // Ждем секунду // Проверяем - если прошло 10 секунд - засыпаем if (count >= 10) { Serial.println("1Timer: Entering Sleep mode"); delay(100); // Этот делэй необходим, чтоб функция sleep не вызывала ошибку по Serial count = 0; sleepNow(); // Вызов функции sleep() для засыпания } }