Библиотека для терморезистора

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

В своих поделках часто использую терморезистор NTC 10kOm.

Есть код которым пользуюсь. Но для удобности хочу оформить его в библиотеку.

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Код замера температуры.

float temp=0.0;//текущее значение температуры
float addr[25][2] = {
  {
    0,32.0                                                              
  }
  ,
  {
    5,25.5                                                              
  }
  ,
  {
    10,20.0                                                              
  }
  ,
  {
    15,15.7                                                                
  }
  ,
  {
    20,12.62                                                                
  }
  ,
  {
    25,10.0                                                                
  }
  ,
  {
    30,8.24                                                                
  }
  ,
  {
    35,6.63                                                                
  }
  ,
  {
    40,5.41                                                                
  }
  ,
  {
    45,4.41                                                                
  }
  ,
  {
    50,3.62                                                                
  }
  ,
  {
    55,2.99                                                                
  }
  ,
  {
    60,2.48                                                                
  }
  ,
  {
    65,2.08                                                                
  }
  ,
  {
    70,1.75                                                                
  }
  ,
  {
    75,1.47                                                                
  }
  ,
  {
    80,1.258                                                                
  }
  ,
  {
    85,1.063                                                                
  }
  ,
  {
    90,0.905                                                                
  }
  ,
  {
    95,0.776                                                                
  }
  ,
  {
    100,0.669                                                                
  }
  ,
  {
    105,0.581                                                                
  }
  ,
  {
    110,0.505                                                                
  }
  ,
  {
    115,0.442                                                                
  }
  ,
  {
    120,0.387                                                                
  }
  ,
};

void loop(){
    temp=getTemp();
}

//------------------замер температуры----------------------
double getTemp()
{
  T_Sensor_ON;
  delay(10);//задержка при подаче питания терморезистора
  int t;
  t=0;
  for (int i=0; i <= 15; i++){
    t = t + analogRead(1);
  }
  t=t/4;  
  float R;
  R=getR(t);
  int i=0;
  while (addr[i][1] >R)
  {
    i++;
  }
  double result;
  result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
  return result;
}
float getR(float V)
{
  float result;
  result=-10*V/(V-4096);
  //result=-10*V/(V-1024);
  T_Sensor_OFF;
  return result;
}

Подскажите с чего начать

/*
TermoRes10k
 */
#ifndef TermoRes_h
#define TermoRes_h
#include "WProgram.h"

class TermoRes
{
public:
  TermoRes(byte pin);//экземпляр класса
  double getTemp();//вычисление температуры
private:
  float getR(float V);//
  byte _pin;
};

#endif

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а температура правильно измеряется? второй резистор на 10к?

axill
Offline
Зарегистрирован: 05.09.2011

yul-i-an пишет:

Подскажите с чего начать

С яндекса, вот например http://robocraft.ru/blog/arduino/102.html

только имейте в виду, что не все термисторы на 10к одинаковы

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yul-i-an пишет:

Подскажите с чего начать

С чтения вот этой инструкции.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

А формула вместо таблиц не подойдёт?

http://playground.arduino.cc/ComponentLib/Thermistor2

axill
Offline
Зарегистрирован: 05.09.2011

trembo пишет:

А формула вместо таблиц не подойдёт?

http://playground.arduino.cc/ComponentLib/Thermistor2

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

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Я этот код уже применял, например тут. Разбирался с ним тут.

Всё устраивает.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Получилось следующее

Фаил TermoRes.h

/*
TermoRes.h
 */
#ifndef TermoRes_h
#define TermoRes_h
//#include "WProgram.h"

class TermoRes
{
public:
  TermoRes(int pin);
  double getTemp();
private:
  float getR(float V);
  int _pin;
};

#endif

Фаил TermoRes.cpp

/*
  TermoRes.cpp
*/
 
#include "WProgram.h"
#include "TermoRes.h"
 
TermoRes::TermoRes(byte pin)
{
  _pin = pin;
}
 
void TermoRes::getTemp(byte _pin)
{
  int t;
  t=0;
  for (int i=0; i <= 15; i++){
    t = t + analogRead(_pin);
  }
  t=t/4;  
  float R;
  R=getR(t);
  int i=0;
  while (addr[i][1] >R)
  {
    i++;
  }
  double result;
  result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
  return result;
}

