Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 19 из 19
  1. #11
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    437

    По умолчанию Re: Arduino и температурный сенсор

    да, пойдет на аналоговый вход.

    Ошибка на 8% для резистора - явный перебор. Они обычно в 1% ошибки укладываются.
    Скорее всего, у тебя тело не догревается :-). Ты подмышку меряешь или пальцы? Пыльцы на пару градусов холоднее тела могут казаться теплыми. Плюс еще надо создать хороший "термический контакт".

    Формула - очень простая. На резисторах падает напряжение V. А точнее - на сопротивлении R1+R2. По не помню какому закону сопротивление последовательно подключенных резисторов - их сумма. Дальше вспоминаем закон Ома. U=I*R
    U - напряжение, I - ток R - сопротивление. Итак, у нас через цепь течет ток I=V/(R1+R2). По еще не помню какому закону, сумма всех токов, втекающих в точку равна сумме всех вытекающих из нее токов. Это означает, что если пренебречь измеряющим прибором (он тока почти не создает), получаем, что через оба резистора течет один и тот же ток (указанный выше, соответственно).

    Соответственно на первом резисторе падает V1=I*R1, а на втором - V2=I*R2. Подставь в эти формулы I и получишь вышенаписанную формулу.

    Но это все доказательство.
    Вот, к примеру, статья в википедии:
    http://ru.wikipedia.org/wiki/Делитель_напряжения

  2. #12
    Новичок
    Регистрация
    22.10.2010
    Сообщений
    11
    Вес репутации
    170

    По умолчанию Re: Arduino и температурный сенсор

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    Ты подмышку меряешь или пальцы?
    Подмышку Достаточно плотно и долго прижимал.
    На счет формулы что то не могу сообразить, но она работает!

  3. #13
    Новичок
    Регистрация
    22.10.2010
    Сообщений
    11
    Вес репутации
    170

    По умолчанию Re: Arduino и температурный сенсор

    Таблица из екселя с уже рассчитанными значениями напряжения:
    Код:
    Значения Вх	V на входе	R термистора	Температура
    77,95155709	0,380622837	133,5		-25
    82,41629595	0,40242332	125,672		-24
    87,08156165	0,425202938	118,35		-23
    91,95252167	0,448986922	111,498		-22
    97,03318287	0,473794838	105,084		-21
    102,3280913	0,499648883	99,0773		-20
    107,844273	0,526583364	93,4469		-19
    113,5770103	0,554575246	88,175		-18
    119,5378098	0,583680712	83,2296		-17
    125,7270549	0,613901635	78,5909		-16
    132,1470136	0,64524909	74,2384		-15
    138,8000646	0,67773469	70,1527		-14
    145,6874497	0,711364501	66,3162		-13
    152,8105253	0,746145143	62,7122		-12
    160,1697253	0,782078737	59,3254		-11
    167,7648433	0,819164274	56,1416		-10
    175,5953077	0,857398963	53,1475		-9
    183,6600593	0,896777633	50,3307		-8
    191,9567007	0,937288578	47,6799		-7
    200,4834099	0,9789229	45,1842		-6
    209,2361876	1,021661072	42,8339		-5
    218,2112643	1,065484689	40,6197		-4
    227,4039529	1,110370864	38,533		-3
    236,8097953	1,156297829	36,5656		-2
    246,4214849	1,203229907	34,7103		-1
    256,232939	1,251137398	32,96		0
    266,2374344	1,299987473	31,3081		1
    276,4259964	1,349736311	29,7487		2
    286,7909156	1,400346267	28,276		3
    297,322409	1,451769575	26,8848		4
    308,0103472	1,503956774	25,5702		5
    318,8459949	1,556865209	24,3274		6
    329,8167327	1,610433265	23,1523		7
    340,9128741	1,664613643	22,0407		8
    352,1221424	1,719346398	20,9889		9
    363,4322146	1,77457136	19,9934		10
    374,8307039	1,830228046	19,0509		11
    386,306425	1,886261841	18,1582		12
    397,8468798	1,942611718	17,3124		13
    409,4377138	1,999207587	16,5109		14
    421,0667973	2,055990221	15,7511		15
    432,7214893	2,112897897	15,0306		16
    444,3883348	2,169864916	14,3472		17
    456,0563916	2,22683785	13,6987		18
    467,7099899	2,283740185	13,0833		19
    479,3395464	2,340525129	12,499		20
    490,9323094	2,397130417	11,9441		21
    502,4780411	2,45350606	11,4169		22
    513,9600568	2,50957059	10,9161		23
    525,3731343	2,565298507	10,44		24
    536,3809524	2,619047619	10		25
    547,9417403	2,675496779	9,55693		26
    559,078751	2,729876714	9,14743		27
    570,1048246	2,783714964	8,75777		28
    581,0108888	2,83696723	8,3869		29
    591,7893432	2,889596402	8,0338		30
    602,4325138	2,941565009	7,69753		31
    612,933084	2,992837324	7,37721		32
    623,2846392	3,043382027	7,072		33
    633,4816181	3,093171963	6,7811		34
    643,5181429	3,142178432	6,50378		35
    653,3892829	3,190377358	6,23934		36
    663,0910143	3,237749093	5,98711		37
    692,419784	3,380955977	5,74646		38
    681,9722949	3,329942846	5,5168		39
    691,1455566	3,374734163	5,29758		40
    700,1369941	3,418637667	5,08828		41
    708,945783	3,461649331	4,88838		42
    717,5696913	3,503758259	4,69743		43
    726,0080258	3,544961063	4,51498		44
    734,2607199	3,585257421	4,3406		45
    742,3267965	3,624642561	4,17391		46
    750,2071328	3,663120766	4,01452		47
    757,9024994	3,700695798	3,86207		48
    765,4129044	3,737367697	3,71624		49
    772,1414862	3,7702221	3,588		50
    779,8858143	3,808036203	3,44314		51
    786,8509824	3,842045813	3,31529		52
    793,6379323	3,875185216	3,19287		53
    800,2483725	3,907462757	3,07563		54
    806,6855208	3,938894145	2,96331		55
    812,9512135	3,969488347	2,85569		56
    819,0475082	3,999255411	2,75256		57
    824,978449	4,028215083	2,65369		58
    830,745857	4,056376255	2,5589		59
    836,3534573	4,083757116	2,46799		60
    841,8031807	4,110367093	2,3808		61
    847,0994515	4,13622779	2,29714		62
    852,2447843	4,161351486	2,21686		63
    857,2428804	4,185756252	2,1398		64
    862,0960169	4,209453207	2,06583		65
    866,8082618	4,232462216	1,9948		66
    871,3828406	4,254799027	1,92658		67
    875,8227361	4,276478204	1,86105		68
    880,1313321	4,29751627	1,79809		69
    884,3124047	4,317931664	1,73758		70
    888,3687109	4,337737846	1,67942		71
    892,3033293	4,35694985	1,62351		72
    896,1196523	4,37558424	1,56975		73
    899,8213778	4,393659071	1,51804		74
    903,0706326	4,409524573	1,473		75
    906,8914572	4,428180944	1,42045		76
    910,267092	4,444663535	1,37439		77
    913,5390148	4,460639721	1,33007		78
    916,711428	4,476130019	1,2874		79
    919,7865155	4,491145095	1,24632		80
    922,7681406	4,505703811	1,20675		81
    925,658085	4,519814868	1,16864		82
    928,4590333	4,533491374	1,13193		83
    931,1745911	4,546750933	1,09655		84
    933,8062054	4,559600612	1,06246		85
    936,3569861	4,572055596	1,0296		86
    938,8290841	4,584126387	0,997924	87
    941,2255452	4,595827857	0,967376	88
    943,5482709	4,607169292	0,937916	89
    945,7997306	4,618162747	0,909498	90
    947,9819321	4,628818028	0,882083	91
    950,0971269	4,639146127	0,85563		92
    952,1474077	4,649157264	0,830101	93
    954,1348625	4,658861633	0,805459	94
    956,0614073	4,66826859	0,78167		95
    957,9289413	4,677387409	0,758701	96
    959,7394253	4,686227663	0,736519	97
    961,4946325	4,69479801	0,715094	98
    963,1963067	4,703106967	0,694397	99
    964,8461591	4,711162886	0,6744		100
    966,4459474	4,718974352	0,655075	101
    967,9971414	4,726548542	0,636398	102
    969,50125	4,733892822	0,618345	103
    970,9599867	4,74101556	0,60089		104
    972,3745994	4,747922848	0,584013	105
    973,7467031	4,754622574	0,56769		106
    975,077524	4,761120723	0,551902	107
    976,3684002	4,767423829	0,536629	108
    977,6206117	4,773538143	0,521852	109
    978,8354639	4,779470038	0,507552	110
    980,0141155	4,785225174	0,493712	111
    981,1576615	4,790808894	0,480316	112
    982,2673878	4,796227479	0,467346	113
    983,3442574	4,801485632	0,454788	114
    984,3893365	4,806588557	0,442627	115
    985,4037076	4,811541541	0,430848	116
    986,3882969	4,816349106	0,419438	117
    987,3440445	4,821015842	0,408384	118
    988,2718176	4,825545984	0,397674	119
    989,1726691	4,829944673	0,387294	120
    990,0474043	4,834215841	0,377233	121
    990,8967519	4,838363046	0,367481	122
    991,7216249	4,842390746	0,358026	123
    992,5226844	4,84630217	0,348859	124
    993,3008629	4,85010187	0,339968	125
    В коде наверное надо создать массивы со значениями на входе и температурой? знач[77,95155709 ...] темп[-21 ...]
    Только вот значения будут не точными на входе. Придется использовать что то вроде:
    Код:
    for (i=0; i<152; i++){
         if (i!=152) {
               if (знач[i]<=знач<[i+1]){
                   Serial.print (темп[i]); }
                        }
         else if (знач[i-1]<знач<=[i]) Serial.print (темп[i]);
    }
    Приведите пожалуйста пример с использованием массивов в arduino коде?Также как в си?

  4. #14
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    437

    По умолчанию Re: Arduino и температурный сенсор

    Ардуино - это и есть С, расширенный несколькими библиотеками. Можно еще использовать линейную аппроксимацию, таблица будет короче.
    Вместо напряжения загоняй сразу снятые с АЦП значения. Напряжение питания соответствует 1023. Можешь сделать V=1023 и округлить напряжение, получишь значение АЦП.

  5. #15
    Новичок
    Регистрация
    22.10.2010
    Сообщений
    11
    Вес репутации
    170

    По умолчанию Re: Arduino и температурный сенсор

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    Можно еще использовать линейную аппроксимацию, таблица будет короче.
    Ниасилю такое

    набросал код:
    Код:
    const int in = 0;
    int sensor = 0;
    int i;
    double temp[]={'-25','-24','-23','-22','-21','-20','-19','-18','-17','-16','-15','-14','-13','-12','-11','-10','-9','-8','-7','-6','-5','-4','-3','-2','-1','0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99','100','101','102','103','104','105','106','107','108','109','110','111','112','113','114','115','116','117','118','119','120','121','122','123','124','125'};
    double sopr[]={'133.5','125.672','118.35','111.498','105.084','99.0773','93.4469','88.175','83.2296','78.5909','74.2384','70.1527','66.3162','62.7122','59.3254','56.1416','53.1475','50.3307','47.6799','45.1842','42.8339','40.6197','38.533','36.5656','34.7103','32.96','31.3081','29.7487','28.276','26.8848','25.5702','24.3274','23.1523','22.0407','20.9889','19.9934','19.0509','18.1582','17.3124','16.5109','15.7511','15.0306','14.3472','13.6987','13.0833','12.499','11.9441','11.4169','10.9161','10.44','10','9.55693','9.14743','8.75777','8.3869','8.0338','7.69753','7.37721','7.072','6.7811','6.50378','6.23934','5.98711','5.74646','5.5168','5.29758','5.08828','4.88838','4.69743','4.51498','4.3406','4.17391','4.01452','3.86207','3.71624','3.588','3.44314','3.31529','3.19287','3.07563','2.96331','2.85569','2.75256','2.65369','2.5589','2.46799','2.3808','2.29714','2.21686','2.1398','2.06583','1.9948','1.92658','1.86105','1.79809','1.73758','1.67942','1.62351','1.56975','1.51804','1.473','1.42045','1.37439','1.33007','1.2874','1.24632','1.20675','1.16864','1.13193','1.09655','1.06246','1.0296','0.997924','0.967376','0.937916','0.909498','0.882083','0.85563','0.830101','0.805459','0.78167','0.758701','0.736519','0.715094','0.694397','0.6744','0.655075','0.636398','0.618345','0.60089','0.584013','0.56769','0.551902','0.536629','0.521852','0.507552','0.493712','0.480316','0.467346','0.454788','0.442627','0.430848','0.419438','0.408384','0.397674','0.387294','0.377233','0.367481','0.358026','0.348859','0.339968'};
    
    
    void setup()
     {
       Serial.begin(9600);
     }
    
    void loop() {
    	sensor = analogRead(in);
            Serial.print("Analog = ");
    	Serial.print(sensor);
            Serial.print("Voltage = ");
            double voltage = sensor*5.0/1023;
            Serial.print(voltage);
            double khom = (11.0*(5.0-voltage)/voltage);
            //khom = 20.000-khom;
            Serial.print("khOm = ");
            Serial.print(khom);
            Serial.print(" temp= ");
            for (i=0;i<151;i++) {
              if (i!=151) {
                if (sopr[i]<=khom && khom<sopr[i+1]){
                  Serial.println(temp[i]); }
              }
              else if (i==151){
               if (sopr[i-1]<khom && khom<=sopr[i]) {
                Serial.println (temp[i]);}}
              }
            delay(1000);
            
     }
    Получаю в ответе какую то белиберду:
    Код:
    &#224;TF569F2\F78\F8\F80LF0\F00
    0\F00
    0\F00
    0\F00
    13881\F00
    Последний раз редактировалось Yo-Ya; 24.10.2010 в 21:04.

  6. #16
    Новичок
    Регистрация
    22.10.2010
    Сообщений
    11
    Вес репутации
    170

    По умолчанию Re: Arduino и температурный сенсор

    Посмотрел пример апроксимации из темы
    Получился следующий код:
    Код:
    #define Temp1Count 8
    #include <avr/pgmspace.h> 
    uint16_t Temp1[Temp1Count][2] PROGMEM = 
    {
      {77.95155709,-25,}, //первое число на входе, второе температура
      {80.18392652,-24.5},
      {256.232939,0},
      {536.3809524,25},
      {772.1414862,50},
      {903.0706326,75},
      {964.8461591,100},
      {993.3008629,125}
    };
      
    const int in = 0;
    int sensor = 0;
    int j;
    void setup()
    {
      Serial.begin(9600);
    }
    
    void loop() {
    	sensor = analogRead(in);
            Serial.print("Analog = ");
    	Serial.println(sensor);
            uint16_t InTemp; 
            uint16_t RealTemp; 
            uint16_t InLeftTemp; 
            InTemp= sensor; 
            j=Temp1Count; 
            do 
              { 
                j--; 
                InLeftTemp=pgm_read_word(&Temp1[j][0]); 
              } 
            while ((j>=0)&&(InTemp<InLeftTemp)); 
            uint16_t InRightTemp=pgm_read_word(&Temp1[j+1][0]); 
            uint16_t OutLeftTemp=pgm_read_word(&Temp1[j][1]); 
            uint16_t OutRightTemp=pgm_read_word(&Temp1[j+1][1]); 
            RealTemp=OutLeftTemp+(OutRightTemp-OutLeftTemp)*(InTemp-InLeftTemp)/(InRightTemp-InLeftTemp);
            Serial.println(RealTemp);    
            delay(1000);
     }
    Выводит целые значения температуры (24 28 30).
    Вопрос, можно ли сделать чтобы выводились промежуточные значения? (24,5 28,3 30,8)

  7. #17
    Новичок
    Регистрация
    05.12.2010
    Возраст
    47
    Сообщений
    3
    Вес репутации
    0

    По умолчанию Re: Arduino и температурный сенсор

    Не силен я в ардуино, но по СИ

    uint16_t Temp1[Temp1Count][2] PROGMEM =
    {
    {77.95155709,-25,}, //первое число на входе, второе температура



    uint16_t = безнаковое 2х байтовое целое ( short )
    как вы собираетесь в него дробное число записывать ? ( и тем более отрицательные )

    если в ардуино нет плавующей точки, то придеться реализовавыть самому ( примеров в инете уйма ), если есть попробуйте заменить uint16_t на float


    з.ы. что касается варианта с double ( либо его нет ) , либо функция вывода не понимает double.
    Варианты решения:
    1) Проверить функцию вывода, скорей всего она должна понимать double, через формат строку println ("Value = %f",temp[i] );
    2) Перед выводом привести к целому. uint16_t u16 = (uint16_t)temp[i];
    Последний раз редактировалось Luks; 17.01.2011 в 11:54.

  8. #18
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,380
    Вес репутации
    10

    По умолчанию Re: Arduino и температурный сенсор

    Arduino поддерживает тип данных с плавающей точкой
    Диапазон значений — от -3.4028235E+38 до 3.4028235E+38.
    Переменная типа float занимает 32 бита (4 байта) в памяти.

    Пример
    float myfloat;
    float sensorCalbrate = 1.117;

    Синтаксис
    float var = val;

    var - имя переменной
    val - присваиваемое значение

    Пример использования в коде
    int x;
    int y;
    float z;

    x = 1;
    y = x / 2; // y теперь равен 0, тип int не может хранить дробные числа
    z = (float)x / 2.0; // z равна 0.5 (следует использовать 2.0, а не 2)
    Последний раз редактировалось Chip; 17.01.2011 в 12:25.

  9. #19
    Новичок
    Регистрация
    22.10.2010
    Сообщений
    11
    Вес репутации
    170

    По умолчанию Re: Arduino и температурный сенсор

    Сделал переменную RealTemp float. Заработало:
    Код:
    #define Temp1Count 13
    #include <avr/pgmspace.h> 
    uint16_t Temp1[Temp1Count][2] PROGMEM = 
    {
      {77.95155709,-25,}, //первое число на входе, второе температура
      {80.18392652,-24.5},
      {132.1470136,-15},
      {191.9567007,-7},
      {256.232939,0},
      {329.8167327,7},
      {421.0667973,15},
      {536.3809524,25},
      {643.5181429,35},
      {772.1414862,50},
      {903.0706326,75},
      {964.8461591,100},
      {993.3008629,125}
    };
      
    const int in = 0;
    int sensor = 0;
    int j;
    void setup()
    {
      Serial.begin(9600);
    }
    
    void loop() {
    	sensor = analogRead(in);
            Serial.print("Analog = ");
    	Serial.println(sensor);
            uint16_t InTemp; 
            float RealTemp; 
            uint16_t InLeftTemp; 
            InTemp= sensor; 
            j=Temp1Count; 
            do 
              { 
                j--; 
                InLeftTemp=pgm_read_word(&Temp1[j][0]); 
              } 
            while ((j>=0.0)&&(InTemp<InLeftTemp)); 
            float InRightTemp=pgm_read_word(&Temp1[j+1][0]); 
            float OutLeftTemp=pgm_read_word(&Temp1[j][1]); 
            float OutRightTemp=pgm_read_word(&Temp1[j+1][1]); 
            RealTemp=OutLeftTemp+(OutRightTemp-OutLeftTemp)*(InTemp-InLeftTemp)/(InRightTemp-InLeftTemp);//RealTemp=(uint16_t)RealTemp;
            Serial.print("temp = ");Serial.println((RealTemp));    
            delay(1000);
            
     }
    Всем спасибо!

Страница 2 из 2 ПерваяПервая 12

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •