温度是我们经常接触到的物理量,能够被我们所直观的感受得到,例如天气凉了需要增添衣物,吃的食物太烫需要吹一吹,同时也需要对温度精确的测量,例如人类的正常体温是37.5℃,一个大气压下纯水沸腾时的温度是100℃等等。
本文教大家如何使用Arduino读取温度传感器的温度值,并在串口显示,温度传感器使用热敏电阻NTC-MF52AT MF52-10KJ,对于使用其他NTC,对本文中相应的代码进行修改同样适用。
一、热敏电阻
热敏电阻是电阻值随温度变化的半导体传感器,其典型特点是阻值对温度非常敏感,在不同的温度下会表现出不同的电阻值,从而根据表现的电阻值可逆推导得到其所处的环境温度值。
按照温度系数不同,可分为正温度系数热敏电阻(PTC)、负温度系数热敏电阻(NTC)和临界负温度系数热敏电阻(CTR)。PTC随着温度升高,表现出的电阻值越大; NTC随着温度升高,表现出的电阻值越低;CTR具有负电阻突变特性,在某一温度下,电阻值随温度的增加急剧减小,具有很大的负温度系数。
由于具有不同的特性,热敏电阻的用途也是不同的。PTC一般用作加热元件和过热保护;NTC一般用于温度测量和温度补偿;CTR一般用于温控报警等应用。 NTC的测温范围为-60~+300℃,标称阻值一般在1Ω至100MΩ之间,采用精密电阻和热敏电阻组合可扩大测量温度线性范围。
热敏电阻NTC-MF52AT MF52-10KJ如图所示:
从某宝上购买的热敏电阻NTC-MF52AT MF52-10KJ模块如图所示:
由图可以知道其上拉电阻使用10k(103)。
二、电路图
以下是电路原理图:
根据电阻的分压关系,可以知道:
利用热敏电阻NTC-MF52AT MF52-10KJ模块实际接线图:
三、程序设计
首先在setup函数内初始化串口,然后在loop函数中读出A1端口值并打印到串口:
void setup() {
// put your setup code here, to run once:
// 初始化串口
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
// 读出当前值,并输出到串口显示
int sensorValue = analogRead(A1);
Serial.println(sensorValue);
delay(1000);
}
打开串口监视器,用手按住与松开热敏电阻,看到值有变化:
注意以上打印出来的是ADC值,Arduino的Anolog端口默认使用10个二进制位表示分辨率 ,而2^10=1024,下面通过添加转换公式输出当前端口读到的电压值:
void setup() {
// put your setup code here, to run once:
// 初始化串口
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
// 读出当前值,并输出到串口显示
int sensorValue = analogRead(A1);
float volt = sensorValue * (5.0 / 1024.0);
Serial.print(volt);
Serial.println(" V");
delay(1000);
}
串口监视器如图所示:
在获得电压值可以进一步计算出当前热敏电阻的阻值大小,利用之前的分压公式:
void setup() {
// put your setup code here, to run once:
// 初始化串口
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
// 读出当前值,并输出到串口显示
int sensorValue = analogRead(A1);
float volt = sensorValue * (5.0 / 1024.0);
float res = (10.0 * volt) / (5.0 - volt);
Serial.print(volt);
Serial.print("V ");
Serial.print(res);
Serial.println("k");
delay(1000);
}
串口监视器如图所示:
知道了热敏电阻的阻值之后,可以查阅温度与阻值的对应关系从而就可以知道当环境的温度啦!下面我通过建立表格与读取表格的方法来获得温度值,当然也可对表格中的数据进行画线拟合,两种方法都可以!
温度/阻值对照表:
这里我提取了0~49℃的Rnor(normal)阻值建表,在程序中建立一个只读的数组,以数组的索引作为温度值,具体每个变量值为阻值,在计算出当前热敏电阻的阻值后,利用循环判断数组中的阻值从而找出当前数组项(即当前环境温度):
const float mf52_10kj[] = {
32.8142, 30.9966, 29.4688, 28.0251, 26.6606,
25.3704, 24.1501, 22.9955, 21.9028, 20.8682,
19.8884, 18.9602, 18.0806, 17.2467, 16.4561,
15.7061, 14.9945, 14.3191, 13.6779, 13.0690,
12.4905, 11.9409, 11.4184, 10.9217, 10.4494,
10.0000, 9.4724, 9.1654, 8.7779, 8.4089,
8.0574, 7.7225, 7.4033, 7.0990, 6.8088,
6.5321, 6.2680, 6.0160, 5.7755, 5.5459,
5.3266, 5.1171, 4.9169, 4.7257, 4.5428,
4.3680, 4.2008, 4.0409, 3.8878, 3.7414,
};
int TempGet(float res) {
int i;
if((res > mf52_10kj[0]) || (res < mf52_10kj[49]))
return -1;
for (i=0; i<50; i++)
{
if ((res < mf52_10kj[i]) && (res > mf52_10kj[i+1]))
return i;
}
}
void setup() {
// put your setup code here, to run once:
// 初始化串口
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
// 读出当前光线强度,并输出到串口显示
int sensorValue = analogRead(A1);
float volt = sensorValue * (5.0 / 1024.0);
float res = (10.0 * volt) / (5.0 - volt);
int temp = TempGet(res);
Serial.print(volt);
Serial.print("V ");
Serial.print(res);
Serial.print("k ");
if(temp == -1) {
Serial.println(" the temperature out of range!");
}
else {
Serial.print(temp);
Serial.println("C");
}
delay(1000);
}
串口监视器如图所示:
标签:温度传感器,Arduino,res,volt,串口,热敏电阻,Serial,温度 From: https://blog.51cto.com/u_13726704/6017509