При компиляции выдает

termostat_PI_proba:2: error: 'TermpRes' does not name a type
termostat_PI_proba.ino: In function 'void loop()':
termostat_PI_proba:63: error: 'termo' was not declared in this scope

Смотрю пример, походу cpp и h перепутал

axill
Offline
Зарегистрирован: 05.09.2011

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, конечно, будет ругаться, если в классе написано TermoRes, а в скетче TermpRes.

Что за addr в строке 24? Он нигде не описан. Если описан в другом файле, то это не считается.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Всё так, папка TermoRes в ней TermoRes.h и TermoRes.cpp. Всё подключилось. Нашел некоторые ошибки

/*
  TermoRes.cpp
*/
 
//#include "WProgram.h"
#include "TermoRes.h"
float addr[25][2] = {
  {
    0,32.0                                                              
  }
  ,
  {
    5,25.5                                                              
  }
  ,
  {
    10,20.0                                                              
  }
  ,
  {
    15,15.7                                                                
  }
  ,
  {
    20,12.62                                                                
  }
  ,
  {
    25,10.0                                                                
  }
  ,
  {
    30,8.24                                                                
  }
  ,
  {
    35,6.63                                                                
  }
  ,
  {
    40,5.41                                                                
  }
  ,
  {
    45,4.41                                                                
  }
  ,
  {
    50,3.62                                                                
  }
  ,
  {
    55,2.99                                                                
  }
  ,
  {
    60,2.48                                                                
  }
  ,
  {
    65,2.08                                                                
  }
  ,
  {
    70,1.75                                                                
  }
  ,
  {
    75,1.47                                                                
  }
  ,
  {
    80,1.258                                                                
  }
  ,
  {
    85,1.063                                                                
  }
  ,
  {
    90,0.905                                                                
  }
  ,
  {
    95,0.776                                                                
  }
  ,
  {
    100,0.669                                                                
  }
  ,
  {
    105,0.581                                                                
  }
  ,
  {
    110,0.505                                                                
  }
  ,
  {
    115,0.442                                                                
  }
  ,
  {
    120,0.387                                                                
  }
  ,
};
 
TermoRes::TermoRes(int pin)
{
  _pin = pin;
}
 
 double TermoRes::getTemp(int _pin)
{
  int t;
  t=0;
  for (int i=0; i <= 15; i++){
    t = t + analogRead(_pin);
  }
  t=t/4;  
  float R;
  R=getR(t);
  int i=0;
  while (addr[i][1] >R)
  {
    i++;
  }
  double result;
  result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
  return result;
}

float TermoRes::getR(float V)
{
  float result;
  result=-10*V/(V-4096);
  //result=-10*V/(V-1024);
  return result;
}
/*
TermoRes.h
 */
#ifndef TermoRes_h
#define TermoRes_h

class TermoRes
{
public:
  TermoRes(int pin);
  double getTemp(int pin);
//private:
  float getR(float V);
  int _pin;
};

#endif

Сейчас выдает

G:\Documents and Settings\Андрей\Мои документы\Загрузки\arduino-1.0.4-windows\arduino-1.0.4\libraries\TermoRes\TermoRes.cpp: In member function 'double TermoRes::getTemp(int)':
G:\Documents and Settings\Андрей\Мои документы\Загрузки\arduino-1.0.4-windows\arduino-1.0.4\libraries\TermoRes\TermoRes.cpp:120: error: 'analogRead' was not declared in this scope

G:\Documents и Settings\Андрей\Мои документы\Загрузки\arduino-1.0.4-windows\arduino-1.0.4\libraries\TermoRes\TermoRes.cpp: в двойной TermoRes функции-члена ':: getTemp(Тип int)':
G:\Documents и Settings\Андрей\Мои документы\Загрузки\с Arduino-1.0.4-окна для Arduino-1.0.4\\библиотек\TermoRes\TermoRes.ЧГК:120: ошибка: 'analogRead' не был объявлен в этой области видимости

Пытаюсь внедрит в проект

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так напишите 

#include <arduino.h>

вот и будет у Вас analogRead описан

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

cpp

/*
  TermoRes.cpp
*/

