Изменить значение переменной через определенное время.
- Войдите на сайт для отправки комментариев
Чт, 11/04/2019 - 11:38
Приветствую многоуважаемое сообщество.
Прошу посильной помощи. Допустим есть объявленная переменная float a = 55;
Через 7 суток её нужно изменить на а=65 продолжительностью на 1 час и вернуть в a=55. Как это условие отобразить в коде? Аппаратных часов нет.
Заранее благодарю за ответы и советы.
Взять миллис, допустим, пересчитать в (7 суток) и в (7суток+1час), применить "blink без delay".
Взять миллис, допустим, пересчитать в (7 суток) и в (7суток+1час), применить "blink без delay".
Понимаю, что миллис, но туплю с написанием кода...
Понимаю, что миллис, но туплю с написанием кода...
и что в таком разе вы ждете от нас?
Известно что. Готовое решение.(
#define MIN(x) ((x) * 60000ul) #define DAY(x) ((x) * 24 * MIN(60)) #define TIME1 DAY(7) #define TIME2 MIN(60) #define VAL1 55. #define VAL2 65. float a = VAL1; static uint8_t state; static uint32_t old_millis = millis(); if (state == 0) { if (millis() - old_millis() >= TIME1) { a = VAL2; old_millis = millis(); state++; } } else if (state == 1) { if (millis() - old_millis() >= TIME2) { a = VAL1; state++; } }Green, спасибо. Попробую отпишусь.
Green, спасибо. Попробую отпишусь.
Через семь дней, наверное :)
:)
tsv_33, Только не забудьте, что если ардуинка за эти семь суток вдруг почему-то перезагрузится, она ведь с нуля всё считать начнёт.
Green, в принципе код работает, но один раз и у old_millis нужно скобочки () убрать в if строках. Собственно, какой вопрос, такой ответ :). Я забыл в своём вопросе указать, что сие действие по кругу.
kalapanga, это не принципиально.
Да, ошибся на скорую руку.) Надеюсь, сможете подправить что бы по кругу было?
Сложными путями идете, товарищи:
float a=55.; void loop(){ delay((7*(*24+1)*60*60)*1000); float a=65.; delay((1*60*60)*1000); float a=55.; }Абсолютно верно.) Может не скомпилируется с первого раза, но идея согласно ТЗ.)
Формулы, конечно, дикие, и работать будет не так как хотелось бы.)
Green, не, мозгов не хватает...:(
Сообразил, заработало :) Может, что то криво? Но работает. Для проверки интервалы времени уменьшил и уравнял. Вопрос решён. Помощь оказана. Собственно, тему можно закрыть. Всем спасибо!!!
#define MIN(x) ((x) * 10000ul) //#define DAY(x) ((x) * 24 * MIN(60)) #define TIME1 MIN(1) #define TIME2 MIN(1) #define VAL1 55. #define VAL2 65. float a = VAL1; static uint8_t state; static uint32_t old_millis = millis(); void setup() { Serial.begin(9600); } void loop() { if (state==0) { if (millis() - old_millis >= TIME1) { a = VAL2; old_millis = millis(); ++state; } } else if (state==1) { if (millis() - old_millis >= TIME2) { a = VAL1; old_millis = millis(); state--; } } Serial.println (String(a)); delay(2000); }Как то корявенько у вас всё, нет понимания.( И на оформление обращайте внимание.
"Сегодня у тебя воротничок не поглажен, а завтра ты напьёшься, уйдёшь в самоволку и убьёшь человека!"
#define MIN(x) ((x) * 10000ul) #define DAY(x) ((x) * 24 * MIN(60)) #define TIME1 MIN(1) #define TIME2 MIN(1) #define VAL1 55. #define VAL2 65. float a = VAL1; void setup() { Serial.begin(9600); } void loop() { static bool state; static uint32_t old_millis = millis(); if (state == false) { if (millis() - old_millis >= TIME1) { old_millis = millis(); a = VAL2; state = true; } } else if (millis() - old_millis >= TIME2) { old_millis = millis(); a = VAL1; state = false; } Serial.println(a); delay(2000); }Green, спасибо! Вы ещё не видели моего полного проекта, вот бы ругани было, а это всего лишь маленький кусочек...:)
)) Исправляться никогда не поздно.) Текст то вы красиво и грамотно пишете - выделение, заглавные буквы, пробелы, знаки препинания... Так и в программе долно быть.)