Глобальные переменные не сохраняют значения при перезапуске IDE

Скейч Часы + 2 термомерта. У Термометров есть минимальное значение, у каждого свое выводимое в порт, после перезапуска IDE не сохраняется минимальное значение а записывается заново.
‘’’
#define photo_rez_pin A2 // порт A2
#define CLK 2
#define DIO 3
#include <microDS3231.h>
#include “GyverTM1637.h”
#include “TM1637.h”
#include “GyverFilters.h”
#include <avr/eeprom.h>
#include <microDS18B20.h>
uint8_t s1_addr = {0x28, 0xD2, 0x83, 0x83, 0x0, 0x0, 0x0, 0x60}; //дом
uint8_t s2_addr = {0x28, 0xC, 0x35, 0x76, 0xE0, 0x1, 0x3C, 0x8A}; //Улица
//{0x28, 0x61, 0x64, 0x34, 0x8E, 0x2F, 0xAA, 0x3C};
MicroDS18B20 <A1, s1_addr> ds1;
MicroDS18B20 <A1, s2_addr> ds2;
GFilterRA analog1; // фильтр назовём analog1
GFilterRA analog2; // фильтр назовём analog2
MicroDS3231 rtc;
GyverTM1637 disp(CLK, DIO);
int8_t TimeDisp = {0x00,0x00,0x00,0x00};
int8_t Temp[4];
int minut;
boolean ifPoint;
uint32_t tmr;
boolean flag;
boolean chto;
byte chto_flag = 2;
unsigned long last_time1;
unsigned long last_time2;
unsigned long last_time3;
unsigned long last_time4;
static uint32_t schitat_DS1;
static uint32_t schitat_DS2;
static uint32_t minimum1 = 250;
static uint32_t minimum2 = 250;

void setup() {
Serial.begin(9600);
disp.clear();
disp.brightness(7); // яркость, 0 - 7 (минимум - максимум)
// установка коэффициента фильтрации (0.0… 1.0). Чем меньше, тем плавнее фильтр
analog1.setCoef(0.50);
// установка шага фильтрации (мс). Чем меньше, тем резче фильтр
analog1.setStep(1);
analog2.setCoef(0.50);
analog2.setStep(1);

}

void loop() {
photo_rez();

if(millis() - last_time1 >= 30000 && chto_flag == 0 ) {
last_time2 = millis();
chto_flag = 1;
Serial.println(“chto_flag = 1”);
}
if(millis() - last_time2 >= 30000 && chto_flag == 1 ) {
last_time3 = millis();
chto_flag = 2;
Serial.println(“chto_flag = 2”);
}
if(millis() - last_time3 >= 30000 && chto_flag == 2 ) {
last_time1 = millis();
chto_flag = 0;
Serial.println(“chto_flag = 0”);
}

if (chto_flag == 0) Clock();
if (chto_flag == 1) Temper_DS1();
if (chto_flag == 2) Temper_DS2();

}
void photo_rez() {
int val = analogRead(photo_rez_pin);
val = map(val, 400, 800, 0, 7);
val = constrain(val, 0, 7);
disp.brightness(val);
// Serial.println(val);
}

void Clock() {
TimeDisp[0] = rtc.getHours() / 10;
TimeDisp[1] = rtc.getHours() % 10;
TimeDisp[2] = rtc.getMinutes() / 10;
TimeDisp[3] = rtc.getMinutes() % 10;
tmr = millis();
flag = !flag;
disp.point(flag); // выкл/выкл точки
Serial.print(TimeDisp[0]);
Serial.print(TimeDisp[1]);
Serial.print(“:”);
Serial.print(TimeDisp[2]);
Serial.println(TimeDisp[3]);

disp.twist(TimeDisp, 50); // скорость прокрутки 100
// delay(500);
}