#include <arduino.h>
#include "TermoRes.h"
float addr[25][2] = {
  {
    0,32.0                                                              
  }
  ,
  {
    5,25.5                                                              
  }
  ,
  {
    10,20.0                                                              
  }
  ,
  {
    15,15.7                                                                
  }
  ,
  {
    20,12.62                                                                
  }
  ,
  {
    25,10.0                                                                
  }
  ,
  {
    30,8.24                                                                
  }
  ,
  {
    35,6.63                                                                
  }
  ,
  {
    40,5.41                                                                
  }
  ,
  {
    45,4.41                                                                
  }
  ,
  {
    50,3.62                                                                
  }
  ,
  {
    55,2.99                                                                
  }
  ,
  {
    60,2.48                                                                
  }
  ,
  {
    65,2.08                                                                
  }
  ,
  {
    70,1.75                                                                
  }
  ,
  {
    75,1.47                                                                
  }
  ,
  {
    80,1.258                                                                
  }
  ,
  {
    85,1.063                                                                
  }
  ,
  {
    90,0.905                                                                
  }
  ,
  {
    95,0.776                                                                
  }
  ,
  {
    100,0.669                                                                
  }
  ,
  {
    105,0.581                                                                
  }
  ,
  {
    110,0.505                                                                
  }
  ,
  {
    115,0.442                                                                
  }
  ,
  {
    120,0.387                                                                
  }
  ,
};
 
TermoRes::TermoRes(int pin)
{
 _pin = pin;
}
 
 TermoRes::double getTemp(_pin)
{
  int t;
  t=0;
  for (int i=0; i <= 15; i++){
    t = t + analogRead(_pin);
  }
  t=t/4;  
  float R;
  R=getR(t);
  int i=0;
  while (addr[i][1] >R)
  {
    i++;
  }
  double result;
  result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
  return result;
}

TermoRes::float getR(float V)
{
  float result;
  result=-10*V/(V-4096);
  //result=-10*V/(V-1024);
  return result;
}

h

/*
TermoRes.h
 */
#ifndef TermoRes_h
#define TermoRes_h

class TermoRes
{
public:
  TermoRes(int pin);
int _pin;  
double getTemp(int _pin);
//private:
  float getR(float V);
 
};

#endif

Выдает

G:\Documents and Settings\Андрей\Мои документы\Загрузки\arduino-1.0.4-windows\arduino-1.0.4\libraries\TermoRes\TermoRes.cpp:115: error: expected unqualified-id before 'double'

ошибка: ожидается безусловный-ID и перед "двойным"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы каждую ошибку компиляции будете сюда выкладывать? Может иногда стоит и в ситаксис языка самому глянуть?

TermoRes::double getTemp(_pin) // бред сивой кобылы

double TermoRes::getTemp(_pin) // определение метода класса

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Всё собралось и работает. Благодарю за помощь! Отдельная благодарность Google и Яндекс переводчику )

h

/*
TermoRes.h
 */
#ifndef TermoRes_h
#define TermoRes_h

class TermoRes
{
public:
TermoRes(int pin);
int _pin;  
double getTemp();
//private:
static  float getR(float V);
  
};
#endif

cpp

/*
  TermoRes.cpp
*/

#include <arduino.h>
#include "TermoRes.h"
static float addr[25][2] = {
  {
    0,32.0                                                              
  }
  ,
  {
    5,25.5                                                              
  }
  ,
  {
    10,20.0                                                              
  }
  ,
  {
    15,15.7                                                                
  }
  ,
  {
    20,12.62                                                                
  }
  ,
  {
    25,10.0                                                                
  }
  ,
  {
    30,8.24                                                                
  }
  ,
  {
    35,6.63                                                                
  }
  ,
  {
    40,5.41                                                                
  }
  ,
  {
    45,4.41                                                                
  }
  ,
  {
    50,3.62                                                                
  }
  ,
  {
    55,2.99                                                                
  }
  ,
  {
    60,2.48                                                                
  }
  ,
  {
    65,2.08                                                                
  }
  ,
  {
    70,1.75                                                                
  }
  ,
  {
    75,1.47                                                                
  }
  ,
  {
    80,1.258                                                                
  }
  ,
  {
    85,1.063                                                                
  }
  ,
  {
    90,0.905                                                                
  }
  ,
  {
    95,0.776                                                                
  }
  ,
  {
    100,0.669                                                                
  }
  ,
  {
    105,0.581                                                                
  }
  ,
  {
    110,0.505                                                                
  }
  ,
  {
    115,0.442                                                                
  }
  ,
  {
    120,0.387                                                                
  }
  ,
};
 
