Вопрос о времени включения ds1307

Тема в разделе "Arduino & Shields", создана пользователем ArtSmm, 21 авг 2016.

  1. ArtSmm

    ArtSmm Нерд

    Столкнулся с таким вопросом. Похоже переменная curSeconds постоянно растет и из-за этого сбивается время. Может быть текущее время как-то в void setup выставить, чтобы оно один раз определялось, а потом уже шло, как обычно?
    Те текущее время определяется верно, когда гружу стандартный скетч для установки времени, но время в curSeconds постоянно смещается.
    К примеру, сейчас реле сработало в 19:26, а не в 19:22, как указано в коде


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

    //Реле
    int Relay = 3;

    RTC_DS1307 rtc;

    unsigned long curSeconds = 0;

    //Задаем время для подсчета. Меняем только цифры с UL

    unsigned long eventStartSeconds = 19UL*3600+22UL*60;
    unsigned long eventStopSeconds = 19UL*3600+22UL*60+5UL;

    void setup () {

    //Реле
    pinMode(Relay, OUTPUT);

    //Часы
    Serial.begin(57600);
    Wire.begin();
    rtc.begin();
    //Serial.begin(9600);
    //rtc.adjust(DateTime(2016, 8, 2, 6, 48, 0));

    }

    void loop () {

    if(millis()%1000==0) {
    Serial.print("curSeconds = ");
    Serial.println(curSeconds);
    Serial.print("eventStartSeconds = ");
    Serial.println(eventStartSeconds);
    }

    DateTime now = rtc.now();
    curSeconds = (now.hour()*60UL + now.minute())*60UL;

    //Условие для выполнения программы
    if(curSeconds >= eventStartSeconds && curSeconds <= eventStopSeconds) {
    digitalWrite(Relay, LOW);
    delay(3000);
    digitalWrite(Relay, HIGH);
    }
    else
    digitalWrite(Relay, HIGH);

    }
     
  2. fogary

    fogary Гик

    Конечно переменная curSeconds постоянно растет, Вы же ее несколько раз в секунду обновляете. Код установки времени в часах у Вас закоментирован, предполагается, что часы уже выставлены и идут правильно. Изменение значения переменной curSeconds на точность хода часов не влияет. Как Вы определяете фактическое время срабатывание реле?
     
  3. ArtSmm

    ArtSmm Нерд

    Фактическое время срабатывания задано в диапазоне
    if(curSeconds >= eventStartSeconds && curSeconds <= eventStopSeconds) {
    digitalWrite(Relay, LOW);
    delay(3000);
    digitalWrite(Relay, HIGH);
    }

    eventStartSeconds - начало срабатывания
    eventStopSeconds - конец

    Как убрать постоянный рост curSeconds ?
     
  4. DIYMan

    DIYMan Guest

    Очевидно, не получать её значение из часов реального времени. Вы чего хотите-то? У вас алгоритм построен так, что срабатывание происходит в указанном диапазоне текущих суток, зачем убирать рост curSeconds?
     
  5. ArtSmm

    ArtSmm Нерд

    я хочу, чтобы у меня полив происходил в строго отведенное время, например с 13.00 до 13.00.05
    Рост curSeconds я хочу убрать, чтобы избежать неверного срабатывания реле. А то получается, как только время установил - полив верно происходит, на следующий день вообще не происходит
     
  6. DIYMan

    DIYMan Guest

    С чего вы взяли? У вас как curSeconds вычисляется - гляньте: текущий час и текущие минуты. Что произойдёт с текущим часом при наступлении нового дня - вопрос на 100 баллов ;)
     
  7. fogary

    fogary Гик

    Фактическое, имелось ввиду:
    как Вы определили этот факт? Пересчитали значение curSeconds в часы и минуты, или сравнили с показанием других часов, например, наручных часов?
     
  8. ArtSmm

    ArtSmm Нерд

    Сравнил с показаниями других часов
     
  9. ArtSmm

    ArtSmm Нерд

    Те сюда надо еще вычисление секунд добавить
     
  10. fogary

    fogary Гик

    Вы уверены, что RTC и другие часы идут синхронно, т. е. показывают одинаковое время.

    Еще заметил, что время начала и окончания полива у Вас отличается на 5 секунд, а сам процесс полива длится 3 секунды. Есть вероятность, что в течении этих 5 секунд полив будет запущен дважды - по истечению 3 секунд, результат проверки все еще будет true.
     
  11. fogary

    fogary Гик

    Добавить несомненно надо, иначе условие "curSeconds <= eventStopSeconds" будет true дольше чем Вы ожидаете, но смысл ответа был в другом.
     
  12. ArtSmm

    ArtSmm Нерд

    Ребусов не надо))
     
  13. fogary

    fogary Гик

    Про добавление секунд:
    сейчас, условие "if(curSeconds >= eventStartSeconds && curSeconds <= eventStopSeconds)" будет истинно в течении одной минуты, а не пяти секунд.

    Про другое:
    новые сутки начинаются с 0 часов 0 минут 0 секунд. Все ваши вычисления секунд отталкиваются от этого значения. Какой это день года - значение не имеет.
     
  14. ArtSmm

    ArtSmm Нерд

    Спасибо, обдумаю