基于LABVIEW的温湿度采集智能小车.docx
《基于LABVIEW的温湿度采集智能小车.docx》由会员分享,可在线阅读,更多相关《基于LABVIEW的温湿度采集智能小车.docx(57页珍藏版)》请在冰豆网上搜索。
基于LABVIEW的温湿度采集智能小车
摘要
本文设计了一个车载无线温湿度测量系统。
该设计主要以STC89C52RC单片机为核心,NRF24L01和无线模块为通信基础,
LN298驱动模块驱动直流电机,HC-SR04超声波模块和28BYJ-48步进电机结合实现小车自动避障功能,DHT11模块采集环境温湿度,成功实现了智能小车采集不同地点温湿度的功能,并将温湿度数据通过无线模块发给LABVIEW做的上位机界面显示。
关键词:
无线温湿度测量;NRF24L01;DHT11;LABVIEW
ABSTRACT
Thispaperdesignedaremotewirelesshumiditymeasuringsystem.ThisdesignmainlySTC89C52RCmicrocontrollerasthecore,NRF2401wirelessmoduleforcommunicationmodule,LN298drivermodule,HC-SR04ultrasonicmoduleand28BYJ-48steppermotorcombinetoachievethecarautomaticobstacleavoidancefunction.DHT11acquisitionenvironmenthumidity.Thesuccessfulimplementationoftheradiocontrolcarcollectionofdifferentlocationsofmoisture..AndthetemperatureandhumiditydataviawirelessmoduletothePCinterfaceofLABVIEWdoshow.
Keywords:
Wirelesstemperatureandhumiditymeasurement;NRF24L01;DHT11;LABVIEW
前言
随着科技的不断发展,智能化成为现代生活的潮流趋势,是日后发展的方向。
尤其是温湿度传感器技术,在我国各领域应用广泛,与人们的生活环境息息相关。
一般的温湿度采集系统所采集的温度通常通过RS485、CAN总线通信方式传输至上位机,但这种方式较难,不利于工业现场生产;而无线通信GPRS技术传输距离长,通信可靠稳定,但设计复杂、成本昂贵,不利于常规使用;本设计采用工业级内置硬件链路层协议的低成本单芯片NRF2401,利用无线收发器件实现系统间的无线通信,完成无线信号的接收、显示等功能。
本设计基于单片机和NRF2401的无线温湿度采集系统相比较于传统的定点温度采集系统,它的优越性体现在灵活性,即是随着控制智能小车的前进,它能随时检测实时温湿度,它的优越性体现在灵活性,即是随着智能小车的移动,它能随时监测实时温湿度;检测范围广,在智能小车所能到达的地域里,都能检测实时温湿度,优越于传统的温湿度检测系统,只是定点检测一个较小的范围。
且本设计实现温湿度数据在PC机上LABVIEW做的界面显示。
由于时间的限制及其本小组的水平有限,尚有部分其它框图外的功能将在后期进一步增加实现。
本次设计过程中难免出现错误和难以达到完善的程度,恳请各位评委老师给予批评教导。
系统框图
各模块方案
1、最小系统:
使用一款自己熟悉的单片机STC89C52作为核心控制芯片,其各接口使用情况如下图所示:
(1)各接口使用情况:
(a)步进电机接口:
P1.0—P1.3
(b)直流电机接口:
P0.0—P0.5
(c)超声波接口:
P3.0,P3.1
(d)串口下载接口:
P3.0,P3.1
(e)无线模块接口:
P3.2—P3.7
(f)温湿度传感器接口:
P2.2
(g)最小系统接口:
RES,X1,X2,P0
2、电源稳压模块:
电源模块作为电路正常工作的基础,我们的系统需要有5V的稳定电压给单片机和温湿度传感器模块,3.3V的电压给无线模块供电,12V给步进电机供电,让它带动超声波模块移动测距避障。
我们选用LM7805实现5V稳压电路设计,输出5V直流电为单片机和传感器供电。
然后加串联100Ω电阻分压和加一个100uF电解电容滤波,使5V转变成3.3V。
3、直流电机驱动模块
采用专用芯片L298作为电机驱动芯片,使小车移动。
L298芯片内部包含4通道逻辑驱动电路,是一种二相和四相的专用驱动器,内含2个H桥的高电压大电流双全桥驱动器,接收标准TTL逻辑电平信号,符合两轮驱动和单片机控制。
它可驱动46V,2A以下的电机,满足小车马达的驱动要求。
4、步进电机驱动模块
步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。
当
对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。
每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
当通电状态的改变完成一个循环时,转子转过一个齿距。
四相步进电机可以在不同的通电方式下运行。
5、超声波避障模块
超声波检测障碍物的精度高,反映灵敏,受外界干扰小,计算简单、易于控制。
通过单片机控制超声波模块判断障碍物的距离,进而发出指令控制直流电机驱动模块(L298N),控制小车实现转向,达到避障的目的。
本系统设计采用HC-SR04超声波测距模块,该模块可自己产生供40KHZ的方波,并经放大电路驱动超声波发射探头发射超声波,发射出去的超声波经障碍物反射后由超声波接收探头接收。
经接收电路的检波放大,积分整形,在ECHO引脚上产生方波脉冲,该脉冲宽度与被测距距离成线性关系。
TRIG是触发控制信号输入端,接单片机的P3.0引脚,ECHO回响信号输出端接P3.1引脚。
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达到3cm,模块包括超生波发射器,接收器与控制电路。
与单片机接口简单、检测准确。
6、无线通信模块:
使用性价比较高的NRF2401作为无线通信模块的基础,软件编程易懂,硬件电路实现简单。
NRF240的CE,CSN,SCK,MOSI,MISO,IRQ的引脚STC89C52RC的任意端口。
但需在编程时注意NRF2401的工作模式通过配置寄存器可将NRF2401配置为发射、接收、空闲及掉电四种工作模式。
原理图
实物图
7、温湿度传感器模块:
湿度传感器种类很多主要是由湿敏器件构成,又分为电阻式和电容式,基于各方面考虑我们小组选用了DHT11数字温湿度传感器。
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。
它应用于专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与长期稳定性。
DHT11与单片机之间能采用简单的单总线进行通信,仅需要一个I/O口,电路简单数据稳定。
DHT11原理图温湿度传感器程序框图
温湿度传感器实物图
LABVIEW上位机
LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:
其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。
LabVIEW软件是NI设计平台的核心,也是开发测量或控制系统的理想选择。
LabVIEW开发环境集成了工程师和科学家快速构建各种应用所需的所有工具,旨在帮助工程师和科学家解决问题、提高生产力和不断创新。
本Labview基本界面组成有串口连接PC机和NRF2401无线传输模块,主要是给小车发送相关的移动控制数据以及接受小车采集到的温湿度数据。
一.串口协议:
(1)PC机每2秒会自动发送0X07数据,作为温湿度数据的接收请求;
(2)51单片机发送的一震数据格式为NRF24L01数据包格式,格式遵循SPI指令格式为:
(命令字:
有高位到低位(每字节))
(数据字节:
低字节到高字节,每一字节高位在前)
(3)0x01:
小车前进
(4)0x02:
小车后退
(5)0x03:
小车左转
(6)0x04:
小车右转
(7)0x05:
小车停止
(8)0x06:
小车进入自动避障
(9)0x07:
小车发送温湿度数据回PC机
二.设计思路:
根据制定的协议要求:
PC机向小车发送的数据和小车返回给PC的数据严格遵守SPI协议数据格式,每个动作都对应一个数据标识符(如小车前进的标识符为0x01),PC机通过发送这些标识符让小车识别这些信息,从而执行相应的动作。
三.界面程序图:
四.前面板模型:
主要由三部分组成,分别是如下图:
五、实际温湿度测量与记录:
六、数据处理:
对温湿度传感器发回的数据进行处理,每次数据请求会连续接收到两个字节的数据,第一个字节为湿度数据(十六进制),第二个数据为温度数据(十六进制)。
此时将接受的数据分别送往湿度数组控件和温度数组控件中,控件会自动对十六进制的数据进行转化,最终输出为界面显示的十进制数据(注:
实际采集时的室内温度是29度,而界面中采集的温度变化原因是在实际采集过程中用了打火机对温湿度传感器进行加热导致温度呈上升变化,随后去除打火机的加热,温度会逐渐下降到当前室温)。
设计总结
本文基于STC89C52单片机,结合DHT11温湿度传感器设计了一种无线智能小车测量温湿度,易于操作,可靠性高。
团队分为两组进行,分别进行上位机和小车下位机的设计任务。
经过一个月的设计制作,在这过程中,遇到了各种困难,比如软件程序小车自动避障过程中对障碍位置判断避开的程序调试,还有上位机温湿度数据的采集以及无线模块收发数据的程序都出现了不少问题(如在调试无线模块时第一次发送一帧数据后,模块自动触发了发送上限中断,即发送了第一个指令后将无法继续发送控制指令,这显然严重背离我们的设计初衷。
经过几天的逐条程序分析监控,并没有发现任何问题,最后怀疑是上位单片机开发板的硬件问题,果然如此,我们更换了一块好的开发板后便不再出现这种问题,这让我们更加认识到电子设计中应考虑到各个细节,任何一个细节哪怕是小的细节忽略了都会对团队的设计产生不利的影响,也感谢队友们的耐心调试);而在上下位机分别设计完成后,在程序合并的过程中出现了不少问题(如开启避障功能后将无法使用Labview控制和收集温湿度数据的现象;上位机请求温湿度数据有时会突然停止接收数据等错误现象),但通过仔细分析,利用串口助手,KEIL等工具和逐个模块检测,在逐条程序对相关变量追踪的思想指领下一步步修改代码,最终成功解决了上述出现的诸多问题。
在这个过程中我们深刻地体会到共同协作和团队精神的力量,明白了一个团队要彼此信任,有想法敢说敢提的重要,也在此过程中提高了我们发现问题和解决问题的能力。
团队三人为同一目标坚持熬夜进行制版,调试,构写论文等工作,也是我们大学里一个难忘的经历。
电子实验技能大赛的组织为我们大学生提供了良好的科学研究和科技制作的机会,使我们收益非浅,收获很大。
衷心地感谢大赛评委给予我们这么一次机会。
今后我们会更加努力丰富自己,发挥潜能,培养团队精神,学会做人、做事、做学问。
附录一
(a)PCB原理图:
(b)PCB图:
实物图
附录二
上位机单片机程序:
#include
/************************NRF24l01模块端口定义************************************************************/
sbitCE=P2^7;
sbitSCK=P2^5;
sbitMISO=P2^3;
sbitMOSI=P2^4;
sbitCSN=P2^6;
sbitIRQ=P2^2;
bitREC_flag=0;
/*****************************类型定义************************************************************/
typedefunsignedintuint;
typedefunsignedcharuchar;
/*****************************宏定义************************************************************/
#defineSET_RX_PW_P00X01//数据通道0有效数据宽度,设为1个字节
#defineCONFIG0X00
#defineEN_AA0X01
#defineEN_RXADDR0X02
#defineSETUP_AW0X03
#defineSETUP_RETR0X04
#defineRF_CH0X05
#defineRF_SETUP0X06
#defineSTATUS0X07
#defineOBSERVE_TX0X08
#defineCD0X09
#defineRX_ADDR_P00X0A
#defineTX_ADDR0X10
#defineRX_PW_P00X11
/***************************
**指令宏定义************************************************************/
#defineREAD_REG0X00
#defineWRITE_REG0X20
#defineRD_RX_PLOAD0X61
#defineWR_TX_PLOAD0XA0
ucharVAL,num;
ucharorder;
uchartable[2];
ucharflag=0;
/*--------------------毫秒延时函数---------------------------------------*/
voiddelay2ms(uintM)
{
uinti,j,k;
for(k=0;k{for(i=0;i<9;i++)
{for(j=0;j<32;j++);
}
}
}
/***************************写/读一个字节函数********************************************/
voidRW_ONEBYTE(ucharVALUE)//用SPI工作方式0,即每次用完SPI时都要在最后把CLK置低;无线模块MOSI(数据输入)和MISO端口(输出),是把无线模块看做主机的时序
{uchari;
for(i=0;i<8;i++)
{MOSI=(0X80&VALUE);//先把要发送的位放到MOSI端,再让SCK变1;提供上升沿,使放在MOSI上的位发送出去
SCK=1;
VALUE<<=1;
VALUE|=MISO;
SCK=0;
}
VAL=VALUE;//先让要接收的位放在MISO端再去取
}
/*********************************配置寄存器函数*********************************************************/
voidCONFIG_REG(ucharREG_AD,ucharvalue)
{
RW_ONEBYTE(WRITE_REG+REG_AD);
RW_ONEBYTE(value);
}
/**********************************读寄存器*******************************************************************/
voidRD_REG(ucharREG_AD)
{
RW_ONEBYTE(READ_REG+REG_AD);
RW_ONEBYTE(0);
}
/**********************************读RX有效数据**************************************************************/
voidREAD_RX_PLD()
{
RW_ONEBYTE(RD_RX_PLOAD);//发送读有效数据指令
RW_ONEBYTE(0);
}
/***********************************写TX有效数据*********************************************************************/
voidWRITE_TX_PLD(ucharC)//用的时候把order给C
{
RW_ONEBYTE(WR_TX_PLOAD);
RW_ONEBYTE(C);
}
/*----------------------------------串行异步通信初始化函数与------------------------------*/
voiduart_unit()
{//TMOD=0X01;//开启定时器0
//EA=1;
//TH0=0;
//TL0=0;
ET0=1;
TR0=1;//TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD|=0x21;//启动timer1,mode2,8bit自动重装,开启定时器0
PCON=0x00;//波特率正常,即SMOD=0
SCON=0x50;//串口模式1,8bitUART,REN=1,SM0=0;SM1=1
TH1=0xfd;//自动重装,波特率为2400,晶振12MHZTH1=0XF3
TL1=0xfd;
TR1=1;//打开总中断
ES=1;//打开timer1
EA=1;//打开串行中断
}
/*******************************接收模式***************************************************/
voidRX()
{P0=0X55;
SCK=0;
IRQ=1;
CE=0;
CSN=1;
CSN=0;
CONFIG_REG(0X11,0X01);//设置p0接收通道有效数据宽度,设为1字节
CSN=1;
CSN=0;
CONFIG_REG(0x00,0x0f);//使无线模块处于接收模式
CE=1;
while(IRQ);
CE=0;
CSN=1;
CSN=0;
RD_REG(0X07);//读状态寄存器
CSN=1;
CSN=0;
CONFIG_REG(0X07,VAL);//清除中断
CSN=1;
CSN=0;
READ_RX_PLD();//读接收缓冲器
P0=VAL;//接收到的数据,用led灯指示收到的数据值
SBUF=VAL;//将数据放回电脑
while(!
TI);
TI=0;
CSN=1;
CSN=0;
RW_ONEBYTE(0XE2);//清空接收缓冲器
}
/********************************发射模式1:
不发送请求数据**********************************/
voidTX()
{ucharflag;
uart_unit();//初始化串口通信与中断
IRQ=1;
P0=0X0f;//发射初始化
while
(1)
{
flag=0;
IRQ=1;
SCK=0;
CE=0;
CSN=1;
CSN=0;
CONFIG_REG(0X04,0X0F);
while(!
RI);
RI=0;
order=SBUF;//发射的数据
if(order==0x07)
{flag=1;}
CSN=1;
CSN=0;
WRITE_TX_PLD(order);
CSN=1;
CSN=0;
CONFIG_REG(0x00,0x0e);//使无线模块处于发射模式
CE=1;
while(IRQ);
CE=0;
CSN=1;
CSN=0;
RW_ONEBYTE(0XE1);//清空TX缓冲器
CSN=1;
CSN=0;
RD_REG(0x07);//读状态寄存器
if(VAL&0X10)//发射失败
{P0=0X00;
}
if(VAL&0X20)
{
P0=0XFE;//发射成功
}
CSN=1;
CSN=0;
CONFIG_REG(0X07,VAL);
if(flag==1)
{flag=0;
RX();
}
}
}
/********************************发射模式2:
发送温湿度请求指令0x07**********************************/
voidTX1()
{ucharflag;
//uart_unit();//初始化串口通信与中断
IRQ=1;
P0=0X0f;//发射初始化
//order=0x10;
flag=0;
IRQ=1;
SCK=0;
CE=0;
CSN=1;
CSN=0;
CONFIG_REG(0X04,0X0F);
//while(!
RI);
//RI=0;
order=0x07;//发射0x07指示读取温湿度
CSN=1;
CSN=0;
WRITE_TX_PLD(order);
CSN=1;
CSN=0;
CONFIG_REG(0x00,0x0e);//使无线模块处于发射模式
CE=1;
while(IRQ);
CE=0;
CSN=1;
CSN=0;
RW_ONEBYTE(0XE1);//清空TX缓冲器
CSN=1;
CSN=0;
RD_REG(0x07);//读状态寄存器
if(VAL&0X10)//发射失败
{P0=0X00;
}
if(VAL&0X20)
{
P0=0XFE;//发射成功
}
CSN=1;
CSN=0;
CONFIG_REG(0X07,VAL);
}
/**********************************主函数*******************************/
voidmain()
{
while
(1)
{
TX();
}
}
/**********************************************************************************************************/
小车中单片机程序:
#include
#include
#include
/****