笔记目录

  • 一、题目要求
  • 二、系统总体设计
    • 1、用到的器件和软件
    • 2、整体思路
  • 三、效果图
  • 四、嵌入式硬件部分
    • 1.原理图
  • 五、嵌入式软件部分
    • 1.主函数
    • 2.DHT11初始化程序
    • 3.DHT11测量程序
    • 4.SGP30模块初始化
  • 六、MATLAB GUI部分
    • 1、界面设计
    • 2、程序
      • ①.串口接收及显示
      • ②.串口接收
      • ③.串口设置
  • 七、源代码及原理图压缩包
  • BUG解决记录
    • 1.串口DMA用不了
    • 2.DHT11读取数值错误,且一直为一个固定数

一、题目要求

  温度,湿度,CO2作为农业生产中中非常重要的参数,需要准确的采样。该系统完成对于上述参数的精确采样,通过LCD显示在面板上,并将测量值发送到上位机进行显示。

(1)测量对应的温度、湿度、CO2的值。
(2)用OLED显示实际的温度值和湿度值
(3)实现对温度,湿度,CO2的实时采集。
(4)如果温湿度低于或者高于设定值,采取对应措施升降温和升降湿度值。
(5)在上位机上设计监测界面,实时显示各个测量值。

源码
链接:https://pan.baidu.com/s/1PWT5x9oD2lo6c3Wlz6RVfg
提取码:6666

二、系统总体设计

1、用到的器件和软件

控制器:stm32f407vet6核心板
显示屏:0.96寸OLED (SPI接口)
温湿度传感器:DHT11
CO2浓度传感器:SGP30 (I2C接口)

stm32编程软件:CUBEMX,keil5
上位机软件设计工具:MATLAB APP Designer

2、整体思路

  通过DHT11采集温湿度和SGP30采集二氧化碳并通过OLED实时显示,1s刷新一次,通过串口将采集到的数据上传到用MATLAB做的界面中。

三、效果图


四、嵌入式硬件部分

1.原理图


五、嵌入式软件部分

1.主函数

//包含显示、初始化、和传感器读数程序
int main(void)
{uint32_t CO2Data,TVOCData;//定义CO2浓度变量与TVOC浓度变量uint16_t temperature;uint16_t humidity;
unsigned long sgp30_dat;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();MX_TIM6_Init();MX_SPI2_Init();
HAL_UART_Receive_DMA(&huart1,aRxBuffer,1);  //串口DMA初始化
OLED_Init();    //OLED初始化
Show_Str(0, 2,"Initializing...", 16, 0);  //显示初始化中...//DHT11初始化while(DHT11_Init()){HAL_Delay(500);}//初始化SGP30SGP30_Init();
HAL_Delay(100);
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
CO2Data = (sgp30_dat & 0xffff0000) >> 16;
TVOCData = sgp30_dat & 0x0000ffff;
//SGP30模块开机需要一定时间初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变,因此上电后每隔500ms读取一次
//SGP30模块的值,如果CO2浓度为400ppm,TVOC为0ppd,则屏幕闪烁显示“正在检测中...”,直到SGP30模块初始化完成。
while(CO2Data == 400 && TVOCData == 0)
{SGP30_Write(0x20,0x08);sgp30_dat = SGP30_Read();//读取SGP30的值CO2Data = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值TVOCData = sgp30_dat & 0x0000ffff;           //取出TVOC值HAL_Delay(500);
}
OLED_Clear();    //清屏while (1){DHT11_Read_Data(&temperature,&humidity);   //读取温度湿度值SGP30_Write(0x20,0x08);sgp30_dat = SGP30_Read();//读取SGP30的值CO2Data = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值printf("%02d%1d",temperature>>8,temperature&0xff);printf("%02d%1d",humidity>>8,humidity&0xff);printf("%03d",CO2Data);HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);//OLED显示
//温度显示Show_Str(4, 1,"temp:", 16, 0);OLED_ShowNum(40,1,temperature>>8,3,16);Show_Str(64, 1,".", 16, 0);OLED_ShowNum(72,1,temperature&0xff,1,16);Show_Str(84,1,"℃", 16, 0);//湿度显示Show_Str(4, 3,"humi:", 16, 0);OLED_ShowNum(40,3,humidity>>8,3,16);
Show_Str(64, 3,".", 16, 0);OLED_ShowNum(72,3,humidity&0xff,1,16);Show_Str(84, 3,"%RH", 16, 0);//CO2浓度显示 Show_Str(4, 5,"CO2:", 16, 0);OLED_ShowNum(40,5,CO2Data,3,16);Show_Str(70, 5,"PPM", 16, 0);HAL_Delay(1000);      //延时1s}
}

