LINUX.ORG.RU

Помочь немного с С++

 ,


0

2

// during an alarm the INT pin of the RTC is pulled low
//
// this is handy for minimizing power consumption for sensor-like devices, 
// since they can be started up by this pin on given time intervals.

#include <Wire.h>
#include "ds3231.h"

#define BUFF_MAX 256

// time when to wake up
uint8_t wake_HOUR = 16;
uint8_t wake_MINUTE = 35;
uint8_t wake_SECOND = 9;

// how often to refresh the info on stdout (ms)
unsigned long prev = 5000, interval = 5000;

void set_alarm(void)
{

    // flags define what calendar component to be checked against the current time in order
    // to trigger the alarm - see datasheet
    // A1M1 (seconds) (0 to enable, 1 to disable)
    // A1M2 (minutes) (0 to enable, 1 to disable)
    // A1M3 (hour)    (0 to enable, 1 to disable) 
    // A1M4 (day)     (0 to enable, 1 to disable)
    // DY/DT          (dayofweek == 1/dayofmonth == 0)
    uint8_t flags[5] = { 0, 0, 0, 1, 1 };

    // set Alarm1
    DS3231_set_a1(wake_SECOND, wake_MINUTE, wake_HOUR, 0, flags);

    // activate Alarm1
    DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
}

void setup()
{
    Serial.begin(9600);
    Wire.begin();
    DS3231_init(DS3231_INTCN);
    DS3231_clear_a1f();
    set_alarm();
}

void loop()
{
    char buff[BUFF_MAX];
    unsigned long now = millis();
    struct ts t;

    // once a while show what is going on
    if ((now - prev > interval) && (Serial.available() <= 0)) {
        DS3231_get(&t);

        // display current time
        snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year,
             t.mon, t.mday, t.hour, t.min, t.sec);
        Serial.println(buff);

        // display a1 debug info
        DS3231_get_a1(&buff[0], 59);
        Serial.println(buff);

        if (DS3231_triggered_a1()) {
            // INT has been pulled low
            Serial.println(" -> alarm1 has been triggered");
            digitalWrite(A3, HIGH);
            delay(800000);
            digitalWrite(A3, LOW);
            // clear a1 alarm flag and let INT go into hi-z
            DS3231_clear_a1f();
        }
        prev = now;
    }
}

Как сделать так, чтобы часы не убегали каждые сутки на N мин вперед?



Последнее исправление: cheetah111v (всего исправлений: 1)

Ответ на: комментарий от cheetah111v

У тебя обработка события DS3231_triggered_a1 точно запаздывает из-за печати. Возможно, дело не в этом, но печать там стоит убрать или хотя бы поставить последней строкой в блоке.

tailgunner ★★★★★
()

Проверь через дебаггер, сколько у тебя штуки типа печати занимают, и копай в эту сторону.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Проверь через дебаггер, сколько у тебя штуки типа печати занимают, и копай в эту сторону.

Судя по Serial.begin(9600) - десятки миллисекунд.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Для начала попробуй убрать печать.

А как это может помочь? :) DS3231 это модуль часов реального времени. Топикстартер периодически спрашивает у него текущее время и факт срабатывание будильника. Как это может ускорять ход времени в модуле?

Скорее всего дело в качестве самого модуля, качестве кварца.

BRE ★★
()
Ответ на: комментарий от BRE

Скорее всего дело в качестве самого модуля, качестве кварца.

Если дело в железе - естественно, софтом это не решить.

tailgunner ★★★★★
()
Ответ на: комментарий от cheetah111v

Нихрена не понял из этого!

забей тогда, все равно тебе не поможет если у тебя на минуты за сутки убегает - меняй кварцевый резонатор.

anonymous
()
Ответ на: комментарий от anonymous

меняй кварцевый резонатор

хотя и это не поможет - у него же встроенный резонатор, выкинь тогда его - стопудово подделка какая-то

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.