TermoRes::TermoRes(int pin)
{
 _pin = pin;
}
 
 double TermoRes::getTemp()
{
  int t;
  t=0;
  for (int i=0; i <= 15; i++){
    t = t + analogRead(_pin);
  }
  t=t/4;  
  float R;
  R=getR(t);
  int i=0;
  while (addr[i][1] >R)
  {
    i++;
  }
  double result;
  result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
  return result;
}

float TermoRes::getR(float V)
{
  float result;
  result=-10*V/(V-4096);
  //result=-10*V/(V-1024);
  return result;
}

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ЕвгенийП пишет:

Вы каждую ошибку компиляции будете сюда выкладывать? Может иногда стоит и в ситаксис языка самому глянуть?

TermoRes::double getTemp(_pin) // бред сивой кобылы

double TermoRes::getTemp(_pin) // определение метода класса

 

Да это агония от безысходности и непонимания была)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, ставьте через строчку Serial.println, печатайте свои переменные, смотрите на них, найдите в каком месте начались проблемы. локализуйте ошибку и исправьте её. Никто за Вас этого делать не будет.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Поторопился написать о неработоспособности. В железе проблеммы были. Всё устранил Всё работает.

Терморезистор такой NTC 3950 1% 10kOm

Схема включенияRa-10кОм U0-5V

Библиотека TermoRes3950

Библиотека с примером

alex0
Offline
Зарегистрирован: 14.12.2015

Вроде как можно просто по формуле считать, но у меня ни excel ни calc не воспринимают таблицу значений.

Может у кого получится если интересно. Надо по этим точка в excel построить график и вытащить формулу.

температура	Сопротивление Ком
-40 	190.5562 
-39 	183.4132 
-38 	175.6740 
-37 	167.6467 
-36 	159.5647 
-35 	151.5975 
-34 	143.8624 
-33 	136.4361 
-32 	129.3641 
-31 	122.6678 
-30 	116.3519 
-29 	110.4098 
-28 	104.8272 
-27 	99.5847 
-26 	94.6608 
-25 	90.0326 
-24 	85.6778 
-23 	81.5747 
-22 	77.7031 
-21 	74.0442 
-20 	70.5811 
-19 	67.2987 
-18 	64.1834 
-17 	61.2233 
-16 	58.4080 
-15 	55.7284 
-14 	53.1766 
-13 	50.7456 
-12 	48.4294 
-11 	46.2224 
-10 	44.1201 
-9 	42.1180 
-8 	40.2121 
-7 	38.3988 
-6 	36.6746 
-5 	35.0362 
-4 	33.4802 
-3 	32.0035 
-2 	30.6028 
-1 	29.2750 
0 	28.0170 
1 	26.8255 
2 	25.6972 
3 	24.6290 
4 	23.6176 
5 	22.6597 
6 	21.7522 
7 	20.8916 
8 	20.0749 
9 	19.2988 
10 	18.5600 
11 	18.4818 
12 	18.1489 
13 	17.6316 
14 	16.9917 
15 	16.2797 
16 	15.5350 
17 	14.7867 
18 	14.0551 
19 	13.3536 
20 	12.6900 
21 	12.0684 
22 	11.4900 
23 	10.9539 
24 	10.4582 
25 	10.0000 
26 	9.5762 
27 	9.1835 
28 	8.8186 
29 	8.4784 
30 	8.1600 
31 	7.8608 
32 	7.5785 
33 	7.3109 
34 	7.0564 
35 	6.8133 
36 	6.5806 
37 	6.3570 
38 	6.1418 
39 	5.9343 
40 	5.7340 
41 	5.5405 
42 	5.3534 
43 	5.1725 
44 	4.9976 
45 	4.8286 
46 	4.6652 
47 	4.5073 
48 	4.3548 
49 	4.2075 
50 	4.0650 
51 	3.9271 
52 	3.7936 
53 	3.6639 
54 	3.5377 
55 	3.4146 
56 	3.2939 
57 	3.1752 
58 	3.0579 
59 	2.9414 
60 	2.8250 
61 	2.7762 
62 	2.7179 
63 	2.6523 
64 	2.5817 
65 	2.5076 
66 	2.4319 
67 	2.3557 
68 	2.2803 
69 	2.2065 
70 	2.1350 
71 	2.0661 
72 	2.0004 
73 	1.9378 
74 	1.8785 
75 	1.8225 
76 	1.7696 
77 	1.7197 
78 	1.6727 
79 	1.6282 
80 	1.5860 
81 	1.5458 
82 	1.5075 
83 	1.4707 
84 	1.4352 
85 	1.4006 
86 	1.3669 
87 	1.3337 
88 	1.3009 
89 	1.2684 
90 	1.2360 
91 	1.2037 
92 	1.1714 
93 	1.1390 
94 	1.1067 
95 	1.0744 
96 	1.0422 
97 	1.0104 
98 	0.9789 
99 	0.9481 
100 	0.9180 
101 	0.8889 

