Для reset86 про интервалы

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

Не знаю, кто тему снёс, это не я

uint8_t GetDayPeriod(const uint8_t AHours, const uint8_t AMinutes) {
    uint16_t time = 60U * AHours + AMinutes;

    if (time < TIME_NIGHT) return EVENING;
    if ((time > TIME_EVENING) || (time < TIME_MORNING)) return NIGHT;
    if (time < TIME_DAY) return MORNING;
    if (time < TIME_EVENING) return DAY;
    return EVENING;
}

 

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

Пропробуй пока этот костыль, я счас рабочее решение найду

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

Нет, этот костыль работать не будет, счас исправлю, подожди полчаса

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

DetSimen пишет:

Нет, этот костыль работать не будет, счас исправлю, подожди полчаса

Опасаюсь за твое здоровье, друг! Мошт накатить ннада? ;))

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

еще рано, я, как сонце сядет, пойду, головою свесясь, переулком, в знакомый ларёк. 

-NMi-
Offline
Зарегистрирован: 20.08.2018

DetSimen пишет:

пойду, головою свесясь, переулком, в знакомый ларёк. 

По Неглинной на лево, ресторан Берлин?

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

Нужно, канеш, чтоб времена не перекрывались, иначе будет работать неправильно.  По-хорошему, нужно делать массив структур и сортировать перед вызовом. Вопщем проверяй, обрати внимание, что типы констант поменялись.  Напиши потом, чотам как, я проверял ставил TIME_NIGHT на 00:10  и на 23:10, но глубоко не тестил.

const int16_t DAY_MINUTES = 24 * 60;

const int16_t  TIME_NIGHT =   23 * 60 + 10;   // ночь начинается в 23:10
const int16_t  TIME_MORNING = 6 * 60 + 00;   // утро начинается в 06:10
const int16_t  TIME_DAY = 6 * 60 + 50;       // день начинается в 06:50
const int16_t  TIME_EVENING = 22 * 60 + 5;   // вечер в хату начинается в 22:05

const uint8_t  MORNING = 1;
const uint8_t  DAY = 2;
const uint8_t  EVENING = 3;
const uint8_t  NIGHT = 4;



uint8_t GetDayPeriod(const uint8_t AHours, const uint8_t AMinutes) {
    int16_t time = 60U * AHours + AMinutes;

// Трюк такой, мы сдвинем время так, чтобы начало утра приходилось на 0
// думаю, утро через 0 переходить никада не будет, остальные перещитаюца

    time -= TIME_MORNING;

    if (time < 0) time += DAY_MINUTES;

    if (time < (TIME_DAY - TIME_MORNING))   return MORNING;
    if (time < (TIME_EVENING - TIME_MORNING)) return DAY;

    int16_t timeNight = TIME_NIGHT - TIME_MORNING;
    if (timeNight < 0) timeNight += DAY_MINUTES;

    if (time < timeNight) return EVENING;
    return NIGHT;


}


 

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

Отпишись обязательно, я просто так деньги не беру, верну, если што.

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

-NMi- пишет:

По Неглинной на лево...?

Нету в моей российской ширинке таких улиц. 

b707
Offline
Зарегистрирован: 26.05.2017

Деда, он того не стоит.
А всего то надо два варианта по тому, ночь наступает до полуночи или после. Его код в первом сообщении тоже пойдет.

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

Det!!! Я ж не зря писал про модуль!

тестируй на чем хошь!

#include <stdio.h>

void main() {
    int hs,ms,he,me,hx,mx;
    printf("input start time hh:mm>");
    scanf("%d:%d",&hs,&ms);
    printf("Interval start=%02d:%02d = minutes=%04d\n",hs,ms,hs*60+ms);

    printf("input end time hh:mm>");
    scanf("%d:%d",&he,&me);
    printf("Interval end=%02d:%02d = minutes=%04d\n",he,me,he*60+me);

    printf("input test time hh:mm>");
    scanf("%d:%d",&hx,&mx);
    printf("test time=%02d:%02d = minutes=%04d\n",hx,mx,hx*60+mx);

    if ((hx*60+mx - hs*60 -ms) %1440 < (he*60+me - hs*60 -ms)%1440) 
    printf ("time is in interval\n");
    else 
    printf ("time is not in interval\n");
}

ты, походу, операцию деления сильно ненавидишь! ;))) Прав? Или только остаток от деления? Остатки и я недолюбливаю, честно говоря! ;)))))

