Вывод динамических данных

skyspirit
Offline
Зарегистрирован: 27.02.2015

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Puhlyaviy пишет:

SU-27-16 пишет:

мне кажется что в посте #47 улыбка вовсе не дауновская :)

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

....то глину возить , то - камни - вот он и не может определиться :)

BlockThor
BlockThor аватар
Offline
Зарегистрирован: 08.08.2014

Не читал всю ленту, шибко много мусора.

Но если по делу, то можно сделать такую подпрограмму:

float speedTemp(){
  static unsigned long prevTime = 0; // время когда последний раз был расчет
  static float prevTemp = temp3 * 0.1; // предыдущая температура
  float result;
  if(millis() - prevTime > 1000) {
    result = temp3 - prevTemp;// разница между текущим и предыдущим за единицу времени есть скорость изменения
    prevTime = millis();
    prevTemp = temp3;
    return result;
  }
}

И выводить примерно так:

  myGLCD.printNumF(speedTemp(), 2, 5, 36);

 

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

И что, это реально компилируется?

Функция, которая возвращает значение не всегда, а только тогда, когда сочтет нужным, - это интересное решение.

BlockThor
BlockThor аватар
Offline
Зарегистрирован: 08.08.2014

andriano пишет:

И что, это реально компилируется?

Мдась, загон, но это компилируется :) Хотя в работе не проверял.

А если так:

float speedTemp(){
  static unsigned long prevTime = 0; // время когда последний раз был расчет
  static float prevTemp = temp3 * 0.1; // предыдущая температура
  static float result = 0;
  if(millis() - prevTime > 1000) {
    result = temp3 - prevTemp;// разница между текущим и предыдущим за единицу времени есть скорость изменения
    prevTime = millis();
    prevTemp = temp3;
  }
  return result;
}

 

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

Вообще-то программа должна не только компилироваться, но еще и делать нечто осмысленное.

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

Лично мне представляется 3 варианта более адекватного поведения:

1. Вернуть истинную разницу. При этом производная, очевидно будет посчитана неверно, но мне это представляется меньшим злом. И, опять же, остается вопрос, что делать с prevTemp и prevTime - их можно при преждевременном запросе как обновить, так и оставить прежними.

2. Экстраполировать результат по истинной производной. При этом новое значение температуры не будет соответствовать действительности (хотя оно, вроде, и не нужно). Вопрос с глобальными переменными остается.

3. Значение приращения температуры возвращать в формальном параметре, передаваемом по ссылке, а самой функцией возвращать признак успешного выполнения либо код ошибки.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

мдааааа. я вот задумался. кто тут большой троль.

те кто пытаеться с кучей сарказма добиться что бы человек хоть что то понял

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

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

Puhlyaviy пишет:
мдааааа. я вот задумался. кто тут большой троль.
Облом-с!

BlockThor
BlockThor аватар
Offline
Зарегистрирован: 08.08.2014

andriano пишет:

Вообще-то программа должна не только компилироваться, но еще и делать нечто осмысленное.

Ну, дык, я программу то и не писал, а только подпрограмму.

1. Можно уточнить с учетом реального прошедшего времени:

result = (temp3 - prevTemp)/((millis() - prevTime)/1000);

Глобальные обновляются не раньше чем 1000 миллис.

2. Тоже вариант, но это если нужно выводить скорость изменения температуры чаще чем раз в секунду. 

Хотя непонятно почему "новое значение температуры не будет соответствовать действительности"?

3. Ну да, так обычно и делается. Но мну захотелось как-то так. Типа попроще.

skyspirit
Offline
Зарегистрирован: 27.02.2015

Я вернулся:) опять много непоняток с делай все проще вписал его задал время и работает то тут я не могу разобратся что вписывать в начале кода в плане типов переменных, что в функции void setup()    и   void loop()    я понимаю что эти вопросы оевидны что куда вписывать для опытных людей но я путаюсь, либо пример вышеуказаный неробочий.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

skyspirit пишет:

Я вернулся:) опять много непоняток с делай все проще вписал его задал время и работает то тут я не могу разобратся что вписывать в начале кода в плане типов переменных, что в функции void setup()    и   void loop()    я понимаю что эти вопросы оевидны что куда вписывать для опытных людей но я путаюсь, либо пример вышеуказаный неробочий.

http://arduino.ru/Reference

прям слева вверху описано и то и другое

и примеров там навалом

Radjah
Offline
Зарегистрирован: 06.08.2014

Есть две функции. В одной бегины точены, в другой команды дрочены. Куда инициализацию вставишь, куда обработку засадишь? :)

skyspirit
Offline
Зарегистрирован: 27.02.2015

Мне кажется код кривоват все таки

BlockThor
BlockThor аватар
Offline
Зарегистрирован: 08.08.2014

skyspirit пишет:

Мне кажется код кривоват все таки

Кривоват, но работает, можно ж проверить:

int temp3 = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  temp3 = analogRead(A0); //сюда считываем температуру
  Serial.print(temp3 * 0.1);
  Serial.print(" oC; ");
  Serial.print(speedTemp() * 0.1);
  Serial.println(" oC/sec");
  delay(250);
}

float speedTemp(){
  static unsigned long prevTime = 0; // время когда последний раз был расчет
  static float prevTemp = temp3; // предыдущая температура
  static float result = 0;
  if(millis() - prevTime > 1000) {
    result = (temp3 - prevTemp) * 1000 / (millis() - prevTime);// разница между текущим и предыдущим за единицу времени есть скорость изменения
    prevTime = millis();
    prevTemp = temp3;
  }
  return result;
}

 

skyspirit
Offline
Зарегистрирован: 27.02.2015

а зачем виставлять  temp3 = analogRead(A0);//сюда считываем температуру 

ведь в моем случаи термобародатчик подключен к А4 и А5 

та и тип переменных лучше long ане int

и в этом масиве точно все верно ато у меня че то не работает?

float speedTemp(){
  static unsigned long prevTime = 0; // время когда последний раз был расчет
  static float prevTemp = temp3; // предыдущая температура
  static float result = 0;
  if(millis() - prevTime > 1000) {
    result = (temp3 - prevTemp) * 1000 / (millis() - prevTime);// разница между текущим и предыдущим за единицу времени есть скорость изменения
    prevTime = millis();
    prevTemp = temp3;
  }
  return result;
}
skyspirit
Offline
Зарегистрирован: 27.02.2015

?

BlockThor
BlockThor аватар
Offline
Зарегистрирован: 08.08.2014

Ну, у меня то датчика нету, вот я его симмитировал переменными резистором. Да и код я для проверки и делал. Как тебе надо так и переделай.
Int - это переменная на 2 байта, т.е. самое большее число 32767, а long - 4 байта, т.е. макс 2,147,483,647.
В этой 'подпрограмме' все верно, у меня же работает. А что пишет?