首页 > 其他分享 >Arduino之读取温度传感器并串口显示

Arduino之读取温度传感器并串口显示

时间:2023-01-17 17:37:11浏览次数:43  
标签:温度传感器 Arduino res volt 串口 热敏电阻 Serial 温度


温度是我们经常接触到的物理量,能够被我们所直观的感受得到,例如天气凉了需要增添衣物,吃的食物太烫需要吹一吹,同时也需要对温度精确的测量,例如人类的正常体温是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如图所示:

Arduino之读取温度传感器并串口显示_arduino

从某宝上购买的热敏电阻NTC-MF52AT MF52-10KJ模块如图所示:

Arduino之读取温度传感器并串口显示_arduino_02

由图可以知道其上拉电阻使用10k(103)。 


二、电路图

以下是电路原理图:

Arduino之读取温度传感器并串口显示_串口通信_03

根据电阻的分压关系,可以知道:

Arduino之读取温度传感器并串口显示_温度传感器_04

利用热敏电阻NTC-MF52AT MF52-10KJ模块实际接线图:

Arduino之读取温度传感器并串口显示_传感器_05


三、程序设计

首先在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);
}

打开串口监视器,用手按住与松开热敏电阻,看到值有变化:

Arduino之读取温度传感器并串口显示_ntc_06

注意以上打印出来的是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);
}

串口监视器如图所示:

Arduino之读取温度传感器并串口显示_传感器_07

在获得电压值可以进一步计算出当前热敏电阻的阻值大小,利用之前的分压公式:

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);
}

串口监视器如图所示:

Arduino之读取温度传感器并串口显示_串口通信_08

知道了热敏电阻的阻值之后,可以查阅温度与阻值的对应关系从而就可以知道当环境的温度啦!下面我通过建立表格与读取表格的方法来获得温度值,当然也可对表格中的数据进行画线拟合,两种方法都可以!

温度/阻值对照表:

Arduino之读取温度传感器并串口显示_传感器_09

Arduino之读取温度传感器并串口显示_温度传感器_10

Arduino之读取温度传感器并串口显示_arduino_11

这里我提取了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之读取温度传感器并串口显示_arduino_12

标签:温度传感器,Arduino,res,volt,串口,热敏电阻,Serial,温度
From: https://blog.51cto.com/u_13726704/6017509

相关文章