reset861
Offline
Зарегистрирован: 27.03.2021
  if (TIME_NIGHT < TIME_EVENING)
  {
    if (time < TIME_NIGHT) return EVENING;
    if (time < TIME_MORNING) return NIGHT;
    if (time < TIME_DAY) return MORNING;
    if (time < TIME_EVENING) return DAY;
    return EVENING;
  }
  else
  {
    if (time < TIME_DAY) return MORNING;
    if (time < TIME_EVENING) return DAY;
    if (time < TIME_NIGHT) return EVENING;
    if (time > TIME_EVENING) return NIGHT;
    return EVENING;
  }

Я сделал так, но это тоже костыль, так как возможен вариант, когда виртуальный день, условно может быть ночью по часам. Гляну сейчас тот код, но возвращать в любом случае ничего не надо.

 

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

Ну да, можно и так, так громоздче. 

const uint16_t  TIME_NIGHT =   23 * 60 + 10;   // ночь начинается в 23:10
const uint16_t  TIME_MORNING = 6 * 60 + 00;   // утро начинается в 06:10
const uint16_t  TIME_DAY = 6 * 60 + 50;       // день начинается в 06:50
const uint16_t  TIME_EVENING = 22 * 60 + 5;   // вечер в хату начинается в 22:05

const uint8_t  MORNING = 1;
const uint8_t  DAY = 2;
const uint8_t  EVENING = 3;
const uint8_t  NIGHT = 4;



uint8_t GetDayPeriod(const uint8_t AHours, const uint8_t AMinutes) {
    uint16_t time = 60U * AHours + AMinutes;

    if (TIME_NIGHT < TIME_MORNING) {
        if (time < TIME_NIGHT) return EVENING;
        if (time < TIME_MORNING) return NIGHT;
        if (time < TIME_DAY) return MORNING;
        if (time < TIME_EVENING) return DAY;
        return EVENING;
    }
    else {
        if (time < TIME_MORNING) return NIGHT;
        if (time < TIME_DAY) return MORNING;
        if (time < TIME_EVENING) return DAY;
        if (time < TIME_NIGHT) return EVENING;
        return NIGHT;
    }

}

 

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

reset861 пишет:
возможен вариант, когда виртуальный день, условно может быть ночью по часам.

Дак это же надо сразу в ТЗ обговаривать

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

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

reset861
Offline
Зарегистрирован: 27.03.2021

b707

Тот код изначально, что я выложил, он рабочий, но только проблема была в том, что если выключить питание и включить в 15.30 например, то код не смог бы понять какой период времени, до достижения следующей уставки. А второй пример, что я привел, имел проблему с 0 часов, это все было понятно, но почему то никто не понял.

И да, 86 это год рождения, а программированием я занимаюсь с 2007 года и не стал бы задавать вопрос, если бы было все так просто, хотя вроде с первого взгляда все просто, а вот и нет, именно по этой причине я в той теме и глумился, потому что люди не искали решение, а самоутверждались (как и в многих других темах), даже не вникнув в суть проблемы.

DetSimen

Я надеялся, что по тому коду с комментариями, что я выкладывал, это будет понятно. Но в принципе, я так подумал, то можно так же через условие, как вариант с до полуночи и после, все остальные варианты продумать, хотя да, громоздко получится. Но пока остановлюсь на этом варианте и так много времени убил, позже вернусь к этому вопросу, возможно найду какое то более изящное решение, но в любом случае, спасибо за помощь.

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

reset861 пишет:

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

Что за бред ?

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

reset861 пишет:

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

Потому что ты в сравнении использовал равенство, а надо было >= и <=. Тогда твой код в любой момент времени знал бы, какой сейчас интервал, а не только в момент его наступления

reset861
Offline
Зарегистрирован: 27.03.2021

DetSimen

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

В общем, я так и сделаю, просто в инструкции укажу этот момент.

Kakmyc

Мне кажется просто ты не в теме, я не помню что бы ты в той теме был, по этому только для тебя это бред.

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

Ну, я тебе сёдня точно ничего не должен?

reset861
Offline
Зарегистрирован: 27.03.2021

DetSimen

Забей, оставлю с проверкой до и после полуночи.

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

reset861 пишет:

v258
нет

Да. И я тебе кусок своего кода приводил, который у меня в курятнике работает - включает свет в 5:00 и выключает в 16:00. Там по барабану, когда питание включилось, нужный интервал определяется сразу же, а не ждет, когда уставка сработает.

b707
Offline
Зарегистрирован: 26.05.2017

