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

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

 串口监视器如图所示:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值