Реле времени: где ошибка?

Сергей_72
Offline
Зарегистрирован: 04.02.2018

Народ, пытаюсь собрать реле времени на UNO. Знаний толков,считай,нет, помогите найти ошмбку в скетче.

Задача: собрать простейшее реле времени без дисплея 

Что имеем: 

 
 
 
 
 
 
 
 
 
 
 
 
что получается в итоге: реле работает,но некорректно. Если вовремя цикла включения света выключить и включить питание, то свет опять не загорается, пока не начнется опять начало цикла включения света
вопрос: что подправить в скетче?

 

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Счетч вставьте по правилам

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ну у тебя в скетче указано только время
момента включения.
Очевидно должен быть указан весь диапазон , для того, что бы работало корректно.
Что то типа:
Если(текущеевремя>времявключения и текущеевремя < временивыключения) то включаем. Иначе выключаем.

nik182
Offline
Зарегистрирован: 04.05.2015

И не плохо бы мировое время использовать со знаками больше меньше, а то по равно можно и промахнуться.  

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018
Сергей_72
Offline
Зарегистрирован: 04.02.2018

поправил! посмотрите,пож-та)))

//SPECIFIC TIME TRIGGER RELAY
#include <DS3231.h>

int Relay = 4;

DS3231  rtc(SDA, SCL);
Time t;

const int OnHour = 22; //SET TIME TO ON RELAY (24 HOUR FORMAT)
const int OnMin = 48;
const int OffHour = 22; //SET TIME TO OFF RELAY
const int OffMin = 49;

void setup() {
  Serial.begin(115200);
  rtc.begin();
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);
}

void loop() {
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);
  
  if(t.hour == OnHour && t.min == OnMin){
    digitalWrite(Relay,HIGH);
    Serial.println("LIGHT ON");
    }
    
    else if(t.hour == OffHour && t.min == OffMin){
      digitalWrite(Relay,LOW);
      Serial.println("LIGHT OFF");
    }
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Сергей_72 пишет:

поправил! посмотрите,пож-та)))

//SPECIFIC TIME TRIGGER RELAY
#include <DS3231.h>

int Relay = 4;

DS3231  rtc(SDA, SCL);
Time t;

const int OnHour = 22; //SET TIME TO ON RELAY (24 HOUR FORMAT)
const int OnMin = 48;
const int OffHour = 22; //SET TIME TO OFF RELAY
const int OffMin = 49;

void setup() {
  Serial.begin(115200);
  rtc.begin();
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);
}

void loop() {
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);
  
  if(t.hour == OnHour && t.min == OnMin){
    digitalWrite(Relay,HIGH);
    Serial.println("LIGHT ON");
    }
    
    else if(t.hour == OffHour && t.min == OffMin){
      digitalWrite(Relay,LOW);
      Serial.println("LIGHT OFF");
    }
}

 

Я тебе уже написал , как должно быть.
Чего тебе ещё надо ?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ТС, время храни в упакованном виде, телодвижений меньше потребуеца. 

Green
Offline
Зарегистрирован: 01.10.2015

Kakmyc пишет:
Если(текущеевремя>времявключения и текущеевремя < временивыключения) то включаем. Иначе выключаем.

У нормальных таймеров ещё учитывается переход через сутки, типа, в 23 включили, в 1 выключили. У недельных - ещё и дни недели. У месячных...) и т.д.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Green пишет:

Kakmyc пишет:
Если(текущеевремя>времявключения и текущеевремя < временивыключения) то включаем. Иначе выключаем.

У нормальных таймеров ещё учитывается переход через сутки, типа, в 23 включили, в 1 выключили. У недельных - ещё и дни недели. У месячных...) и т.д.

У нормальных таймеров формат времени time_t .
А то что ты описал, требует отдельного алгоритма типа:
Если(времявыключения<временивключения)то обрабатываем как исключение с переходом через 00:00

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

или

 if((t.hour == OnHour && t.min >= OnMin) && ( меньше времени выключения) ){

 

Сергей_72
Offline
Зарегистрирован: 04.02.2018

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

в идеале внести изменения в скетч

кто не может этого сделать, просьба удержаться от умствований) это песочница

заранее спасибо)))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Сергей_72 пишет:

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

в идеале внести изменения в скетч

кто не может этого сделать, просьба удержаться от умствований) это песочница

заранее спасибо)))

А здесь пока все посты по теме

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Сергей_72 пишет:

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

в идеале внести изменения в скетч