void Temper() {
static uint32_t schitat;
schitat = round (rtc.getTemperatureFloat()) - 2;
// Serial.print(schitat);
schitat = analog1.filteredTime(schitat);
Serial.println(schitat);
Temp[0] = “”;
Temp[1] = schitat / 10;
Temp[2] = schitat % 10;
Temp[3] = “”;
disp.point(0); // выкл/выкл точки

disp.twist(Temp, 50); // скорость прокрутки 100

}
void Temper_DS1() {
//static uint32_t schitat_DS1;
ds1.requestTemp();
schitat_DS1 = ds1.getTemp() * 10;
Temper_Min_DS1();
// schitat_DS1 = round (ds.getTemp());
schitat_DS1 = analog1.filteredTime(schitat_DS1);

if (ds1.readTemp()) {
Serial.println(schitat_DS1);
Temp[0] = schitat_DS1 / 100;
Temp[1] = schitat_DS1 / 10 % 10;
Temp[2] = schitat_DS1 % 10;
Temp[3] = "X";
disp.point(1);   // выкл/выкл точки
disp.twist(Temp, 50);     // скорость прокрутки 100
}

}

void Temper_Min_DS1() {

if (schitat_DS1 < minimum1) {
minimum1 = schitat_DS1;
Serial.print("minimum = ");
Serial.println(minimum1);
}
if(millis() - last_time4 >= 10000 && chto_flag == 1){
last_time4 = millis();
Serial.print(“min=”);
Serial.println(minimum1);
}
}
void Temper_DS2() {
ds2.requestTemp();
schitat_DS2 = ds2.getTemp() * 10;
Temper_Min_DS2();
// schitat_DS2 = round (ds.getTemp());
schitat_DS2 = analog2.filteredTime(schitat_DS2);

if (ds1.readTemp()) {
Serial.println(schitat_DS2);
Temp[0] = schitat_DS2 / 100;
Temp[1] = schitat_DS2 / 10 % 10;
Temp[2] = schitat_DS2 % 10;
Temp[3] = "X";
  tmr = millis();
  flag = !flag;
  disp.point(flag);   // выкл/выкл точки
disp.twist(Temp, 50);     // скорость прокрутки 100

}

}

void Temper_Min_DS2() {

if (schitat_DS2 < minimum2) {
minimum2 = schitat_DS2;
Serial.print("minimum2 = ");
Serial.println(minimum2);
}
if(millis() - last_time4 >= 10000 && chto_flag == 2){
last_time4 = millis();
Serial.print(“min=”);
Serial.println(minimum2);
}
}
‘’’

Не ‘’', а ```

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

Или вы думаете любые глобальные переменные сохраняются при выключении питания? :slight_smile:

PS если рассчитываете дальше обсуждать свой код - сначала вставьте его правильно.

static uint32_t minimum1 = 250;
static uint32_t minimum2 = 250;

Две переменные, имеют одно значение (каждая своё)
Ардуино питается не зависимо от компьютера.
Домупустим значение 201 (20.1С) минимум… сейчас 222 (22.2С)
Выключаю IDE, включаю заного, открываю монитор порта - минимальное значение 222 (22.2С) куда делось 201?

Когда Вы это делаете - IDE софтверно «нажимает ресет», что равнозначно перезапуску микроконтроллера (отключение и следом включение питания).

Как уже сказал @BOOM - При этом происходит рестарт ардуино и все данные теряются.

Хотите, чтобы сохранялись - пишите их в ЕЕПРОМ.

Кстати, квалификатор static в данном месте абсолютно бесполезен…

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

1 лайк

А должно?

Ну, насчёт “абсолютно”, я бы не был столь категоричен.

Уважаемый, вопрос решён, мы справились без вас, простите…

Спасибо, что держите меня в курсе.

Ай, бросьте! Не за что Вам извиняться.

это был заход с расчетом что вы возразите :slight_smile:

Да, я понимаю что static снаружи любой функции делает переменную локальной для данного файла. Правда я не очень понимаю, в какой ситуации это может пригодится при размещении переменной в главном файле скетча.

Сегодня он главный, а завтра может быть и нет.)

1 лайк

А завтра над ним возьмут верх ))

1 лайк

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

Отредактировал.

И?

Вроде ж, уже было заявлено, что:

Или новый появился?

1 лайк

А нафига?

1 лайк

Он художник, он так видет… :smiley: