Будильник в DS3234

Тема в разделе "Arduino & Shields", создана пользователем zveros, 29 янв 2015.

  1. zveros

    zveros Нерд

    Перепутал название темы, шилд на 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() для засыпания
      }
    }
     
    Последнее редактирование: 30 янв 2015
  2. Hobyt

    Hobyt Нуб

    Чем закончилось? Удалось будить?
     
  3. DrProg

    DrProg Вечный нерд

    Резетом его. )