Главное стоять на своём. Можно обнулять миллис перед выставлением интервала и вычитать из интервала “обнулённый миллис”.
… пока разность не превратится в ноль, или его окрестности.
Где Вы взяли stop? Сложением? Я же Вам написал, что так делать нельзя ни при каких обстоятельствах. Или где?
И спрашивать не надо. Достаточно это утвердительно сказать.
Я как-то даме (подруге жены) комплимент сделал, так дулась потом как мышь на крупу. А всего-то делов было:
Она: Ты что, считаешь, что я полная дура?
Я: Да, боже упаси, почему полная – очень даже стройная!
Ну, ведь, комплимент же! Хрен их этих баб поймёт ![]()
бляха, в действительно, даже утвердительно звучит агрессивно) а что женщина на это подумает - то затрудняюсь предположить, но вряд ли вариант комплимента будет на первом месте.
Здесь речь идет о том, что я выставил раньше, чем Вы написали. А Вашу статью я изучаю с большим интересом.
Напомнило вот что:
- Вы голубой?
- Как вы узнали?
- Да я просто спросил.
Ну, тут ещё от человека зависит. Я когда был студентом, мы изобрели довольно точный датчик дураков (библиотеки для Ардуино нет – сами пишите).
К потолку был подвешен такой шарик на резиночке (была такая игрушка - его кидаешь, а он в руку возвращается). Каждый заходивший и видевший его в первый раз, тут же начинал за него дёргать, а потом спрашивать “что это такое?”. Мы с невинным видом отвечали, что это мол дуракометр. Так вот, дураки на это обижались, а нормальные парни улыбались и отшучивались. Очень точный был датчик.
Журналист спрашивает главврача психбольницы, какой тест является
критерием для выписки пациента.
- Мы наливаем полную ванну воды, кладем рядом чайную ложечку и большую
кружку и предлагаем освободить ванну от воды. - Ну, любой нормальный человек, естесственно, возмет кружку.
- Нет, нормальный человек вынет пробку.
Учитывая настоятельные рекомендации ЕвгенийП по использованию millis(),
скетч переделан следующим образом:
static uint32_t period13 = 500;
static uint32_t moment13;
static uint32_t stopor;
static uint32_t delta;
static uint32_t tiktik;
bool trigger;
bool flag = true;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
Serial.begin(9600);
stopor = 2 * 60000;
tiktik = millis();
}
void loop()
{
if (millis() - moment13 >= period13)
{
moment13 = millis();
trigger = !trigger;
digitalWrite(13, trigger);
if (trigger)
{
if (flag)
{
if (millis() - tiktik >= stopor)
{
// здесь сигнал об окончании периода
flag = false;
}
}
// дальше вычисляется и выводится остаток до окончания периода в минутах и секундах
// прошу не смеяться, если что не так, а помочь реализовать эту часть
if (flag)
{
delta = stopor - millis();
delta = (int) (delta / 1000);
int min_min = (int) (delta / 60);
int sec_sec = delta - (min_min * 60);
// String stroka = "";
stroka = String(min_min);
stroka += " ";
stroka += String(sec_sec);
Serial.println(stroka);
}
}
}
// если после этой строки будут какие-то задержки delay(), например, то строка 28 не выполнится 3600 раз за час
// а мне надо чтобы она выполнилась 3600 раз
}
в строках 40-49 вычисляется и выводится остаток в минутах и секундах до окончания периода.
Прошу помочь упростить эту часть.
Спасибо!
В вопросе сортировки дураков, главное быть в себе уверенным ИМХО)))
Код, который не компилируется нельзя ни упростить, ни усложнить. Напишите его для начала по-человечески, чтобы хотя бы компилировался. Потом сформулируйте цель упрощения - чего хотите достичь. Тогда можно будет и подумать.
Прошу прощения.
static uint32_t period13 = 500;
static uint32_t moment13;
static uint32_t stopor;
static uint32_t delta;
static uint32_t tiktik;
bool trigger;
bool flag = true;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
Serial.begin(9600);
stopor = 2 * 60000;
tiktik = millis();
}
void loop()
{
if (millis() - moment13 >= period13)
{
moment13 = millis();
trigger = !trigger;
digitalWrite(13, trigger);
if (trigger)
{
if (flag)
{
if (millis() - tiktik >= stopor)
{
// здесь сигнал об окончании периода
flag = false;
}
}
// дальше вычисляется и выводится остаток до окончания периода в минутах и секундах
// прошу не смеяться, если что не так, а помочь реализовать эту часть
if (flag)
{
delta = stopor - millis();
delta = (int) (delta / 1000);
int min_min = (int) (delta / 60);
int sec_sec = delta - (min_min * 60);
// String stroka = "";
String stroka = String(min_min);
stroka += " ";
stroka += String(sec_sec);
Serial.println(stroka);
}
}
}
// если после этой строки будут какие-то задержки delay(), например, то строка 28 не выполнится 3600 раз за час
// а мне надо чтобы она выполнилась 3600 раз
}
В строке 40 я нахожу время в миллисекундах delta, оставшееся до истечения периода stopor.
Необходимо преобразовать delta в минуты и секунды. В этом скетче это преобразование работает (строки 40 - 49). Можно ли это сделать проще?
Простите, Вы читать умеете? Я же Вам сказал:
Ну, вот, скажите, кто, кроме Вас знает, что Вы понимаете под слово “проще”? Короче по буквам? Быстрее работает? Меньше памяти занимает? Что?
Кстати, грабли там по коду нехило так разбросаны, если Вам это интересно.
Очень интересно о граблях.
Что касается упрощения, то сделать это грамотней.
Интервалы более пары минут (ну десятка минут, допустим) грамотнее брать с RTC, а не через millis()…
и не обсуждать это две недели)
Мне это надоело, я устал и ухожу. Похоже, Вы не знаете сами, что именно Вам нужно. Ну, или старательно троллите.
А до грамотнее, напишите в 43-ей строке нормальный остаток от деления, зачем так “через Альпы-то”?
Простейший код на два таймера.Больше вывод в сериал занимает.
Если надо вывод дни/часы/минуты - дописать общую функцию несложно
Спойлер
uint32_t sectmr = 0;
uint32_t stop1 = 604800;//7 * 24 * 60 * 60 т.е 7 дней
bool STOP1 = true;
uint32_t stop2 = 3600;//1 час
bool STOP2 = true;
void setup() {
Serial.begin(9600);
}
void loop() {
if(millis() - sectmr >= 1000)
{//каждую секунду
sectmr = millis();
if(--stop1 && STOP1)
{
Serial.print("stop1 ");
Serial.println(stop1);
}
else
{
if(STOP1)
{
Serial.println("stop1 done");
STOP1 = false;
//время 604800сек вышло
}
stop1 = 0;//остановка таймера
}
if(--stop2 && STOP2)
{
Serial.print("stop2 ");
Serial.println(stop2);
//выполняем что-то(что длится менее секунды + код) 3600 раз
}
else
{
if(STOP2)
{
Serial.println("stop2 done");
STOP2 = false;
//время 3600 вышло
//чтобы повторить, перезапускаем таймер
//stop2 = 3600;//в этом случае флаг STOP2 не сбрасываем
}
//stop2 = 0;//если надо остановить таймер
}
}
}
P.S. чуть дополнил