Ресет86, то что ты "типа" программируешь с 2007 г - абсолютно ничего не значит, мы тут видали "программистов с 20летним стажем", которые спрашивали как составить цикл фор.
В твоих задачках нет вообще ничего сложного, они элементарны, твоя проблема в том, что ты не умеешь писать по русски. Обычно это связано - если человек не в состоянии сформулировать задачу на человеческом языке - он и запрограммировать ее не сможет.
Ты еще довольно молод, не все потеряно, развивай язык, больше читай
Судя по картинкам - ты это не только для себя пишешь. Не завидую твоим клиентам, ибо гонору у тебя много, а знаний нет.

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

b707 пишет:
Ресет86, то что ты "типа" программируешь с 2007 г - абсолютно ничего не значит, мы тут видали "программистов с 20летним стажем", которые спрашивали как составить цикл фор. В твоих задачках нет вообще ничего сложного, они элементарны, твоя проблема в том, что ты не умеешь писать по русски. Обычно это связано - если человек не в состоянии сформулировать задачу на человеческом языке - он и запрограммировать ее не сможет. Ты еще довольно молод, не все потеряно, развивай язык, больше читай Судя по картинкам - ты это не только для себя пишешь. Не завидую твоим клиентам, ибо гонору у тебя много, а знаний нет.

707-ой! В моем сообщении №10 с кодом для компа приведено решение в ОДНУ строчку:

время Х(в минутах) внутри интервала  А..В, если ((Х-А) % 1440 < (B-A) % 1440) фсё, блеать!!!!!!!  Это верно всегда, для любых А, В, Х в суточном круге от 0 до 1439 минут!!!!!

Реально уже тупость заебала! Даже Дет достал своими попытками обойтись без знака "%", зато кучей if  в правильной последовательности!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! БЛЯ!

Дет! Я понимаю ТС - он мудак изначально, но ведь ты программист!??? Не могу понять тебя. Сорри.

b707
Offline
Зарегистрирован: 26.05.2017

Влад, не суетись. У большинства задачек много неправильных решений, но и правильных обычно не одно:)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

wdrakula пишет:

Реально уже тупость заебала!

Граф, ну при Вашей продолжительности жизни Вы должны уже были привыкнуть...

Мне понравилось: В России есть две проблемы - дороги и дураки.

Одну можно решить большим количеством гравия, земли, тяжелой техникой, колючей проволокой, собаками. Хорошими руководителями. Но что делать с дорогами?

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

wdrakula пишет:

Реально уже тупость заебала! Даже Дет достал своими попытками обойтись без знака "%", зато кучей if  в правильной последовательности!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! БЛЯ!

Ну так я, к своим годам, напрочь пропил весь интеллектуальный потенциал, что ж ты от меня невозможного требуешь.   :) 

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

b707 пишет:
Влад, не суетись. У большинства задачек много неправильных решений, но и правильных обычно не одно:)

"существует 99 способов, сто профессор сто, первый лёжа...тогда сто один"

reset861
Offline
Зарегистрирован: 27.03.2021

Специально для тебя записал.

https://www.youtube.com/watch?v=eD4gk77GEl8

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

я код не смотрел, так как ни разу не программист, вот не пойму в чём проблема если использовать 24 часовой формат времени то-есть от 0 до 1440 и, делать включение/выключение в этом диапазоне...

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

reset861 пишет:

Специально для тебя записал.

https://www.youtube.com/watch?v=eD4gk77GEl8

Беда в том, что ты реально не понимаешь ))

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

Вот проверенный код для Нано.

 

const int16_t  TIME_NIGHT =   23 * 60 + 10;   // ночь начинается в 23:10
const int16_t  TIME_MORNING = 6 * 60 + 00;   // утро начинается в 06:10
const int16_t  TIME_DAY = 7 * 60 + 50;       // день начинается в 07:50
const int16_t  TIME_EVENING = 21 * 60 + 5;   // вечер в хату начинается в 21:05

const uint8_t  MORNING = 1;
const uint8_t  DAY = 2;
const uint8_t  EVENING = 3;
const uint8_t  NIGHT = 4;

//оcтаток от деления не может быть отрицательным, в реализации для avr есть такая тонкость
int mod(int a, int b) {
  int t = a % b;
  if (t >= 0) return t;
  else return t + b;
}

