温湿度检测系统.docx
- 文档编号:26270338
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:24
- 大小:3.61MB
温湿度检测系统.docx
《温湿度检测系统.docx》由会员分享,可在线阅读,更多相关《温湿度检测系统.docx(24页珍藏版)》请在冰豆网上搜索。
温湿度检测系统
郑州轻工业大学
实训报告
实训名称:
嵌入式软件工程实践
姓名:
院(系):
专业班级:
学号:
指导教师:
实习时间:
一、实训目的
(一)实习目的
本实训课程是针对嵌入式软件专业学生专门设计的,通过本课程设置的几个嵌入式综合项目的系统学习,可以使学生由浅入深的对嵌入式Linux系统进行全面学习,能够独立胜任嵌入式Linux应用开发、系统开发、驱动开发等多方面工作,并注重敬业团队精神培养。
1)增强学生的理论联系实际的能力
2)通过实训了解企业项目开发流程和学习新技术的方法
3)通过实训项目了解企业项目开发过程中文档的整理方法和问题的分析方法
4)通过实训项目加强学生对基础课程的运用能力,使其认识到基础知识的重要性
5)通过实训争强学生对本专业和未来工作岗位的理解,端正心态,明确就业目标
6)通过实训争强学生的编程技能,培养其良好的编码风格和编码习惯
(二)方法
本实训课程安排在学校实验室统一进行实训,学生上机独立完成规定实训项目。
(三)任务
要求每位同学独立完成实训题目的编程、调试、优化与测试,并交付使用。
要求强化编程思维、编程能力和代码优化的能力,撰写《实训报告》(含:
需求分析、总体设计、算法分析及设计中遇到的主要问题和解决方法,设计中尚存的不足与心得体会)。
上交完成的所有源程序及相关文件。
二、实训安排
时间
实训内容
第一周
实现DHT11数字温湿度传感器获取温湿度,并且把DHT11数字温湿度传感器获取温湿度传输到stm32开发板上。
第二周
实现LinuxUbuntu的环境搭建,模块编程A9开发板,移植NRF24L01无线通信模块
第三周
实现创建阿里云产品和设备,并A9开发板链接阿里云
第四周
实现Android获取阿里云端数据
三、实训报告
3.1项目名称
项目名称:
嵌入式远程监测
3.1.1实训内容
1、嵌入式远程监测与语音控制系统包括智能网关(A9内核,LinuxUbuntu操作系统)1个,无线通信节点1个,包含常用的物联网传感器DHT11,STM32开发板,A9开发板。
2、系统每个节点都采用ARMCortex-M3架构的MCU,可以外接多种传感器以及控制设备。
3、同时把传感器的数据以及控制设备的状态在2.8寸LCD屏上进行显示。
4、节点通过NRF24L01无线通信模块,把节点的数据传输到网关。
5、网关再把数据传输到云服务器。
3.1.2实训过程及相关结果
一、采用STM32F103ZE为硬件开发平台,裸板开发驱动程序:
1)关于STM32开发板的介绍
核心处理器:
STM32F103ZET6、主频:
72MHZ、引脚:
144、GPIO口的管脚个数112
2)GPIO口
GPIO口是可配置的输入输出口
GPIO口的8种工作模式
输入:
上拉输入
下拉输入
浮空输入
模拟输入
输出:
推挽输出
开漏输出
复用推挽输出
复用开漏输出
3)系统滴答定时器
框架:
配置系统滴答定时器所需配置的寄存器
3)点亮一盏LED灯,实现流水灯程序;
4)使用PWM驱动蜂鸣器程序实现。
二、基于stm32节点板采集温湿度数据
1、DHT11数字温湿度传感器获取温湿度
2、把DHT11数字温湿度传感器获取温湿度传输到stm32节点板上
DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
1.通讯过程如下图所示
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。
DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
图二
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
数字0信号表示方法如下图所示
数字1信号表示方法.如下图所示
把DHT11数字温湿度传感器获取温湿度传输到stm32节点板上代码实现
#include"main.h"
#defineDHT_DATA(x)x?
(GPIOG->ODR|=(0x01<<15)):
(GPIOG->ODR&=~(0x01<<15))
#defineDHT_DATA_STATA(!
!
(GPIOG->IDR&(0x01<<15)))
unsignedchardht_data[5]={0};
unsignedchartemp_value=20;
voidDHT_OUT_MODE(void)
{
GPIOG->CRH&=~(0xFUL<<4*7);//清零
GPIOG->CRH|=(0x03<<28);//推挽输出
}
voidDHT_IN_MODE(void)
{
GPIOG->CRH&=~(0xFul<<4*7);//清零
GPIOG->CRH|=(0x01<<30);//浮空输入
}
#defineTIME_OUT_MAX0xffff
charconfig_dht11(void)
{
chari=0,j=0;
uint32_ttimeout=TIME_OUT_MAX;
RCC->APB2ENR|=(0x01<<8);//开G端口的时钟
DHT_OUT_MODE();//推挽输出
DHT_DATA
(1);//拉高
DHT_DATA(0);//拉低
Delay_ms(20);//延时20ms
DHT_DATA
(1);//拉高
Delay_us(30);//延时30us
DHT_IN_MODE();//浮空输入
while(DHT_DATA_STATA)
{
timeout--;
if(!
timeout)return1;
Delay_us
(1);
}//等待拉低
timeout=TIME_OUT_MAX;
while(!
DHT_DATA_STATA)
{
timeout--;
if(!
timeout)return1;
Delay_us
(1);
}//等待拉高
for(i=0;i<5;i++)
{
for(j=0;j<8;j++)
{
timeout=TIME_OUT_MAX;
while(DHT_DATA_STATA)//等待拉低
{
timeout--;
if(!
timeout)return1;
Delay_us
(1);
}
timeout=TIME_OUT_MAX;
while(!
DHT_DATA_STATA)//等待拉高
{
timeout--;
if(!
timeout)return1;
Delay_us
(1);
}
Delay_us(40);
if(DHT_DATA_STATA)
{
//代表数据1
dht_data[i]<<=1;
dht_data[i]+=1;
}else
{
//代表数据0
dht_data[i]<<=1;
}
}
}
if(dht_data[4]==(dht_data[0]+dht_data[1]+dht_data[2]+dht_data[3]))
{
printf("数据正确\r\n");
printf("温度=%d\r\n",dht_data[2]);
printf("湿度=%d\r\n",dht_data[0]);
}else
{
printf("数据错误\r\n");
}
return0;
}
三、把传感器的数据以及控制设备的状态在2.8寸LCD屏上进行显示
通过汉字取模和图片取模软件,把所需要使用汉字和图片转换代码可以调用,并把DHT11数字温湿度传感器获取温湿度数据传输到LCD屏上。
DHT11数字温湿度传感器驱动程序:
if(dht11_runtime[0]>dht11_runtime[1])
{
dht11_runtime[0]=0;
if(config_dht11())
Draw_Text_8_16_Str(100,150,RED,BLUE,(unsignedchar*)"DHT11ReadDataError");
else
{
sprintf(nrf_tx_data_buf,"Tem=%2d,Hum=%2d",dht_data[2],dht_data[0]);
nrf_tx_data_buf[15]='\0';
Draw_Text_8_16_Str(100,150,RED,BLUE,(unsignedchar*)nrf_tx_data_buf);
NRF24L01_TxPacket((u8*)nrf_tx_data_buf);
}
}
四、通过NRF24L01无线通信模块将数据传输到A9开发板上。
1、环境搭建
(1)安装交叉编译器
(2)uboot烧写启动
(3)内核的制作、编译,烧写
(4)文件系统的搭建及securtCRT软件的应用
(5)学习linux系统的基本操作,vim编辑器使用,shell命令使用,熟练使用VI编辑命令和linux常用操作命令。
(6)学习linux系统下驱动开发的基础知识,挂载卸载驱动模块,掌握字符设备驱动程序设计方法。
2、NRF24L01无线通信模块是使用SPI总线协议,。
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
上升沿发送、下降沿接收、高位先发送。
上升沿到来的时候,sdo上的电平将被发送到从设备的寄存器中。
下降沿到来的时候,sdi上的电平将被接收到主设备的寄存器中。
启动SPI总线协议程序:
voidSPI2_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//PORTB时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);//SPI2时钟使能
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//PB13/14/15复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB
GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);//PB13/14/15上拉
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式:
SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//设置SPI工作模式:
设置为主SPI
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//设置SPI的数据大小:
SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;//串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:
内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;//定义波特率预分频的值:
波特率预分频值为256
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;//指定数据传输从MSB位还是LSB位开始:
数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial=7;//CRC值计算的多项式
SPI_Init(SPI2,&SPI_InitStructure);//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI2,ENABLE);//使能SPI外设
SPI2_ReadWriteByte(0xff);//启动传输
}
3、移植NRF24L01无线通信模块驱动
4、使用securtCRT软件的查询的数据
五、把A9开发板上的数据传输到云服务器
1、在阿里云创建产品和设备及c-sdk的使用
1)创建产品:
2)创建设备:
2、建立设备与平台的连接
1)登录Linux虚拟机。
2)获取LinkKitSDK。
3)使用unzip命令解压压缩包。
hqf@hqf-vm:
~/Linux$cdc-sdk-v3.0.1/
hqf@hqf-vm:
~/Linux/c-sdk-v3.0.1$ls
certsexternal_libsLICENSEmodel.jsonsr
config.batextract.batmakefileoutputtools
coreextract.shmake.settingsREADME.mdwrappers
4)设备身份信息将通过HAL调用返回给SDK。
因此,需要将wrappers/os/ubuntu/HAL_OS_linux.c中的设备证书信息修改为创建产品与设备步骤中创建的设备证书,完成后保存退出。
Ubuntu系统上传的数据格式
此时阿里云显示设备处于在线状态
最后修改Makefile使用交叉编译工具链编译程序挂载到开发板运行即可,前提开发板需要能链接网络
建立规则引擎
3、通过mqtt协议把A9开发板上的数据传输到云服务器
4、数据上传到阿里云端并在云端物理模型显示数据
六、并使用AndroidAPP获取云端数据
1、JAVA环境搭建
安装JDK并添加JDK环境变量
命令行测试JAVA环境是否搭建成功
2、创建Android工程框架APP
Android开发环境搭建
下载android-studio-ide-191.5791312-windows安装包
安装转后新建工程
新建一个界面
运行画面
3、创建活动,使得APP获取云端数据,如下图所示
3.4实训心得
这次实训是基于stm32节点板采集温湿度数据,把传感器的数据以及控制设备的状态在2.8寸LCD屏上进行显示,并通过NRF24L01无线通信模块将数据传输到A9开发板上,然后把A9开发板上的数据传输到云服务器,并使用AndroidAPP获取云端数据。
通过这次实训,我学习了keil5环境搭建、GPIO口的配置、点亮LED灯;系统滴答定时器、非阻塞思想、独立按键非阻塞,熟悉LCD屏幕,掌握温湿度传感器DHT11和2.4G通信模块NRF24L01的基本操作。
其次,我复习linux系统的基本认知和linux的基本操作,然后熟悉linux系统的环境搭建:
安装交叉编译器;uboot烧写启动;内核的制作、编译,烧写;文件系统的搭建及securtCRT软件的应用。
还学习了Java和Android环境搭建,Java语言的简单介绍及数据类型和运算符;关于Java类和对象;关于Android的工程框架及Android组成,属性及布局,还有控件及布局等。
通过本次实训包括的几个嵌入式综合项目的系统学习,可以使我们由浅入深的对嵌入式Linux系统进行全面学习,能够独立胜任嵌入式Linux应用开发、系统开发、驱动开发等多方面工作,并且还注重敬业团队精神培养。
在实训的过程中我也到了很多的问题,都是请教同学和老师才解决的。
有时候因为一个空格、一个符号都会造成代码的无法运行,看见别人都运行出来了,就会自己着急更找不到错误了。
所以,在写代码和查错的时候一定要认真仔细,才能更少出错。
3.5问题及建议
本次实训中,通过实训老师的辛苦讲解和老师的帮助下,完成了这次实训,在实训的过程中,出现了诸多的错误,有时是不认真造成的,还有时是系统出现了问题解决不了,寻求老师和同学们的帮助。
实训成绩评定
评定项目
内容
满分
评分
总分
实训过程
实习认真,态度端正,遵守纪律。
能按照实习要求完成各种任务,代码书写规范,注释清晰,设计严谨,运行结果正确。
60
报告撰写
报告字迹整洁、内容丰富、条理清楚;图、表、文字表达准确规范,上交及时。
40
总成绩
采用五级分制:
优、良、中、及格、不及格。
评语:
指导老师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温湿度 检测 系统