2.DHT11初始化程序

//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
uint8_t DHT11_Init(void)
{ DHT11_Rst();return DHT11_Check();
}//复位DHT11
void DHT11_Rst(void)
{                 DHT11_IO_OUT();   //设置为输出DHT11_DQ_OUT_LOW;    //拉低DQHAL_Delay(20);        //拉低至少18msDHT11_DQ_OUT_HIGH;    //DQ=1 delay_us(30);       //主机拉高20~40us
}//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void)
{   uint8_t retry=0;DHT11_IO_IN();      //设置为输出     while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us{retry++;delay_us(1);};     if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us{retry++;delay_us(1);};if(retry>=100)return 1;      return 0;
}

3.DHT11测量程序

//从DHT11读取一次数据
//返回值:0,正常;1,读取失败
uint8_t DHT11_Read_Data(uint16_t *temp,uint16_t *humi)
{        uint8_t buf[5];uint8_t i;DHT11_Rst();if(DHT11_Check()==0){for(i=0;i<5;i++)//读取40位数据{buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){*humi=(buf[0]<<8) + buf[1];*temp=(buf[2]<<8) + buf[3];}}else return 1;return 0;
}

4.SGP30模块初始化

//初始化IIC接口
void SGP30_Init(void)
{SGP30_Write(0x20, 0x03);
}5.SGP30模块测量CO2
uint32_t SGP30_Read(void)
{uint32_t dat;uint8_t crc;SGP30_IIC_Start();SGP30_IIC_Send_Byte(SGP30_read); //发送器件地址+读指令SGP30_IIC_Wait_Ack();dat = SGP30_IIC_Read_Byte(1);dat <<= 8;dat += SGP30_IIC_Read_Byte(1);crc = SGP30_IIC_Read_Byte(1); //crc数据,舍去crc = crc;  //为了不让出现编译警告dat <<= 8;dat += SGP30_IIC_Read_Byte(1);dat <<= 8;dat += SGP30_IIC_Read_Byte(0);SGP30_IIC_Stop();return(dat);
}

六、MATLAB GUI部分

1、界面设计

App 设计工具并不要求软件开发专业背景。您只需拖放可视化组件即可实现图形用户界面 (GUI) 设计布局,还可以使用集成的编辑器快速为其行为编程。
App 设计工具集成了 App 构建的两大任务:图形用户界面 (GUI) 可视化组件布局,以及 App 行为编程。要在 MATLAB 中构建 App,App 设计工具是十分理想的环境。

在matlab命令行中输入appdesigner
>> appdesigner

将可视化组件拖放到设计画布,然后根据对齐提示实现精确布局。App 设计工具自动生成面向对象的代码,用于指定 App 的布局和设计。

其会自动生成代码。使用集成的 MATLAB 编辑器来定义 App 的行为。App 设计工具可以使用代码分析器自动检查代码问题。您可以在编写代码时查看关于代码的警告和错误消息,并根据这些消息修改您的 App。您还可以使用 Stateflow® 图对 App 行为建模。
生成自己的APP,双击.exe文件即可运行。


2、程序

①.串口接收及显示

  properties (Access = public)COM;    % 端口号s  ;    %端口设置句柄RX_num; %接收统计TX_num; %发送统计RX_once;%一次接收的数据RX_Date;%接收的所以数据is_open;%是否打开串口标志位endmethods (Access = public)function  EveBytesAvailableFcn(app, src, event)global i;n = src.BytesAvailable;%获取接收到的字符个数if n>0%n>0才继续执行,因为0为0也会触发中断app.RX_num=app.RX_num+n;%app.Label_RX.Text=num2str(app.RX_num);%将数字转化为字符串输出app.RX_once=fread(src,n,'uchar');%读取函数,读取后矩阵为一列app.RX_Date =strcat(app.RX_Date, app.RX_once');%字符串拼接,需要转置化为一行%app.ReceiveView.Value= app.RX_Date;%textarea的设置格式为cell,或单行字符串%温度显示temp=floor(str2double(app.RX_Date)/1000000)*0.1;app.Temp.Value=temp;app.Gauge_Temp.Value=temp;%温度最低最高值判断if temp>=str2double(app.TextArea_Temp.Value)app.Lamp_Temp.Color="1.00,0.00,0.00";elseapp.Lamp_Temp.Color="0.00,1.00,0.00";endif temp<=str2double(app.TextArea_Temp_2.Value)app.Lamp_Temp_2.Color="1.00,0.00,0.00";elseapp.Lamp_Temp_2.Color="0.00,1.00,0.00";end%湿度显示humi=mod((floor(str2double(app.RX_Date)/1000)),1000)*0.1;app.Humi.Value=humi;app.Gauge_Humi.Value=humi;%波形显示plot(app.UIAxes,i,temp,'r.');plot(app.UIAxes_2,i,humi,'b.');if i==20i=0;cla(app.UIAxes);cla(app.UIAxes_2);elsehold(app.UIAxes,'on');   % 这样就可以hold住了hold(app.UIAxes_2,'on');   % 这样就可以hold住了i=i+1;End%湿度最低最高值判断if humi>=str2double(app.TextArea_Humi.Value)app.Lamp_Humi.Color="1.00,0.00,0.00";elseapp.Lamp_Humi.Color="0.00,1.00,0.00";endif humi<=str2double(app.TextArea_Humi_2.Value)app.Lamp_Humi_2.Color="1.00,0.00,0.00";elseapp.Lamp_Humi_2.Color="0.00,1.00,0.00";end%CO2显示co2=mod(str2double(app.RX_Date),1000);app.CO2.Value=co2;app.Gauge_CO2.Value=co2;if co2>=str2double(app.TextArea_CO2.Value)app.Lamp_CO2.Color="1.00,0.00,0.00";elseapp.Lamp_CO2.Color="0.00,1.00,0.00";endapp.RX_Date ='';%app.ReceiveView.Value= app.RX_Date;%app.TX_num=0;%app.RX_num=0;%app.Label_TX.Text=num2str(app.TX_num);%app.Label_RX.Text=num2str(app.RX_num);endendend

②.串口接收

function Button_SendPushed(app, event)
%val=app.transmitView.Value;
val=strcat(strcat(app.TextArea_Temp.Value,app.TextArea_Humi.Value),app.TextArea_CO2.Value);
%val=num2str(app.EditField_Temp.Value);
if ~isempty(val{1})%textarea控件是cell格式,获取需要用{1}
app.TX_num=app.TX_num+length(val{1});
%app.Label_TX.Text=num2str(app.TX_num);
fwrite(app.s, char(val), 'uint8', 'async');%需要将val转化为char
End

③.串口设置

 function pbOpenSerialValueChanged2(app, event)app.COM=get(app.ppCOM,'Value');if strcmp(get(app.pbOpenSerial,'Text'),'打开串口')tryapp.s=serial(app.COM);app.s.BaudRate=str2num(app.Baud.Value);%设置波特率                  app.s.DataBits=8;%设置数据长度app.s.StopBits=1;%设置停止位长度app.s.InputBufferSize=1024000;%设置输入缓冲区大小为1Mapp.s.BytesAvailableFcnMode='byte';  %串口事件回调设置app.s.BytesAvailableFcnCount=1; %输入缓冲区存在10个字节触发回调函数app.s.BytesAvailableFcn={@app.EveBytesAvailableFcn};%回调函数的指定fopen(app.s);%打开串口app.is_open=1;app.pbOpenSerial.Text='关闭串口';app.Lamp.Color=[0 1 0];catch errmsgbox('打开失败');endelsetryfclose(app.s);app.pbOpenSerial.Text='打开串口';app.Lamp.Color=[0.15 0.15 0.15];catch errmsgbox('关闭失败');enddelete(app.s);app.is_open=0;endend

七、源代码及原理图压缩包

https://download.csdn.net/download/qq_44181970/74730641

BUG解决记录

1.串口DMA用不了

解决方法: 先初始化DMA,再初始化串口

2.DHT11读取数值错误,且一直为一个固定数

us延时配置问题,应将168-1更改为84-1。

基于MATLAB GUI的环境温湿度检测界面设计相关推荐

  1. matlab gui电机,基于MATLAB GUI的感应电机性能分析界面设计.docx

    摘要:本设计通过键入GUIDE命令打开GUI编辑界面,GUI(Graphical User Interfaces)意指图形用户界面,相较于命令行界面更容易在视觉上被接受. 用户可通过一定方法,如键盘鼠 ...

  2. 项目五 基于stc89c52系列单片机环境温湿度检测控制

    前言:作者想要帮助一些童鞋和爱好者进行项目构建,但自知能力有限,不喜可论,创作不易,勿喷. 系统采用stc89c51芯片进行的单片机环境温湿度检测控制,能够实现温湿度检测与调节设定.上代码. 项目包含 ...

  3. 基于MATLAB GUI的匀速目标回波模拟器设计

    1. 课题的意义 雷达目标模拟器通过软.硬件结合的方法模拟代替真实目标,从而"复现"雷达信号的产生.传递.处理等动态过程,达到模拟目标回波信号的目的.雷达目标模拟器模拟的对象是雷达 ...

  4. 【语音识别】基于matlab GUI MFCC+VAD端点检测智能语音门禁系统【含Matlab源码 451期】

    ⛄一.MFCC简介 1 引言 语音识别是一种模式识别, 就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术.语音识别技术主要包括特征提取技术.模式匹配准则及模型训练技术3个方面.目前一 ...

  5. 物联网毕业设计 单片机室内环境温湿度检测设计与实现

    文章目录 0 简介 1 项目介绍 2 硬件说明 2.1 AB32VG1单片机 2.2 DHT22数字温湿度传感器 3 代码实现 4 实现效果 0 简介 Hi,大家好,学长今天向大家介绍一个 单片机项目 ...

  6. 【CV/Matlab系列】基于matlab GUI的视频监控界面

    DATE: 2020.10.18 updated at 2022.04.23: 界面上增加报警提示功能 文章目录 1.前言 2.视频监控界面 2.1.初始化界面 2.2.人脸检测和计数功能 2.3.监 ...

  7. 基于MATLAB GUI的裂缝检测(识别)系统(支持向量机)

    主要内容 本文对裂缝检测技术进行了深入研究,并结合裂缝图像的特征,提出了一种基于传统机器学习和图像处理技术的裂缝检测方法,实现裂缝基本参数的计算和显示.内容如下: 1.裂缝图像采集(无人机) 2.裂缝 ...

  8. 【点击百度快照】基于MATLAB的运动车辆跟踪检测系统(GUI,视频读取)

    一.课题介绍* 本设计为基于MATLAB的运动车辆跟踪检测系统.带有一个GUI界面,可以读取高速路车流视频,读取视频信息,并且统计每辆车经过左车道还是右车道,车速和平均速度检测,以及某一帧下的车流密度 ...

  9. 基于MATLAB GUI界面的串口小助手

    文章目录 序 一.简介 二.步骤 1.创建一个空白GUI界面 2.拖入组件,进行搭建 3.编辑m文件 总结 序 将单片机传感器采集到的数据直接输入MATLAB进行运算分析,不仅适合仿真,在实际测试中, ...

最新文章

  1. Java RMI(1):HelloWorld篇
  2. mysql耦合_内聚与耦合
  3. Twisted twisted.python.log日志
  4. html如何在本页路径上拼接参数,Html图片路径拼接参数实现打印导出
  5. 12c oracle 修改内存_Oracle Database 12c In-Memory(内存数据库) 基本原理与简介
  6. Mac OS X Yosemite安装Hadoop 2.6记录
  7. Visual C++ 冒险游戏程序设计
  8. uC/os内存优化——TLSF算法
  9. 金山毒霸喜新厌旧 推荐QQ电脑管家抛弃金山卫士?
  10. 控制台版单机双人五子棋游戏(Java版)---新人小白
  11. python使用requests模块下载文件
  12. JSHOP2学习4:浅谈与SHOP2的区别
  13. python简单体育竞技模拟_2019-05-12 Python之模拟体育竞赛
  14. acad2010求帮助
  15. Lenovo 联想 E46 E47 SLIC Marker程序
  16. 双色球机选号码生成器(java)
  17. centernet: objects as points
  18. 医学论文笔记:TMI2021 SMU-Net: Saliency-Guided Morphology-Aware U-Net for Breast Lesion Segmentation ...
  19. 类型多样的文字游戏极品背景素材,速来收藏
  20. div清除浮动的四种方式

热门文章

  1. [原创]插卡路由器对接openwrt对接国内节点 手机免流通过USB口共享流量给路由器教程
  2. C语言简易学生成绩管理系统
  3. SDK is not loaded yet解决方法
  4. Linux系统配置虚拟IP
  5. iOS- 本地文本容错搜索引擎2--如何实现英文(英文首字母,汉语拼音)对中文的搜索?...
  6. 嵌入式linux解决方法 | bin文件烧写不到SD卡中
  7. C# Echarts 折线图 实例
  8. 一文了解数字化转型,全球进入数字服务经济大时代
  9. IOS查看包名、版本号、设备信息、签名、进程ID
  10. android 微信 备份通讯录,微信备份手机通讯录在哪?怎么用微信备份手机通讯录?...