Датчики температуры Макс и Мин - PullRequest
0 голосов
/ 20 марта 2020

(Ссылаясь на последнее выражение if) У меня есть некоторый код, который постоянно дает мне значение T_High, всегда равное T. Если я ищу самую высокую температуру, которую видел код, я не уверен, что мне нужно добавить другую переменную и скорректировать мой код или какова моя текущая проблема. Я пытался найти это онлайн о максимальных и минимальных значениях, но даже с несколькими различными источниками я не смог заставить его работать. Я понимаю, что после моего заявления if я сравниваю их друг с другом, но я думал, что заявление if позаботится об этом. Это в частице IDE (очень похоже на Arduino) .`

#include <math.h>
const int thermistor_output = A1;

void setup() {
Serial.begin(9600); 
}

void loop() {

float T_Low = 999;
float T_High;

int x=0;
int thermistor_adc_val;
double a,b,c,d,e,f,g,h,i,j,T;
double output_voltage, thermistor_resistance, therm_res_ln, temperature_celsius;
while (x < 10 )
{
thermistor_adc_val = analogRead(thermistor_output);
output_voltage = ( (thermistor_adc_val * 3.3) / 4095.0 );
thermistor_resistance = ( ( 3.3 * ( 10.0 / output_voltage ) ) - 10 ); /* Resistance in kilo ohms */
thermistor_resistance = thermistor_resistance * 1000 ; /* Resistance in ohms   */
therm_res_ln = log(thermistor_resistance);
  /*  Steinhart-Hart Thermistor Equation: */
  /*  Temperature in Kelvin = 1 / (A + B[ln(R)] + C[ln(R)]^3)   */
  /*  where A = 0.001129148, B = 0.000234125 and C = 8.76741*10^-8  */
temperature_celsius = ( 1 / ( 0.001129148 + ( 0.000234125 * therm_res_ln ) + ( 0.0000000876741 * therm_res_ln * therm_res_ln * therm_res_ln ) ) ); /* Temperature in Kelvin */
temperature_celsius = temperature_celsius - 273.15; /* Temperature in degree Celsius */
T = temperature_celsius * 1.8 + 29; /* Temperature in degree Fahrenheit */

delay(100);

 x ++ ;
 if (x==1){a=T;}
 if (x==2){b=T;}
 if (x==3){c=T;} 
 if (x==4){d=T;}
 if (x==5){e=T;}
 if (x==6){f=T;}
 if (x==7){g=T;}
 if (x==8){h=T;}
 if (x==9){i=T;}
 }

j=a+b+c+d+e+f+g+h+i;
T=j/9;
 x=0; 

delay(2000);

if (T > T_High) {
        T_High = T;
}

Particle.publish ("Temp", String(T));
Particle.publish ("High", String(T_High));
}
`

1 Ответ

0 голосов
/ 20 марта 2020

T_High является локальной переменной в loop(). Он существует только до выхода из функции loop(). На следующей итерации будет новый экземпляр переменной T_High, которая не имеет отношения к предыдущей. Поэтому вы не сохраняете значение T_High во время вызовов в loop().

Переместите переменную в область видимости файла (т.е. вне определений функций), чтобы она имела длительность хранения c и сохранялась на протяжении всего выполнения программы.

Кроме того, вы никогда не инициализируете T_High значением или не присваиваете ему значение до выполнения теста T > T_High. В этот момент T_High имеет неопределенное значение , и использование неопределенного значения практически любым способом приводит к неопределенному поведению программы, как в данном случае.

Если вы переместите переменную в В данной области файлов эта конкретная проблема будет устранена автоматически, поскольку объекты продолжительности хранения stati c всегда инициализируются нулями, но все же рекомендуется инициализировать T_High разумным значением, например:

float T_High = 0;

или все, что подходит для вашего варианта использования.

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