Источник https://radiomart.org/datchiki-temperatury/153-datchik-temperatury-termistor-ntc-mf52-103-3435.html

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012
alex0
Offline
Зарегистрирован: 14.12.2015

Читал, просто excel не воспринимал те значения. сейчас получил это https://otvet.mail.ru/question/189916153, жду ответов)) 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Почему Вас таблица не устраивает?

Заменяете своими данными

/*
  TermoRes.cpp
*/

#include <arduino.h>
#include "TermoRes.h"
static float addr[Кол-во строк][2] = {

{
...Сюда Ваши зависимости температура сопротивление
} ,
};
 
TermoRes::TermoRes(int pin)
{
 _pin = pin;
}
 
 double TermoRes::getTemp()
{
  int t;
  t=0;
  for (int i=0; i <= 15; i++){
    t = t + analogRead(_pin);
  }
  t=t/4;  
  float R;
  R=getR(t);
  int i=0;
  while (addr[i][1] >R)
  {
    i++;
  }
  double result;
  result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
  return result;
}

float TermoRes::getR(float V)
{
  float result;
  result=-(Сопротивление резистора в делителе)*V/(V-4096);
  return result;
}

 

alex0
Offline
Зарегистрирован: 14.12.2015

yul-i-an пишет:

Почему Вас таблица не устраивает?

Заменяете своими данными

 

А я формулу хочу)) причём простую))

alex0
Offline
Зарегистрирован: 14.12.2015

Всё сделал)) Точность немного хромает, но в целом норм.

У = -25,6ln(Х) + 344,8.   Х сопротивление термистора, У температура в градусах цельсия

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Доработал библиотеку. Расширил диапазон в отрицательные температуры до -45С.

Библиотека

Пример

#include <TermoRes3950.h>//библиотека терморезистора
TermoRes3950 termometr(0);//инициализация терморезистора на АЦП 0
float temp=0.0;//переменная для хранения температуры

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

void loop(){
  temp=termometr.getTemp();//получаем температуру
  Serial.println(temp);//выводим температуру в монитор порта
  delay(1000);//задержка
}

 

Anatoliy30
Offline
Зарегистрирован: 05.06.2017

Доброго времени суток!

Прошу простить великодушно, а как добавить второй термистор в скетч?

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

yul-i-an пишет:

ЕвгенийП пишет:

Вы каждую ошибку компиляции будете сюда выкладывать? Может иногда стоит и в ситаксис языка самому глянуть?

Да это агония от безысходности и непонимания была)

Не стоит с таким уровнем знаний языка библиотеки писать и в инет выкладывать.  Потом в итоге выходит. что две трети либ для ардуино - быдлокод сплошной.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Anatoliy30 пишет:

Доброго времени суток!

Прошу простить великодушно, а как добавить второй термистор в скетч?


#include <TermoRes3950.h>//библиотека терморезистора
TermoRes3950 termo_0(0);//терморезистор первый на АЦП 0
TermoRes3950 termo_1(1);//терморезистор второй на АЦП 1
float temp0=0.0;//переменная для хранения температуры первого терморезистора
float temp1=0.0;//переменная для хранения температуры второго терморезистора
void setup(){
  Serial.begin(9600);
}
void loop(){
  temp0=termo_0.getTemp();//получаем температуру с первого
  temp1=termo_1.getTemp();//получаем температуру со второго
  Serial.println(temp0);//выводим температуру с первого терморезистора
  Serial.println(temp1);//выводим температуру со второго терморезистора
  delay(1000);
}

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

