sábado, 18 de fevereiro de 2017

Medindo a temperatura com um termistor

O hardware do projeto. O circuito do termistor utilizado neste projeto corresponde ao circuito presente na placa shield RAMPS 1.4 para Arduino Mega. É composto por um resistor de 4k7  formando  um divisor de tensão com um termistor de 100k. Um filtro com capacitor 100nF e resitor de 100k conecta o divisor de tensão a porta analógica do  Arduino(A0). O circuito está ilustrado no fritzing abaixo.


Leitura da porta A0: A leitura da Porta A0 é uma medida de temperatura, mas por causa das caracteristicas do termistor não é linear e nem está em graus centigrados. Uma conversão para graus centigrados deve ser realizada.

Conversão para °C: Como falta uma fórmula matemática para esta conversão para graus centígrados, a maneira de realizá-la é utilizando uma tabela de valores aferidos e depois calcular a medida interpolando valores de duas linha da tabela.

Criação da Tabela. Alguém precisa criar uma tabela, que normalmente é levantada por aferição da tempertura com termometro preciso. Na construção da tabela, para cada leitura da porta analógica do Arduino, deve-se registrar a temperatura no termõmetro. Tem uma tabela pronta lá embaixo que foi contruída para termistores de 100k bastante utilizados nas medições de temperatura de impressoras 3D open source e serve para o circuito do projeto. Se o seu termistor é diferente, você terá que obter a tabela.

Exemplo 1 de conversão: Se a leitura da porta A0 for 205, conforme a tabela abaixo a temperatura corrrespondente é 165°C.

Exemplo 2 de conversão:  Se a leitura da porta A0 for  135, conforme a tabela abaixo a temperatura deve estar entre 190°C e 185°C. O valor exato será:

190 + (135-131)*(185-190)/(143-131) = 188,33 °C

Cálculo: O cálculo do valor foi realizado por interpolação na tabela. Se você se interessar pesquise sobre como interpolar.

Tabela de conversão Leitura digital na porta A0 para °C

A0°CA0°CA0°C
23300109200591100
2529512019562895
2729013119066590
2828514318570285
3128015618073780
3327517117577075
3527018717080170
3826520516583065
4126022416085760
4425524515588155
4825026815090350
5224529314592245
5624032014093940
6123534813595435
6623037913096630
7122541112597725
7822044512098520
8421548011599315
9221051611099910
10020555310510045
10080


Sketch A sketch Arduino abaixo realiza a leitura, converte e envia para o computador via monitor serial 1 vez a cada segundo.

\\ tabela de conversão AD para graus centígrados
const short temptable[][2] = {   
{       23 ,       300     },
{       25 ,       295     },
{       27 ,       290     },
{       28 ,       285     },
{       31 ,       280     },
{       33 ,       275     },
{       35 ,       270     },
{       38 ,       265     },
{       41 ,       260     },
{       44 ,       255     },
{       48 ,       250     },
{       52 ,       245     },
{       56 ,       240     },
{       61 ,       235     },
{       66 ,       230     },
{       71 ,       225     },
{       78 ,       220     },
{       84 ,       215     },
{       92 ,       210     },
{       100 ,       205     },
{       109 ,       200     },
{       120 ,       195     },
{       131 ,       190     },
{       143 ,       185     },
{       156 ,       180     },
{       171 ,       175     },
{       187 ,       170     },
{       205 ,       165     },
{       224 ,       160     },
{       245 ,       155     },
{       268 ,       150     },
{       293 ,       145     },
{       320 ,       140     },
{       348 ,       135     },
{       379 ,       130     },
{       411 ,       125     },
{       445 ,       120     },
{       480 ,       115     },
{       516 ,       110     },
{       553 ,       105     },
{       591 ,       100     },
{       628 ,       95      },
{       665 ,       90      },
{       702 ,       85      },
{       737 ,       80      },
{       770 ,       75      },
{       801 ,       70      },
{       830 ,       65      },
{       857 ,       60      },
{       881 ,       55      },
{       903 ,       50      },
{       922 ,       45      },
{       939 ,       40      },
{       954 ,       35      },
{       966 ,       30      },
{       977 ,       25      },
{       985 ,       20      },
{       993 ,       15      },
{       999 ,       10      },
{       1004 ,       5       },
{       1008 ,       0       }
};

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

void loop() {
  short a = 0 ;
  int i;
  float celsius;
  a = analogRead(A1) ;
  for (i=1; i<sizeof(temptable)/(2*sizeof(short)); i++) {
      if ( temptable[i][0] > a){ // calculo interpolação
        celsius = temptable[i-1][1] + (a - temptable[i-1][0]) * (
          (float)(temptable[i][1] - temptable[i-1][1]) /
          (float)(temptable[i][0] - temptable[i-1][0]));
        break;
      }
  }
  Serial.print( a ); // enviando medidas de temperatura para monitor
  Serial.print( " - ");
  Serial.print(celsius);
  Serial.println( " C");
  delay(1000);
}


Visualizaçao do resultado: Visualização da saída do programa no monitor é conforme a figura abaixo:


Nenhum comentário:

Postar um comentário