温湿度采集存储系统设计的系统软件研究

2016-11-10 10:39吴云沛胡永金张西平
电子测试 2016年19期
关键词:串口温湿度单片机

吴云沛,胡永金,张西平

(湖北汽车工业学院,湖北十堰,442002)

Wu Yunpei,Hu Yongjin,Zhang Xiping

(Hubei University Of Automotive Technology,Shiyan Hubei,442002)

温湿度采集存储系统设计的系统软件研究

吴云沛,胡永金,张西平

(湖北汽车工业学院,湖北十堰,442002)

本文介绍了温湿度传感器的检测流程、存储软件的SD卡写入流程和主控软件的设计、程序开发和测试结果。

温湿度传感器; 单片机

Wu Yunpei,Hu Yongjin,Zhang Xiping

(Hubei University Of Automotive Technology,Shiyan Hubei,442002)

1 温湿度检测软件设计

1.1关于温湿度传感器检测流程的设计

DHT11数字温湿度传感器采集一次数据的流程如图1所示。其具体操作为:首先,对单片机进行初始化,实现I/O管脚的配置,然后单片机给DHT11发送开始信号,接下来看DHT11是否有信号响应,如果没有的话,单片机就会再次发送开始信号;如果获得响应信号,则单片机实现数据采集,将采集的40位数据发送给单片机,校验和,如果不正确,则丢弃;如果正确的话,会把数据进行转化,也就是把二进制转成十进制,完成。

图1 传感器单次数据采集流程示意图

1.2关于温湿度传感器的测试程序开发

此程序的开发来源于传感器采集数据流程图。首先定义DHT11的管脚,根据接口电路设计的连接方式,定义A0号引脚为信号的输入脚,对应传感器的输出信号引脚,以字节的方式读取数据。接下来就是对单片机进行初始化。要实现这个过程部分编译为:

DDRC |= _BV(DHT11_PIN);//初始化单片机

PORTC |= _BV(DHT11_PIN);

单片机初始化后,首先单片机将A0口变为低电平,确保DHT11能检测到起始信号,至少等待18ms,等到其开始信号完成后,还需要等待40us,然后就是对DHT11有没有响应做判断,如果没有响应,就会返回;如果有响应,此时低电平状态延时等待80us,然后会把DHT11的低电平改为高电平,延时等待80us。部分编译如下:

byte read_dht11_dat()//以字节读取数据

PORTC &= ~_BV(DHT11_PIN);

delay(18);//将单片机的A0口拉为低电平至少18ms

PORTC |= _BV(DHT11_PIN);

delayMicroseconds(40);

DDRC &= ~_BV(DHT11_PIN);

delayMicroseconds(40);

dht11_in = PINC & _BV(DHT11_PIN);//单片机将开始信号发送给DHT11