кто не может этого сделать, просьба удержаться от умствований) это песочница

заранее спасибо)))

Готового здесь тебе не дадут, но покажут, где черпать знания. Ну, кроме ua6em, конечно.  

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Сергей_72 пишет:

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

в идеале внести изменения в скетч

кто не может этого сделать, просьба удержаться от умствований) это песочница

заранее спасибо)))

я жеж тебе всё нарисовал, чего там непонятного?
Не знаю, что у тебя за библиотеки (их легион) под адафрутовскую лови:

#include "RTClib.h"

int Relay = LED_BUILTIN;

RTC_DS3231  rtc;


const int OnHour = 12; //SET TIME TO ON RELAY (24 HOUR FORMAT)
const int OnMin = 30;
const int OffHour = 12; //SET TIME TO OFF RELAY
const int OffMin = 37;

void setup() {
  Serial.begin(115200);
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }
}

void loop() {
  DateTime now = rtc.now();
  Serial.print(now.hour());
  Serial.print(" hour(s), ");
  Serial.print(now.minute());
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);

  if ((now.hour() == OnHour && now.minute() >= OnMin) && (now.hour() <= OffHour && now.minute() + 1  <= OffMin)) {
    digitalWrite(Relay, HIGH);
    Serial.println("LIGHT ON");
  } else {
    digitalWrite(Relay, LOW);
    Serial.println("LIGHT OFF");

  }
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

я жеж тебе всё нарисовал,

лови:

UA6EM! Мы помогаем не тем, кто просит, а тем кто сам учится и САМ пишет. Андестендабля?!

Ты помог лентяю с кодом, а когда мне (не обязательно мне, но для конкретики) на поллитру не хватит из-за этого, ты мне коньячку вышлешь бандеролькой?

На титульной странице форума нет надписи "Богадельня". Знаешь - почему? Потому, что тут не богадельня,  внезапно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

ua6em пишет:

я жеж тебе всё нарисовал,

лови:

UA6EM! Мы помогаем не тем, кто просит, а тем кто сам учится и САМ пишет. Андестендабля?!

Ты помог лентяю с кодом, а когда мне (не обязательно мне, но для конкретики) на поллитру не хватит из-за этого, ты мне коньячку вышлешь бандеролькой?

На титульной странице форума нет надписи "Богадельня". Знаешь - почему? Потому, что тут не богадельня,  внезапно.

ну почему лентяю, код ТС перепостил, а у меня сегодня лирическое настроение...захочет ТС отблагодарить - да без вопросов
и таки да, код актуален только для конкретного случая, когда время выключения больше времени включения, о переходе через 0 я даже не задумывался, это жеж напрячься надо, повторюсь...а у меня сегодня лирическое настроение...

Сергей_72
Offline
Зарегистрирован: 04.02.2018

благодарю, дружище)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Готового здесь тебе не дадут, но покажут, где черпать знания. Ну, кроме ua6em, конечно.  

я старый дзен-буддист, бегаю, пытаюсь кому-нибудь еще что-нибудь всучить, такова уж философия )))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ua6em пишет:

DetSimen пишет:

Готового здесь тебе не дадут, но покажут, где черпать знания. Ну, кроме ua6em, конечно.  

я старый дзен-буддист, бегаю, пытаюсь кому-нибудь еще что-нибудь всучить, такова уж философия )))

Ты старый штрейкбрехер, раздаешь рыбу вместо удочек, но такова уж твоя природа )))))

Green
Offline
Зарегистрирован: 01.10.2015

+1. Когда много времени и нечем себя занять. Ну и насрать на остальных. Хотя... раздел то не коммерческий.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

+1. Когда много времени и нечем себя занять. Ну и насрать на остальных. Хотя... раздел то не коммерческий.

раздел не коммерческий...что хочу то и пишу )))
ЗЫ да и в коммерческом могу написать за...благодарю...

Green
Offline
Зарегистрирован: 01.10.2015

Да. Если пофигу на отношение остальных участников. 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ua6em пишет:

ЗЫ да и в коммерческом могу написать за...благодарю...

Я ж говорю - штрейкбрехер )))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Пора открывать раздел "Богодельня" :-)

Green
Offline
Зарегистрирован: 01.10.2015

Ну так и отношение может быть взаимным.) Тебе похуй - и остальным на тебя тоже.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

логика очень странная, как чужое ПО хакнутое юзать, так это да, а как самому что-то отдать, так только за деньги?
Нет, вселенная так не работает )))