b707 пишет:

yul-i-an пишет:

ЕвгенийП пишет:

Вы каждую ошибку компиляции будете сюда выкладывать? Может иногда стоит и в ситаксис языка самому глянуть?

Да это агония от безысходности и непонимания была)

Не стоит с таким уровнем знаний языка библиотеки писать и в инет выкладывать.  Потом в итоге выходит. что две трети либ для ардуино - быдлокод сплошной.

ТРОЛЬ.

А библиотека со своей задачей справляеться отлично. (Не уверен, Не пользуйся!)

Если можеш лучше предложить, то давай, я не против.

evgta
Offline
Зарегистрирован: 02.09.2016

а чем плоха эта библилтека? все параметры можно выставить  "thermistor.h"

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

evgta пишет:

а чем плоха эта библилтека? все параметры можно выставить  "thermistor.h"

Не встречал. Ссылу скинте для ознакомления.

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

yul-i-an пишет:

Если можеш лучше предложить, то давай, я не против.

Код сырой.  Даже если отбросим корявый синтаксис - логика тоже хромает.

Файл TermoRes.cpp

1. В цикле for в строке 23 считывается и суммируется 16 значений сопротивления резистора.  Для усреднения? - хорошо. Но почему тогда итоговая сумма в строке 26 делится на 4, а не на 16? Из-за этого в процедуру getR передается значение, вчетверо больше реального и там приходится применять странный квалификатор 4096 вместо стандартного 1024. 

2. В той же формуле в процедуре getR  - откуда знак "минус"? Все параметры положительные и результат - сопротивление - тоже положительное. А потому что накосячили и вместо (4096 -V) написали почему-то (V - 4096) Если написать правильно - не понадобиться минус перед формулой.

В общем, такое впечатление, что код откуда-то списан без понимания.  И потом это выкладывается для сообщества.

 

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

yul-i-an пишет:

Anatoliy30 пишет:

Доброго времени суток!

Прошу простить великодушно, а как добавить второй термистор в скетч?


#include <TermoRes3950.h>//библиотека терморезистора
TermoRes3950 termo_0(0);//терморезистор первый на АЦП 0
TermoRes3950 termo_1(1);//терморезистор второй на АЦП 1
float temp0=0.0;//переменная для хранения температуры первого терморезистора
float temp1=0.0;//переменная для хранения температуры второго терморезистора
void setup(){
  Serial.begin(9600);
}
void loop(){
  temp0=termo_0.getTemp();//получаем температуру с первого
  temp1=termo_1.getTemp();//получаем температуру со второго
  Serial.println(temp0);//выводим температуру с первого терморезистора
  Serial.println(temp1);//выводим температуру со второго терморезистора
  delay(1000);
}

 

пробовали? Работает? на каком МК?

на Уно и Нано работать не будет

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

b707 пишет:

пробовали? Работает? на каком МК?

на Уно и Нано работать не будет

У меня других и нет. На них работает и в Proteus`e работает. Проверь.

b707 пишет:

Код сырой.  Даже если отбросим корявый синтаксис - логика тоже хромает.

Файл TermoRes.cpp

1. В цикле for в строке 23 считывается и суммируется 16 значений сопротивления резистора.  Для усреднения? - хорошо. Но почему тогда итоговая сумма в строке 26 делится на 4, а не на 16? Из-за этого в процедуру getR передается значение, вчетверо больше реального и там приходится применять странный квалификатор 4096 вместо стандартного 1024.

Про оверсемплинг слышал чтонибудь?

b707 пишет:

2. В той же формуле в процедуре getR  - откуда знак "минус"? Все параметры положительные и результат - сопротивление - тоже положительное. А потому что накосячили и вместо (4096 -V) написали почему-то (V - 4096) Если написать правильно - не понадобиться минус перед формулой.

В общем, такое впечатление, что код откуда-то списан без понимания.

Да формула не моя, слизал гдето, непомню уже.

Если тебя так коробит от этой библиотеки напиши свою.

Я ей пользуюсь и проблемм небыло еще.

axill
Offline
Зарегистрирован: 05.09.2011

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

http://aterlux.ru/article/ntcresistor

более того в коде делается апроксимация по множеству (до 64) замеров что дает некоторое улучшение точности замера

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

yul-i-an пишет:

b707 пишет:

на Уно и Нано работать не будет

У меня других и нет. На них работает и в Proteus`e работает. Проверь.

