Arduino基础实验7,热敏电阻作温度探测

文档【1】中,我们已经介绍过,热敏电阻是阻值随温度而改变的电子元件,使用Arduino能很方便捕捉到由阻值所引起的电压量变化,从而制作出电子温度计。本文中,创客行将带大家认识Arduino的模拟信号接口,并制作一款实用的电子温度计。

Arduino模拟信号接口

Arduino Nano模拟信号引脚图1 Arduino Nano模拟信号引脚

在Arduino Nano开发板上,如图1,有A0-A7为标志的8个引脚,它们提供了模拟信号输入的功能,其中A0-A5既可以处理模拟信号,也可以类似于“D”标识的数字信号引脚一样,接受数字信号的输入输出,A6和A7只能专注处理模拟信号。处理模拟信号的各引脚提供了10位二级制ADC(Analog-to-Digital Converter,模数转换)功能,它们会把5V(当ARef无连接)或接入ARef的电压分成1024个量化级别,使用

int value = analogRead(A0);

函数,读出相关引脚的模拟量值,其取值范围在0-1023(2的10次方,10位量化)。在Arduino IDE的示例程序basic分类中,有ReadAnalogVoltage代码可以作为参考程序。

/*
 ReadAnalogVoltage
*/
void setup() {
   Serial.begin(9600);   //定义串口速率为9600 bps
}

void loop() {
   int sensorValue = analogRead(A0);           //读取A0输入的电压量化值
   float voltage = sensorValue * (5.0 / 1023.0);  //将量化值还原成电压值
   Serial.println(voltage);                   //串口输出电压值
}

代码1 ReadAnalogVoltage的代码

在代码1中,我们给ReadAnalogVoltage加上注释,这样看起来更为清楚,除了电压值的获取和还原之外,它还使用了Serial的两个函数分别定义串口,和使用串口输出调试数值,那么这些数值在哪里能够观察到呢?

当Arduino Nano使用USB接口和PC连接,它会在USB模拟的串口通道将数据输出到PC上,在Arduino IDE中的串口监视器可以查看到数值(如图2)。

Arduino IDE串口监视器图2 Arduino IDE串口监视器

图3 Arduino模拟信号实验电路

使用如图3的电路来测试ReadAnalogVoltage代码,两个电阻都是10KΩ,把它们在5V和GND之间串联,从它们中间引出测试连线接到A0(图3中紫色线),观察串口监视器,看看输出值是不是在1024的一半,512左右?

Arduino热敏电阻温度计

当把图3中与5V连接的电阻替换成热敏电阻,就可以在A0采集到随温度变动的电压值,它的对应公式是

x=1023*10/A0-10

公式中的10代表分压电阻的阻值,它是根据串联电阻的分压关系构成的。

/*
 temperature experiment
 source by: www.i-makers.info
*/

//定义温度和电阻值对应数组,从-20到+39摄氏度,使用0.01摄氏度单位 
const short temperatureRes[60]={7058,6730,6418,6122,5841,//(-20)->(-16)
                              5573,5318,5074,4843,4622,
                              4412,4212,4021,3840,3657,
                              3504,3348,3200,3060,2928,
                              2802,2683,2570,2463,2362,//0->4
                              2266,2175,2089,2007,1930,
                              1856,1848,1815,1763,1699,
                              1628,1554,1479,1406,1335,
                              1269,1207,1149,1095,1046,
                              1000,958,918,882,848,
                              816,786,757,731,705,
                              681,658,635,614,593//35->39
                            };
                            
void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);
  int sensorRes = (10230.0/sensorValue-10)*100;
  
  //匹配温度电阻值,数组逐次查表法。以后有需要可优化成二分查表法
  int cnt = 0;
  while(cnt<60){
    if(sensorRes>temperatureRes[cnt]){
         break;
    }
    cnt++;
  }
  
  Serial.println(cnt-20);
  delay(1000);
}

代码2 Arduino热敏电阻温度计代码

代码2使用Arduino IDE的串口监视器来查看结果,首先,代码根据串联电阻公式,从A0采集到的电压推算出热敏电阻值,然后,根据该阻值查表找到对应的摄氏温度,将该温度输出到串口中,我们就可以看到当前的温度结果。

热敏电阻的选型是NTC-MF52-103/3435 10K,它的温度对应关系从文档【2】中得到。

实用数码管来显示温度