Green
Offline
Зарегистрирован: 01.10.2015

Логика в том, что бы чел пытался учиться, а не брал готовое нахоляву. Хотя и сам, иногда, этим страдаю.(

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ua6em пишет:

логика очень странная, как чужое ПО хакнутое юзать, так это да, а как самому что-то отдать, так только за деньги?

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

v258 пишет:

ua6em пишет:

логика очень странная, как чужое ПО хакнутое юзать, так это да, а как самому что-то отдать, так только за деньги?

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

какой с меня учитель )))
По сути в коде всего один знак поменял...захочет учиться, откроет сайт и почитает...если нужен переход через 0, однозначно будут вопросы
 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ua6em пишет:

По сути в коде всего один знак поменял...захочет учиться, откроет сайт и почитает...если нужен переход через 0, однозначно будут вопросы

Ну дык даже одну строку не дал человеку самостоятельно в свой код вставить

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

v258 пишет:

ua6em пишет:

По сути в коде всего один знак поменял...захочет учиться, откроет сайт и почитает...если нужен переход через 0, однозначно будут вопросы

Ну дык даже одну строку не дал человеку самостоятельно в свой код вставить

может он под ..., знает только равно )))
PS помогаю и в более сложных решениях

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Захочет (ну прям чтобы вот сам-сам) код писать под мк - научится. И никто не помешает этому, даже подобные «подачки» не помешают. А из-под палки, так сказать, фактически заставляя учиться - такое себе решение.

Все выше сказанное не отменяет подсказок для тех, кому это нужно. Ну я так думаю. Мое мнение ни с чьим совпадать не обязано ))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

ua6em пишет:

может он под ..., знает только равно )))

А теперь и не узнает 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

v258 пишет:

Ты старый штрейкбрехер, раздаешь рыбу вместо удочек, но такова уж твоя природа )))))

Я бы сказал "странный штрейкбрехер", - рыба-то с душком. Правда, скорее всего, ТС схомячит за милую душу и не заметит. Но это не спасет его от возможных последствий.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

v258 пишет:

Ты старый штрейкбрехер, раздаешь рыбу вместо удочек, но такова уж твоя природа )))))

Я бы сказал "странный штрейкбрехер", - рыба-то с душком. Правда, скорее всего, ТС схомячит за милую душу и не заметит. Но это не спасет его от возможных последствий.

чё сразу с душком...для определённых условий код вполне рабочий )))
 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ua6em пишет:

andriano пишет:

v258 пишет:

Ты старый штрейкбрехер, раздаешь рыбу вместо удочек, но такова уж твоя природа )))))

Я бы сказал "странный штрейкбрехер", - рыба-то с душком. Правда, скорее всего, ТС схомячит за милую душу и не заметит. Но это не спасет его от возможных последствий.

чё сразу с душком...для определённых условий код вполне рабочий )))
 

Ой ли ?
Он даже не учитывая перехода через 00:00 работать будет строго в рамках текущего часа

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
ua6em пишет:

andriano пишет:

v258 пишет:

Ты старый штрейкбрехер, раздаешь рыбу вместо удочек, но такова уж твоя природа )))))

Я бы сказал "странный штрейкбрехер", - рыба-то с душком. Правда, скорее всего, ТС схомячит за милую душу и не заметит. Но это не спасет его от возможных последствий.

чё сразу с душком...для определённых условий код вполне рабочий )))
 

Ой ли ? Он даже не учитывая перехода через 00:00 работать будет строго в рамках текущего часа

в рамках текущего часа он точно работает )))

PS посмотрел, таки да, ты прав, код вообще косячный, брать % от юникстайм было бы правильней наверно

ЗЗЫ но пинок то ТСу для размышлений в нужном направлении задан, али нет?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:
но пинок то ТСу для размышлений в нужном направлении задан, али нет?

Нет.  ТС ждёт новую рыбу, желательно не тухлую. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:
но пинок то ТСу для размышлений в нужном направлении задан, али нет?

Нет.  ТС ждёт новую рыбу, желательно не тухлую. 

есть только то, что есть ... если исправить один знак, то на целые сутки таймер будет актуален
PS и вообще если из еды есть только сущёная баранина с опарышами и оных есть не хочется, об коленку постучи, вывалятся...

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Вот , я что-то похожее делал https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/problemy-s-upravleniem-solnechnoi-batareei#comment-664147

функция check_time()

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Дим-мычъ пишет:

Вот , я что-то похожее делал https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/problemy-s-upravleniem-solnechnoi-batareei#comment-664147

