Изменить значение переменной через определенное время.

tsv_33
Offline
Зарегистрирован: 11.04.2019

Приветствую многоуважаемое сообщество.

Прошу посильной помощи. Допустим есть объявленная переменная float a = 55;

Через 7 суток её нужно изменить на а=65 продолжительностью на 1 час и вернуть в a=55. Как это условие отобразить в коде? Аппаратных часов нет.

Заранее благодарю за ответы и советы.

sadman41
Offline
Зарегистрирован: 19.10.2016

Взять миллис, допустим, пересчитать в (7 суток) и в (7суток+1час), применить "blink без delay".

tsv_33
Offline
Зарегистрирован: 11.04.2019

sadman41 пишет:

Взять миллис, допустим, пересчитать в (7 суток) и в (7суток+1час), применить "blink без delay".

Понимаю, что миллис, но туплю с написанием кода...

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

tsv_33 пишет:

Понимаю, что миллис, но туплю с написанием кода...

и что в таком разе вы ждете от нас?

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

Известно что. Готовое решение.(

#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++;
  }
}

 

tsv_33
Offline
Зарегистрирован: 11.04.2019

Green, спасибо. Попробую отпишусь.

kalapanga
Offline
Зарегистрирован: 23.10.2016

tsv_33 пишет:

Green, спасибо. Попробую отпишусь.

Через семь дней, наверное :)

tsv_33
Offline
Зарегистрирован: 11.04.2019

:)

kalapanga
Offline
Зарегистрирован: 23.10.2016

tsv_33, Только не забудьте, что если ардуинка за эти семь суток вдруг почему-то перезагрузится, она ведь с нуля всё считать начнёт.

tsv_33
Offline
Зарегистрирован: 11.04.2019

Green, в принципе код работает, но один раз и у old_millis нужно скобочки () убрать в if строках. Собственно, какой вопрос, такой ответ :). Я забыл в своём вопросе указать, что сие действие по кругу.

kalapanga, это не принципиально.

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

Да, ошибся на скорую руку.) Надеюсь, сможете подправить что бы по кругу было?

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

Сложными путями идете, товарищи:

float a=55.;
void loop(){
delay((7*(*24+1)*60*60)*1000);
float a=65.;
delay((1*60*60)*1000);
float a=55.;
}

 

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

Абсолютно верно.) Может не скомпилируется с первого раза, но идея согласно ТЗ.)
Формулы, конечно, дикие, и работать будет не так как хотелось бы.)

tsv_33
Offline
Зарегистрирован: 11.04.2019

Green, не, мозгов не хватает...:(

tsv_33
Offline
Зарегистрирован: 11.04.2019

Сообразил, заработало :) Может, что то криво? Но работает. Для проверки интервалы времени уменьшил и уравнял. Вопрос решён. Помощь оказана. Собственно, тему можно закрыть. Всем спасибо!!! 

#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);
}

 

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

Как то корявенько у вас всё, нет понимания.( И на оформление обращайте внимание.
"Сегодня у тебя воротничок не поглажен, а завтра ты напьёшься, уйдёшь в самоволку и убьёшь человека!"

#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);
}

 

tsv_33
Offline
Зарегистрирован: 11.04.2019

Green, спасибо! Вы ещё не видели моего полного проекта, вот бы ругани было, а это всего лишь маленький кусочек...:)

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

)) Исправляться никогда не поздно.) Текст то вы красиво и грамотно пишете - выделение, заглавные буквы, пробелы, знаки препинания... Так и в программе долно быть.)