О том, что Serial сидит на тех же пинах 0 и 1 - не забыл?

yul-i-an пишет:

Про оверсемплинг слышал чтонибудь?

Да-да. конечно, это оверсамплинг, и потому ты потом вынужден в формуле еще и на 4 делить:)

yul-i-an пишет:

Да формула не моя, слизал гдето, непомню уже.

Весь этот код где-то слизан. И потом отлажен по методу "воткнем сюда t=0 и посмотрим, что выйдет". Нет ничего плохого, если ты его для себя написал. Но выкладывать для других, как библиотеку - не умея программировать и вообще не понимая, что в коде происходит - зачем?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

b707 пишет:

О том, что Serial сидит на тех же пинах 0 и 1 - не забыл?

Ты че скоробленый такой?

Пины 0 и 1 АНАЛОГОВЫЕ имеется в виду.

 double TermoRes3950::getTemp()
{
  int t;
  t=0;
  for (int i=0; i <= 15; i++){
    t = t + analogRead(_pin);
  }
  t=t/4;  
  float R;
  R=getR(t);
  int i=0;
  while (addr[i][1] >R)
  {
    i++;
  }
  double result;
  result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
  return result;
}

В строке 6 чтение с аналогового входа.

 

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

yul-i-an пишет:

Пины 0 и 1 АНАЛОГОВЫЕ имеется в виду.

А программа об этом знает? :)

аналоговые пины обозначаются A0 и А1

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

b707 пишет:

yul-i-an пишет:

Пины 0 и 1 АНАЛОГОВЫЕ имеется в виду.

А программа об этом знает? :)

аналоговые пины обозначаются A0 и А1

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

Буковка не обязательна.

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

yul-i-an, еще одно важное замечание.

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

А программа об этом знает? :)

аналоговые пины обозначаются A0 и А1

Знает. analogRead понимает, что ему дали именно аналоговые пины, а не какие-то другие.

Anatoliy30
Offline
Зарегистрирован: 05.06.2017

Спасибо, что отозвались на мой призыв о помощи! Все работает.

Еще раз, благодарю!

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

Доброго времени суток!

Подскажите пожалуйста, как при выводе температуры с датчиков увидить целые значения? Сотые мне совсем без надобности :) десятые ещё куда ни шло, но только если округлять до 0,5 :)

Возможно ли выводить значения, округлённые до 0,5 градусов? Если нет, то как убрать знаки после запятой?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А как Вы их сейчас выводите?

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

Anatoliy30_2 пишет:

Возможно ли выводить значения, округлённые до 0,5 градусов? Если нет, то как убрать знаки после запятой?

Нет ничего невозможного.

В Вашем случае:

- умножаете на 2,

- прибавляете 0.5,

- округляете до целых,

- делите на 2.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

+0.5 и округление до целого.  о.45+0.5=0.95=> 0  ; 0.55+0.5 =1.05 => 1 ;

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

ЕвгенийП пишет:

А как Вы их сейчас выводите?

tft.setTextSize(3);
tft.setTextColor(WHITE);
tft.setCursor(1, 16); 
tft.print("      ");
tft.setCursor(1, 16); 
tft.print(Temp);

 

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

qwone пишет:

+0.5 и округление до целого.  о.45+0.5=0.95=> 0  ; 0.55+0.5 =1.05 => 1 ;

Наверно это глупый вопрос :) но где это прописывать? 

Я использую библиотеку из этой темы. Округление должно быть прописано в библиотеке или в скетче?

Anatoliy30_2
Offline
Зарегистрирован: 01.07.2017

andriano пишет:

Anatoliy30_2 пишет:

Возможно ли выводить значения, округлённые до 0,5 градусов? Если нет, то как убрать знаки после запятой?

Нет ничего невозможного.

В Вашем случае:

- умножаете на 2,

- прибавляете 0.5,

- округляете до целых,

- делите на 2.

 

А здесь я вообще ничего не понял :(