Arduino数码管电子温度计图4 Arduino数码管电子温度计

把热敏电阻温度计的结果输出到调试界面上,依然不算是一件完整的作品,在文档【3】中,创客行讲述过电子数码管的使用方法,在这里就能派上用场了,下面看看它怎么显示出所探测出的温度值。

/*
 temperature experiment
 source by: www.i-makers.info
 */
 
 /*
数码管显示预设值
 D2 G
 D3 C
 D4 DP
 D5 D
 D6 E
 D7 B
 D8 F
 D11 A
 */
 const int Nixie[12][8]={
 {0,1,0,1,1,1,1,1}, //0
 {0,1,0,0,0,1,0,0}, //1
 {1,0,0,1,1,1,0,1}, //2
 {1,1,0,1,0,1,0,1}, //3
 {1,1,0,0,0,1,1,0}, //4
 {1,1,0,1,0,0,1,1}, //5
 {1,1,0,1,1,0,1,1}, //6
 {0,1,0,0,0,1,0,1}, //7
 {1,1,0,1,1,1,1,1}, //8
 {1,1,0,1,0,1,1,1}, //9
 {0,0,0,0,0,0,0,0}, //none,无显示
 {1,0,0,0,0,0,0,0} //"-"。负号
 };

//定义温度和电阻值对应数组,从-20到+39摄氏度,使用0.01摄氏度单位 
const short temperatureRes[60]={7058,6730,6418,6122,5841,//(-20)->(-16)
 5573,5318,5074,4843,4622,
 4412,4212,4021,3840,3657,
 3504,3348,3200,3060,2928,
 2802,2683,2570,2463,2362,//0->4
 2266,2175,2089,2007,1930,
 1856,1848,1815,1763,1699,
 1628,1554,1479,1406,1335,
 1269,1207,1149,1095,1046,
 1000,958,918,882,848,
 816,786,757,731,705,
 681,658,635,614,593//35->39
 };

void setup() {
 Serial.begin(9600);
 
 for(int i=2;i<13;i++){
   pinMode(i, OUTPUT);
 }
}

void loop() {
 int sensorValue = analogRead(A0);
 int sensorRes = (10230.0/sensorValue-10)*100;

//匹配温度电阻值,数组逐次查表法。以后如有需要可优化成二分查表法
 int cnt = 0;
 while(cnt<60){
 if(sensorRes>temperatureRes[cnt]){
 break;
 }
 cnt++;
 }

 //设置需要显示的各十进制位数值
 int temperatureVal = cnt-20;
 int showVal[3];
 
 showVal[0]=temperatureVal<0?11:10;
 showVal[1]=abs(temperatureVal)/10;
 showVal[2]=abs(temperatureVal)%10;

//每5毫秒刷新一次数码管,每刷新200次,在1秒钟的时候,去循环更新温度值
 for(int cnt=0;cnt<200;cnt++)
 {
   for(int j=0;j<3;j++){
     for(int i=10;i<13;i++){
       digitalWrite(i,1);
     }
 
     for(int i=0;i<8;i++){
       digitalWrite(i+2,Nixie[showVal[2-j]][i]);
     }
 
     digitalWrite(10+j,0);
     delay(5);
   }
  }
}

代码3 Arduino数码管电子温度计代码

代码3中已经添加了必要的中文注释,它的实验电路如图4所示,相对于代码2,它加上了数码管驱动部分的代码,需要首先确定每个十进制位的值,然后通过查Nixie数组,把需要的数码管逐个点亮。看图4,现在就能看到当前所探测的温度了。

总结

使用热敏电阻来探测温度,是基于它随温度而变的阻值来实现的,这个制作对于分压电阻也要求达到相当的精度和温度稳定性,而且电源也不能有太大的噪声波动,否则都会造成测试误差。在以后的文章里,我们还会使用专门的温湿度传感器来继续温度测试的作品。更多的精彩内容,请查看全站目录

 

优秀科技原创内容源,欢迎添加微信公众号。

创客行淘宝店提供本网站电子制作的全部套件

创客行淘宝店地址:https://shop125908459.taobao.com/

参考文档

  1. 大话传感器6-热敏传感器,电阻随温度而改变
  2. 热敏电阻__MF52_10K__3470.pdf
  3. Arduino基础实验3,驱动多位七段数码管
  4. 全站目录

发表评论