if(dht11_in){//判断DHT11是否响应

return;

delayMicroseconds(80);//延时等待80us

dht11_in = PINC & _BV(DHT11_PIN);

if(!dht11_in)

return;

delayMicroseconds(80);//延时等待80us

DHT11开始传送数据,单片机接收到DHT11发送的40位数据,然后校验和,判断校验和是否正确。部分编译如下:

for (i=0; i<5; i++)

dht11_dat[i] = read_dht11_dat();

DDRC |= _BV(DHT11_PIN);

PORTC |= _BV(DHT11_PIN);

byte dht11_check_sum = dht11_dat[0]+dht11_ dat[1]+dht11_dat[2]+dht11_dat[3]; //校验和

if(dht11_dat[4]!= dht11_check_sum)

{;

根据以上部分编译,然后具体编译,在setup()函数中完成单片机的初始化,在loop()函数中完成温湿度数据的采集,再加入delay()函数,每间隔一定时间重复一次loop()中的程序。为了便于测试,则运用Arduino IDE中的软件串口,这样就可以实时的通过软件串口来显示温湿度传感器的数据。在setup()中,配置软件串口的速率为19200bps,具体为:Serial.begin(19200)。

1.3关于温湿度传感器测试结果的表述

将编译好的程序代码通过USB下载至Arduino UNO开发板上,然后打开串口监视器,结果如果是如图2所示的。Read是串口输出准备,Current humdity=56.0%是当时的湿度数据,temperature=27℃是当时的温度数据,这种结果表明传感器已经响应,数据的采集正在进行中。进一步说明,DHT11数字温湿度传感器可以正常采集数据,如果还没有连接到传感器或读取数据错误,则可能会看到其他错误的提示。

图2 DHT11传感器测试结果

2 存储软件设计

2.1SD卡写入流程设计

图3为SD卡写入流程设计的过程。对于SD卡存储数据,首先对单片机进行初始化,主要是初始化单片机的SPI串口,然后初始化SD卡,下来就会将文件打开,再接下来就是对文件的打开是否正确进行判断,如果文件的打开是正确的,那么接下来就开始写文件,完成后就会把文件关闭;如果打开不正确,就会重新打开。

图3 SD卡一次写入的流程示意图

2.2SD卡测试程序开发

由图3可知,我们先要建一个文件夹,然后给其命名。然后定义SD卡的CS引脚,根据SD卡接口电路的设计,将SD卡的CS连接到单片机的10号引脚,初始化单片机的SPI串口,初始化SD卡,然后打开文件,实例如下编译:

pinMode(10, OUTPUT);//设置10引脚为输出模式

myFile = SD.open("test.txt", FILE_WRITE);//打开文件

把文件打开以后,同时判断有没有正常打开,如果是正常打开的,就会开始写文件,完毕后关闭文件,终止。部分程序编译如下:

myFile.close();//关闭文件

文件关闭之后再打开已经写入内容的文件,然后再编写程序:

m y F i l e = S D.o p e n("t e s t.t x t");//重新打开文件

这个程序的setup()函数主要是完成对SD卡的初始化与打开文件,然后对文件是不是正常的作出判断,并读取第二次打开文件中的内容,完成后将文件关闭。在loop()中没有这个操作,那是由于这个程序只运行一次 。为了便于测试,则运用Arduino IDE中的软件串口,这样就可以实时的通过软件串口来显示SD卡中写的内容。在setup()中,配置软件串口的速率为9600bps,具体为:Serial.begin(9600)。

2.3SD卡读写测试结果

将编译好的程序代码通过USB下载至Arduino UNO开发板上,然后打开串口监视器,结果若是如图4所示,testing 1,2,3.,是写入SD卡的内容。然后通过计算机打开SD卡,可以看到文件名为TEST.TXT,如图5所示,写入的信息为testing 1,2,3,说明SD卡写入的数据正确,进一步说明SD卡可写。

图4 串口测试结果

图5 SD卡的内容

3 主控软件设计

3.1主控流程设计

图6是数据采集存储的流程设计。具体体操作为:首先对系统进行初始化,实现I/O和SPI串口的初始化,然后单片机给DHT11发送开始信号,并判断DHT11是否响应,若响应,则开始数据的采集,再打开文件将采集的数据写入文件,写完之后关闭该文件结束;若未响应,则返回。

图6 一次数据采集存储流程示意图

3.2主控程序设计

对于主控程序的设计,主要是温湿度传感器进行数据的正确采集,然后打开文件,将采集的数据正确写入SD卡,以实现数据存储的功能。具体步骤如下表述,第一步,先将系统初始化,这里的初始化主要指A0口和单片机的SPI的初始化,我们分别定义A0号引脚为信号的输入,单片机10、11、12、13号引脚,把10号引脚设置成输出模式,11号引脚设置成数据输出模式,12号引脚设置成数据输入模式,13号引脚设置成时钟输出模式。具体编译如下:

int chipSelect = 10;//定义管脚

int dataOut =11;

int dataIn = 12;

int clockPin = 13;

pinMode(chipSelect,OUTPUT);//初始化单片机的SPI引脚和I/O引脚

pinMode(dataIn,INPUT);

pinMode(dataOut,OUTPUT);

pinMode(clockPin,OUTPUT);

pinMode(A0,OUTPUT);

以字节的方式读取数据,部分编译如下:

byte read_dht11_dat()

byte i = 0;//定义变量

byte result=0;

for(i=0; i< 8; i++)

while(!(PINC & _BV(DHT11_PIN)));//当开始发送数据时,等待50秒

delayMicroseconds(30);//延时等待30微妙

if(PINC & _BV(DHT11_PIN))//判断第一个位数据是否发送完

result |=(1<<(7-i));

while((PINC & _BV(DHT11_PIN)));//当第一个位数据发送完后,返回进行下一个

return result;

然后在void setup()函数中,对单片机进行初始化。在void loop()函数中进行数据的采集,其程序与5.1.2节中的部分程序一样,数据采集之后,然后打开文件,将采集的数据写入SD卡,由于单片机内部有A/D转换功能,因此写入的程序是十进制数据,写完之后关闭文件,每间隔一定时间重复一次loop()中的内容。

部分编译如下:

byte dht11_dat[5];//用于缓存DHT11温湿度数据

byte dht11_in;

byte i;

3.3采集存储测试结果

图7 采集存储测试结果

由于采集的数据存储在SD卡,所以通过计算机打开SD卡,可以看到数据的文件是M.TXT文件,其大小是10.7 KB (11,052字节)。打开M.TXT文件,见下图7,图中H是湿度,某一时刻的湿度值是49.0%;T代表温度,27.0是某一时刻的温度值。

以上所述就是温湿度采集存储系统设计的系统软件研究的整个过程。那么利用这个设计,我们给定设计环境后,可以在图7的温湿度数据提取,利用作图软件可以作出温湿度的变化曲线。

[1] 王刚.温室温湿度控制系统设计[J].中国新技术新产品.2011(09).

[2] 陈吕洲.Arduino程序设计基础[M].北京:北京航空航天大学出版社,2014.1.

Research on the system software of temperature and humidity acquisition and storage system

This paper introduces the testing process of temperature and humidity sensor,the SD card writing process of storage software and the design,program development and test results of the main control software.

temperature and humidity sensor;MCU

猜你喜欢
串口温湿度单片机
浅谈AB PLC串口跟RFID传感器的通讯应用
基于AT89C51的数字型蚕用温湿度计的设计
基于单片机的SPWM控制逆变器的设计与实现
基于DSP的多路温湿度监测系统
基于单片机的层次渐变暖灯的研究
基于单片机的多功能智能插排
基于单片机的便捷式LCF测量仪
基于温湿度控制的天气预测装置
蒸发冷却温湿度独立控制空调系统的应用
数字电源内部数据传输的串口通信方法实现