функция check_time()

не, выше кто-то уже озвучивал, получить Unix Time Stamp и от него плясать, это самый простой способ...
 если  (UTS - (время включения в секундах)) % 86400  -  то включить
 если  (UTS - (время выключения в секундах)) %86400 - то выключить

ВИДИМО, но это не точно

Тут меня обвинили, дескать подсунул ТС дохлую рыбу, надо исправляться, вот так должно работать, но это не точно )))
 

#include "RTClib.h"

int Relay = LED_BUILTIN;

RTC_DS3231  rtc;

const int OnHour = 15; //SET TIME TO ON RELAY (24 HOUR FORMAT)
const int OnMin = 10;
const int OffHour = 15; //SET TIME TO OFF RELAY
const int OffMin = 15;
uint32_t IsOn = OnHour*3600 + OnMin*60;
uint32_t IsOff = OffHour*3600 + OffMin*60;
uint32_t DeltaT; //IsOff - IsOn;
int32_t RTC_diff = 14024;

void setup() {
  Serial.begin(115200);
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);

  if (! rtc.begin()) {
    Serial.println("Не могу найти RTC");
    Serial.flush();
    while (1) delay(10);
  }
  if(IsOn > IsOff){
    DeltaT = 86440 -IsOn +IsOff;
  } else {
    DeltaT = IsOff - IsOn;
  }
}

void loop() {
  DateTime now = rtc.now();
  uint32_t timestamp = now.unixtime();
  Serial.print((timestamp + RTC_diff - IsOn)%86440);
  Serial.print(" - ");
  Serial.print(now.hour());
  Serial.print(" hour(s), ");
  Serial.print(now.minute());
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);

  if ((timestamp + RTC_diff - IsOn)%86440 < DeltaT){
    digitalWrite(Relay, HIGH);
    Serial.println("LIGHT ON");
  } else {
    digitalWrite(Relay, LOW);
    Serial.println("LIGHT OFF");
  }
}

 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

ua6em пишет:

  delay (1000);

 Делай "уплывёт" немного, и секунду ( "очень важную")) можно пропустить. Как по мне, лучше по прерыванию от модуля

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Дим-мычъ пишет:

 Делай "уплывёт" немного, и секунду ( "очень важную")) можно пропустить. Как по мне, лучше по прерыванию от модуля

одна секунда на одной минуте это точность 2%, более чем достаточно, учитывая, что модуль часиков никто не калибрует (кроме меня) )))

Что-то никто не откомментировал, что один тухлый код заменил на другой )))
Эх, где жеж те знатные пятницы...
Выложу правильный код, для RTC модуля в котором часики тикают по юникстайм...

#include "RTClib.h"

int Relay = LED_BUILTIN;

RTC_DS3231  rtc;

const int OnHour = 10;  //SET TIME TO ON RELAY (24 HOUR FORMAT)
const int OnMin = 15;
const int OffHour = 10; //SET TIME TO OFF RELAY
const int OffMin = 17;

uint32_t IsOn = (OnHour * 3600UL) + (OnMin*60UL);
uint32_t IsOff = (OffHour *3600UL) + (OffMin*60UL);

uint32_t DeltaT; //IsOff - IsOn;
int32_t RTC_diff = 10800;//Разница с GMT в секундах

void setup() {
  Serial.begin(115200);
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);

  if (! rtc.begin()) {
    Serial.println("Не могу найти RTC");
    Serial.flush();
    while (1) delay(10);
  }
  if(IsOn > IsOff){
    DeltaT = 86400 - IsOn + IsOff;
  } else {
    DeltaT = IsOff - IsOn;
  }
  Serial.print("IsOn =  ");
  Serial.print(IsOn);
  Serial.print("  IsOff =  ");
  Serial.println(IsOff);
}

void loop() {
  DateTime now = rtc.now();
  uint32_t timestamp = now.unixtime();
  Serial.print(timestamp);
  Serial.print(" - ");
  Serial.print((timestamp +RTC_diff - IsOn)%86400UL);
  Serial.print(" - ");
  Serial.print(now.hour());
  Serial.print(" hour(s), ");
  Serial.print(now.minute());
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);

  if ((timestamp + RTC_diff - IsOn)%86400 < DeltaT){
    digitalWrite(Relay, HIGH);
    Serial.println("LIGHT ON");
  } else {
    digitalWrite(Relay, LOW);
    Serial.println("LIGHT OFF");
  }
}