Обнуление переменной

W42
Offline
Зарегистрирован: 17.05.2020

Товарищи, подскажите пожалуйста как правильно обнулить переменную. Нужно использовать в 2х отдельных случаях (odom1 и odom2) параметры из одной переменной float m.  Но при нажатии на кнопку должно сбрасывать odom2 на 0, а odom1 будет считать дальше. Добился только того что стирается оба показателя если tft.print(m = 0); . Можно ли сделать еще одну переменную с такими же параметрами как и float m ? и обнулять её.

 

unsigned long cur = 0;
unsigned long prev = 0; 
unsigned long m_t = 0; 
float m;
int speed = 0;
int ms = 0; 
int doPin = 20; 
int doPos = 0; 

void con() { 
     m++;
}
void setup()
{   
    Serial.begin(9600);
    uint16_t identifier = tft.readID();
    Serial.print("ID = 0x");
    Serial.println(identifier, HEX);
    if (identifier == 0xEFEF) identifier = 0x9486;
    tft.begin(identifier);  
    pinMode(doPin, INPUT);
    attachInterrupt(2, con, RISING);   
   m = EEPROM_ulong_read(0);
}
// чтение
unsigned long EEPROM_ulong_read(int addr) {    
  byte raw[4];
  for(byte i = 0; i < 4; i++) raw[i] = EEPROM.read(addr+i);
  unsigned long &num = (unsigned long&)raw;
  return num;
}
// запись
void EEPROM_ulong_write(int addr, unsigned long num) {
  byte raw[4];
  (unsigned long&)raw = num;
  for(byte i = 0; i < 4; i++) EEPROM.write(addr+i, raw[i]);
}
void loop() { 
  cur = millis(); 
   ms = cur - prev; 
   if (ms > 500) 
   { 
       prev = cur;  
       speed = (m - m_t) * 3600 / ms; 
       m_t = m;
       ms=0;
  }
tft.setTextColor(GREEN, BLACK);
  tft.setTextSize(3);
  tft.setCursor(200,210);
  float odom1 = m;
  tft.print(odom1);
////////////////////////////
  doPos = digitalRead(doPin);
  float odom2 = odom1; 
  if (doState == LOW) {
    tft.setTextSize(3);
    tft.setCursor(200,180); 
    tft.setTextColor(WHITE, BLACK);   
    tft.print(odom2); 
    }
    else if (doPos == HIGH){ //обнуление 
    tft.setTextColor(RED, BLACK);
  //tft.print(m = 0);
  tft.print(odom1 = 0);    
  }
delay(1000);
 EEPROM_ulong_write(0,m);
}
}

 

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

можете обьяснить, что делает строчка

tft.print(m = 0); 

 

W42
Offline
Зарегистрирован: 17.05.2020

b707 пишет:

можете обьяснить, что делает строчка

tft.print(m = 0); 

 

Обнуляет  переменную.

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

У Вас там скобка лишняя. Кроме того, а неужто Вам так необходимо дергать EEPROM каждый цикл? Так его и засадить недолго. И последнее - 67 строка потрясла. Она же не дает Вашей программе работать.

Да, и прокомментируйте Вашу программу - многое станет понятно. Вы, как я вижу, сами не понимаете, а что она в каждой операции делает. Отсюда и вопросы. Прокомментируйте - не ленитесь.

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

W42 пишет:

Товарищи, подскажите пожалуйста как правильно обнулить

Прстите! Не смог удержаться! Это к В. Терешковой!!! ;))))))))))))) (можно удалить, как неуместную реплику! ;))) )

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

W42 пишет:

b707 пишет:

можете обьяснить, что делает строчка

tft.print(m = 0); 

 

Обнуляет  переменную.

вы уверены? :) Вот не знал, что для обнуления нужен обьект tft. А если у меня нет в программе экрана - я уже и переменную занулить не могу? :)))

Интересно, вы в этом коде хоть одну строчку понимаете?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

b707 пишет:

W42 пишет:

b707 пишет:

можете обьяснить, что делает строчка

tft.print(m = 0); 

 

Обнуляет  переменную.

вы уверены? :) Вот не знал, что для обнуления нужен обьект tft. А если у меня нет в программе экрана - я уже и переменную занулить не могу? :)))

Интересно, вы в этом коде хоть одну строчку понимаете?

Вот интересно: если бы у меня спросили, что делает этот код,  бы тоже ответил - обнуляет переменную. Ведь обнуляет же!

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

PS. Да, кстати, я в этом коде больше половины строк тоже не понимаю.

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

andriano пишет:

PS. Да, кстати, я в этом коде больше половины строк тоже не понимаю.

код достаточно прозрачный. Это спидометр и два одометра - odom1 odom2. Автору нужно, чтобы один одометр считал постоянно, а второй можно было обнулять. 

Но в чем у него проблемы при обнулении - я так и не понял.

W42
Offline
Зарегистрирован: 17.05.2020

b707 пишет:

andriano пишет:

PS. Да, кстати, я в этом коде больше половины строк тоже не понимаю.

код достаточно прозрачный. Это спидометр и два одометра - odom1 odom2. Автору нужно, чтобы один одометр считал постоянно, а второй можно было обнулять. 

Но в чем у него проблемы при обнулении - я так и не понял.

Проблема в обнулении odom2, я не знаю как это правильно сделать. Если вместо 15 строки вставить tft.print(m = 0); - то обнулит оба одометра а нужно только суточник. А в таком случае по нажатию кнопки показывает 0 а отпускаешь - возвращает предыдущее значение. 

 //-------------------------основной 
 tft.setTextColor(WHITE, BLACK);
  tft.setTextSize(3);
  tft.setCursor(200,210);
  float odom1 = m;
  tft.print(odom1);
//--------------------------суточник
  odoPos = digitalRead(odoPin);
  float odom2 = odom1; 
  
  if (odoState == HIGH) {  // кнопка сброса
    float odom2 = 0; 
    tft.setTextColor(RED, BLACK);
    tft.setCursor(200,180); 
    tft.print(odom2);
    }
    else if (odoState == LOW){ 
    tft.setTextColor(WHITE, BLACK);  
    tft.print(odom2);
  }

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Так не присваивайте odom2 значение odom1 (9-я строка) на каждой итерации, тогда будет обнуляться ))

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

W42 - ваша проблема в почти полном отсуствии знаний в программировании.  Я уже несколько раз вам написал. например. что строчка tft.print(m = 0); - это несусветная чушь. Обнуление переменной делается просто присвоением ее значения нулю, вот так n = 0. зачем вы запихиваете это внутрь оператора принт??

далее, относительно кода в последнем сообщении - #8. Переменные odom2 в строке 9 и 12 - это две совершенно разные переменные, когда вы обнуляеете переменную в строке 12 - переменная в строке 9 не меняется. Чтобы понять. почему так просиходит. почитайте что-енибудь на тему "Область видимости переменных в языке С++"