
#第九届立创电赛#桌面温湿度检测仪复刻项目
简介
成功复刻高精度温湿度检测仪,采用盛思锐SHT40传感器,精准监测环境变化。感谢嘉立创训练营的系统指导与盛思锐传感器的卓越性能,让学习与实践并进,可实现温湿度检测,电量检测有些问题,还请指正。
简介:成功复刻高精度温湿度检测仪,采用盛思锐SHT40传感器,精准监测环境变化。感谢嘉立创训练营的系统指导与盛思锐传感器的卓越性能,让学习与实践并进,可实现温湿度检测,电量检测有些问题,还请指正。开源协议
:GPL 3.0
描述
注:* 为必填项
请在报名阶段填写 ↓
* 1、项目功能介绍
在物联网技术日益普及的今天,环境温湿度监控成为众多行业不可或缺的一环,如农业大棚、智能家居、仓储管理等。为了深入理解并实践温湿度检测技术,我参加了嘉立创举办的温湿度检测仪训练营,通过系统化的学习和实践,成功复刻了一款高精度的温湿度检测仪。(采用的温湿度传感器为盛思锐的SHT40传感器)
可实现的功能:温湿度检测,电量检测
*2、项目属性
项目属于新手区,原理图和PCB均借鉴立创EDA平台,由本人亲手绘制,程序也借鉴的官方源码,在官方源码上修改后,程序也可以正常烧录。
* 3、开源协议
开源协议采用GPL 3.0
请在竞赛阶段填写 ↓
*4、硬件部分
硬件部分分为原理图及PCB绘制部分以及外壳设计及面板设计部分。
1)原理图及PCB绘制部分:
原理图部分包括主控电路、晶振模块、SHT40温湿度传感器、三态输出8位移位寄存器、唤醒按键、测试LED、两节5号电池盒+防反接保护、共阴极3位数码管、SWD下载调试接口、M3螺孔等部分。详情见下方原理图,想亲自绘制原理图及PCB的小伙伴们,可以在B站上关注立创EDA,看相应的温湿度检测仪的硬件视频去学习。
M3螺孔
在原理图设计上,增加了四个M3螺孔,便于固定,可以为它设计相应的外壳,也可以通过两个电路板间通过M3螺丝为其临时固定,使其能够稳定放在桌面上。示意图如下:
温湿度传感器
采用盛思锐的SHT40温湿度传感器,精度高,可实时检测温湿度变化。
在项目中,SHT40采用IIC进行通信,模块上R1、R2是IIC通信的上拉电阻,起到“线与”的作用,支持挂载多个设备。
注意传感器安装方向!!!如果安装方向错误,可能使传感器损坏。
安装时需要让引脚一一对应,再进行安装。如:SDA--SDA,GND--GND等。
安装后示意图。
2)外壳设计及面板设计部分:
外壳及面板均在嘉立创EDA专业版上进行设计,需要的可自行到附件中下载。
面板3D正面预览图:
Tips:
1.数码管采用共阴极3位数码管,也可采用共阳极3位数码管。不过共阳极3位数码管需要在程序中对段码进行更改,在附件中会有相应的代码提供参考;
2.在复刻时,需要注意封装尺寸;
3.数码管上有一层塑料膜,可以防止数码管表面被划伤,在焊接前,不要撕掉塑料膜,焊接后,可根据自己的需要保留或撕掉塑料膜。
4.如果是用电烙铁焊接,焊接顺序建议先焊接贴片元件,可以先从内部的主控芯片STM32G030K6T6焊接,再一步步往外焊接贴片元件。最后焊接数码管,排针等插件。(数码管,排针引脚过长,当焊接完后,需剪短引脚,否则会影响电池底座的安装,后续会对PCB进行调整,使其便于安装)
注:请前往嘉立创EDA 生成/上传设计文件,文件完成后,相关文稿将自动生成至项目详情;这里可以详细说明您的项目实现原理和机制、注意事项、调试方法、测试方法等。推荐图文并茂的形式向别人介绍您的想法。
*5、软件部分
对代码的功能介绍:
1)官方源码 及 相应功能:(睡眠模式+按键触发+未启动电量检测)
主控采用STM32G030K6T6,采用嘉立创官方源码,程序烧录进后,硬件工作正常。当按键按下,会依次显示温度、湿度,循环两次,之后数码管熄灭。
当不按按键时,温湿度检测计处于睡眠状态,数码管不显示,大大提高待机时间,节省电池电量。
2)修改后的代码1 及 相应功能:(睡眠模式+按键触发+启动电量检测)
程序烧录后,硬件工作正常。当按键按下,会依次显示温度、湿度,电量,循环两次,之后数码管熄灭。
当不按按键时,温湿度检测计处于睡眠状态,数码管不显示,大大提高待机时间,节省电池电量。
3)修改后的代码2 及 相应功能:(运行模式+无须按键触发+启动电量检测)
程序烧录后,硬件工作正常。温湿度检测计一直处于运行状态,无须按键按下,会依次显示温度、湿度,电量,之后一直循环显示。(直至电池电量耗尽)
修改部分讲解:
代码部分是在桌面温湿度仪项目文档中的综合案例进行修改,零基础的小白可以先看一下桌面温湿度仪项目文档,再看相应修改。
桌面温湿度仪项目文档综合案例链接:8-综合案例 (yuque.com)
1)代码1修改部分:(基于综合案例修改)
代码1修改思路:
与综合案例相比,多了电量检测功能,所以需要引用ADC,在main函数中先要定义一个变量,存放电量检测的值,之后进行ADC校验,使测得的电池电压更精准,在while循环里调用Get_VolValue()函数,目前得到的值value只是1颗5号电池的电压,为了得到总电压,需要*2;*100是为了方便在数码管上显示。
ShowNum2()函数是为了解决温度和电量混淆问题,温度和电量虽然是先后显示的,但是如果同用ShowNum()函数,第一个数码管的小数点始终在第二个数后显示,可能引起混淆,所以电量检测时,用ShowNum()函数,使第一个数码管的小数点在第一个数后显示。
SN74HC595_Send_Data(SN_LED1,(sgh_value[value]|0x80)); //0x80表示共阴极数码管小数点
帮助理解:
0x80:这是一个十六进制数,等价于十进制的 128。在二进制中,它表示为 1000 0000
因此,sgh_value[value]|0x80 的操作是将 sgh_value[value] 的值与 0x80(即二进制 1000 0000)进行位或操作。这意味着无论 sgh_value[value] 的原始值是什么,其结果在最高位(最左侧的位,假设是8位或更长的二进制数)上都会被设置为1,而其他位则保持 sgh_value[value] 中相应位的值,或者如果 sgh_value[value] 在这些位上有1,则这些位也会被设置为1。
main.h中
找到这个结构体,在uint16_t Humi;下再定义一个变量Val,如上图所示。
uint16_t Val;
main.c中
1.首先定义变量value;
float value = 0;
2.在关闭数码管显示后增加ADC校准函数;
HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准
3.在while(1)中调用Get_VolValue()函数,将值赋给value,再将得到的value进行处理赋给device_paramter.Val;
value = Get_VolValue();
device_paramter.Val = (uint16_t) (value * 100) * 2;
tim.c中
1.在else if(updata_flag <= 10000)结束,else开始前,增加如下代码:
else if(updata_flag <= 15000)
{
ShowNum2(1,1,(device_paramter.Val/100));
ShowNum2(1,2,(device_paramter.Val / 10 % 10));
ShowNum2(1,3,device_paramter.Val%10);
}
gpio.c中
1.在ShowNum()函数后增加ShowNum2()函数,代码如下:
void ShowNum2(uint8_t row, uint8_t column, uint8_t value)
{
if(row == 1)
{
switch(column)
{
case 1:
SN74HC595_Send_Data(SN_DIG,0xFE);
SN74HC595_Send_Data(SN_LED1,(sgh_value[value]|0x80));
break;
case 2:
SN74HC595_Send_Data(SN_DIG,0xFD);
SN74HC595_Send_Data(SN_LED1,sgh_value[value]);
break;
case 3:
SN74HC595_Send_Data(SN_DIG,0xFB);
SN74HC595_Send_Data(SN_LED1,sgh_value[value]);
break;
default:
break;
}
SysCtlDelay(1000);
SN74HC595_Send_Data(SN_LED1,0x00);
}
else
{
switch(column)
{
case 1:
SN74HC595_Send_Data(SN_DIG,0xF7);
SN74HC595_Send_Data(SN_LED2,sgh_value[value]);
break;
case 2:
SN74HC595_Send_Data(SN_DIG,0xEF);
SN74HC595_Send_Data(SN_LED2,(sgh_value[value]|0x80));
break;
case 3:
SN74HC595_Send_Data(SN_DIG,0xDF);
SN74HC595_Send_Data(SN_LED2,sgh_value[value]);
break;
default:
break;
}
SysCtlDelay(1000);
SN74HC595_Send_Data(SN_LED2,0x00);
}
}
gpio.h中
1.在Shownum后声明Shownum2函数:
void ShowNum2(uint8_t row, uint8_t column, uint8_t value);
2)代码2修改部分:(基于代码1修改)
代码2修改思路:
在代码1的基础上,不进行按键触发,没有休眠状态,一直运行。注释或删去关于休眠状态的代码,使其一直运行,循环执行读取温湿度及电量检测。
tim.c中
修改后,如图所示:
main.c中
修改后,如图所示:
3)共阳极数码管修改部分:(基于综合案例修改)
共阳极数码管修改思路:
共阳极和共阴极显示相同数字所需段码相反,需把段码取反。
如果对共阳和共阴数码管段码是怎么改的,可以参考下面的博客
共阳和共阴数码管详细段码(带图)_共阳数码管段码表-CSDN博客
共阳极、共阴极数码管编码表(0~9、A~P……全亮)_共阳极数码管显示0~9对应的段码-CSDN博客
main.c中
修改后,如图所示:
tim.c中
修改后,如图所示:
gpio.c中
修改后,如图所示:
Tips:
1.电池电量显示可能存在问题,目前还不知道怎么解决,欢迎小伙伴们在下方留言;
2.代码如何烧录,可看立创EDA的温湿度检测仪的软件视频去解决,后续会将本人如何烧录的过程补充进去,如果还未解决,欢迎小伙伴们在下方留言;
3.如果采用共阳数码管,需要对代码进行修改,详细代码在附件;
4.工程源码在附件中,小伙伴们按需下载。
注:若您的项目涉及软件开发,请在附件上传对应的工程源码。这里可以详细说明您的软件流程图、功能模块框图、相关算法的解释或科普、源码结构、编译环境的搭建和配置、源码编译方法、程序烧录方法等。推荐图文并茂的形式向别人介绍您的想法。
*6、BOM清单
请输入内容…
注:项目涉及的BOM清单。在嘉立创EDA 生成/上传设计文件后,BOM将自动生成至项目详情;建议包括型号、品牌、名称、封装、采购渠道、用途等内容。具体内容和形式应以表达清楚项目构成为准。
*7、大赛LOGO验证
电路板:
面板:
请上传包含大赛logo的项目图片,logo以丝印形式印刷在PCB上面。
点击zip下载大赛logo标识! (大赛标识).zip
8、附件说明
1.zip中是综合案例中的官方源码;
2.zip中是修改代码1,与官方源码比,启用了电量检测功能;
3.zip中是修改代码2,与修改代码1比,无须按键触发,循环执行温湿度检测及电量检测功能;
4.zip中是修改代码3,与官方源码比,可让共阳数码管显示;
5.zip中是修改代码4,与官方源码比,可实现当显示温度时,由74HC595控制的led同时亮起,当显示湿度时,led熄灭。
9、复刻说明
目前3D外壳设计,存在问题,需要修改,正在修改中。若只复刻电路板,可以采用附件的pcb文件进行下单。
* 10、演示您的项目并录制成视频上传
视频要求:请横屏拍摄,分辨率不低于1280×720,格式Mp4/Mov,单个视频大小限100M内;
视频标题:立创电赛:{项目名称}-{视频模块名称};如立创电赛:《自动驾驶》-团队介绍。
设计图

BOM


评论