uint8_t getDayPeriod(byte h, byte m) {
  uint16_t t = 60 * (h % 24) + m % 60;

  if (mod(t - TIME_NIGHT  , 1440) < mod(TIME_MORNING - TIME_NIGHT  , 1440)) return NIGHT;
  if (mod(t - TIME_MORNING, 1440) < mod(    TIME_DAY - TIME_MORNING, 1440)) return MORNING;
  if (mod(t - TIME_DAY    , 1440) < mod(TIME_EVENING - TIME_DAY    , 1440)) return DAY;
  if (mod(t - TIME_EVENING, 1440) < mod(TIME_NIGHT -   TIME_EVENING, 1440)) return EVENING;
  return 0;
}

void setup() {
  Serial.begin(115200);

}

void loop() {
  int h = random(24);
  int m = random(60);
  byte x = getDayPeriod(h, m);

  Serial.print("Время ");
  Serial.print(h);
  Serial.print(" часов ");
  Serial.print(m);
  Serial.print(" минут ");
  Serial.print(" это ");

  switch (x) {
    case DAY     : Serial.print("День");   break;
    case MORNING : Serial.print("Утро");   break;
    case EVENING : Serial.print("Вечер");  break;
    case NIGHT   : Serial.print("Ночь");   break;
    case 0       : Serial.print("Ошибка"); break;
  }

  Serial.println();
  delay(1000);

}

 

Вот вывод:

Время 17 часов 38 минут  это День
Время 10 часов 32 минут  это День
Время 0 часов 38 минут  это Ночь
Время 11 часов 49 минут  это День
Время 0 часов 5 минут  это Ночь
Время 12 часов 2 минут  это День
Время 3 часов 23 минут  это Ночь
Время 7 часов 49 минут  это Утро
Время 16 часов 52 минут  это День
Время 15 часов 49 минут  это День
Время 21 часов 17 минут  это Вечер
Время 16 часов 33 минут  это День
Время 3 часов 18 минут  это Ночь
Время 8 часов 55 минут  это День
Время 1 часов 26 минут  это Ночь
Время 8 часов 7 минут  это День
Время 2 часов 33 минут  это Ночь
Время 19 часов 49 минут  это День
Время 3 часов 21 минут  это Ночь
Время 7 часов 32 минут  это Утро
Время 1 часов 36 минут  это Ночь
Время 5 часов 5 минут  это Ночь
Время 20 часов 31 минут  это День
Время 18 часов 37 минут  это День
Время 17 часов 53 минут  это День
Время 4 часов 4 минут  это Ночь
Время 4 часов 50 минут  это Ночь

Жду извинений. Их, конечно, будет недостаточно!!!

 

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

И в догонку.

1. Помогать тебе, дорогой, никто не обязан.

2. Операция "%" называется не ДЕЛЕНИЕ БЕЗ ОСТАТКА, а ОСТАТОК ОТ ДЕЛЕНИЯ или ВЗЯТИЕ ПО МОДУЛЮ, безграмотное ты создание!

3. В сообщении №10 приведен код, ПРОВЕРЕННЫЙ, который можно запустить на компе или в любом онлайн IDE, если у лишенца нет компилятора С на компе. То есть ты еще и наврал, что верх бесстыдства!

В целом ты проявил мудачество выше крыши.

 

 

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

wdrakula пишет:

И в догонку.

скорее всего ТС не понял, что если есть некоторая переменная тикающая поминутно от 00:00 то % всегда будет возвращать число минут от нулевого времени, независимо сколько дней прошло...
И, "дальше делай, всё что хош"

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

wdrakula пишет:

Вот проверенный код для Нано.

Жду извинений. Их, конечно, будет недостаточно!!!

Куды тебе теперь пицот рублей слать? Я их уже, правда, пропил. :)  другие пришлю. 

P.S. Видео пока не смотрел, по причине благоприобретенной косоватости, завтра паматрю. Надеюсь, про меня тама плохого нет. :) 

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

Дет, дорогой! У меня уже есть 500р и 5000р. и 50000р. и пицот тыщ тоже ;))) так что пей на здоровье! Лехаим!
Если ты в контакте с этим мудаком, пусть извинится. Ничего больше не надо.

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

Еще нужно сказать обязательно.

Я дам ответ на вопрос, почему код из сообщения №10 работает на компе, в любой среде, но у мудака ничего не получилось.

Женя точно знает ответ, Дет, даже если не знает, то знает как получить ответ за 5 минут. Остальные - опишу ТОЛЬКО после извинений от мудака. Тут много людей, знающих где искать стандарты С/С++. Может еще кто захочет помочь страждущим.

Добавлю, что это не "глюк Ардуино", а именно нормальная штатная работа компилятора.