基于STM32的智能室内环境检测系统
时间:2022-10-28 20:00:00
基于STM32的智能家具检测系统
闲来无事,用手头STM32做个项目。
成品功能:
1.不同的基点可以同时检测不同的环境;
这些节点向基站发送数据;
3.当基站检测到异常数据时,可以给手机发短信提醒;
材料
- STM32F103C8T6两个最小系统板
- OLED显示屏(IIC 四脚)两块
- 温湿度模块(DHT11)
- 气体传感器模块(TVOC/CO2 甲醛的空气质量 二氧化碳测量)(SGP30)
- 空气质量传感器(MQ-135)
- 蓝牙模块(HC-05)两个
- 短信GSM无线模块(SIM800C)
- 杜邦线
- 电源(充电宝代替)
- 用keil5进行开发
开始制作。
制作过程
分为基点和基站,负责收集不同的传感器信息并发送给基站;基站负责处理信息并发送给手机。
基点:接收不同传感器收集的数据,包装在一起,通过蓝牙模块发送到基站蓝牙模块。
基站:通过蓝牙接收数据、处理、判断,当数据异常时,通过GSM发短信提醒手机。
系统制作
基点采用STM32F103C8T6作为主控;SGP30接3.3V供电,采用IIC数据传输;MQ-135接5V供电,有一个模拟输出,一个数字输出,我们在这里使用模拟输出,收集AD值,蓝牙模块连接3.3v供电、串口传输;OLED接3.3v供电,采用IIC传输数据。
基站采用STM32F103C8T6作为主控;OLED接3.3v供电,采用IIC传输数据。GSM模块接5V供电,串口传输。
OLED模块调试
有机发光二极管又称有机激光显示,OLED显示技术具有自发光的特点,采用非常薄的有机材料涂层和玻璃基板,当电流通过时,这些有机材料会发光,OLED显示屏幕可视角度大,功耗低。OLED由于同时具有自发光、无背光源(仅通电不亮、驱动程序和接线正确)、对比度高、厚度薄、视角广、响应速度快、柔性面板、使用温度范围广、结构简单、工艺简单等优良特点。第一个接触的12864屏幕是LCD是的,需要背光,功耗高,而且OLED的功耗低,更适合小系统;由于两者发光材料的不同,在不同的环境中,ILED显示效果更好。模块电源可为3.3V也可以是5V,不需要修改模块电路,OLED屏幕有多个指令控制,可以控制OLED亮度、对比度、开关升压电路等指令。操作方便,功能丰富。汉字可以显示,ASCll、图案等。同时,为方便产品应用,预留4个M固定孔,方便用户将其固定在外壳上。
模块通过IIC进行通讯。
硬件连接
IIC没有端口限制,随便找两个普通的IO接上即可。
软件测试
1.调用淘宝给出的例程。
2. 根据自己的需要,通过取模软件获得自己想要显示的汉字或图片。
3.观察显示是否正确。
根据此设置取模软件
把得到的值放进去char Hzk[][32]
在这个数组中
SGP30模块调试
SGP30模块
SGP30主要检测空气质量。TVOC它是指总能挥发有机气体的重要指标。一般来说,我们可以用它来反映甲醛的浓度。
SGP30是一种金属氧化物气体传感器,单芯片上有多个传感元件,集成了四个气体传感元件,具有完全校准的空气质量输出信号。SGP易于集成,可将金属氧化物气体传感器集成到移动设备中,为智能家居、家电和物联网应用中的环境监测开辟了新的可能性。主要用于甲醛检测!
模块通过IIC进行通讯。
硬件连接
IIC没有端口限制,只需找两个引脚连接即可。
软件测试
- 配置好IIC通信。
- 数据接收按协议配置。
- 测试数据是否正确。
调试温湿度模块
DHT11模块
分辨率:16Bit
重复性:士1%:士1%RH
精 度:25℃士5%RH
互换:可完全互换
响应时间:1/e(63%)25℃ 6s 1m/s 空气 6s
迟 滞:<士0.3%RH
长期稳定:<±0.5%RH/yr
供 电:DC33~5.5V
供电电流:测量0.3mA待机60μA
采样周期:次大于2秒
湿度测量范围:20-95%RH
温度测量范围:0-50℃
温度分辨率:1℃
硬件连接
接一个普通IO可作为数据输入(推挽输入)。
软件测试
- 数据接收按协议配置。
- 测试数据是否正确。
空气质量传感器模块调试
MQ-135模块
硬件连接
接AD输入(模拟输入)。
软件测试
- 配置好ADC检测。
- 测试数据是否正确。
蓝牙模块调试
HC-05模块
1.使用核心模块HC-从模块中引出的接口包括05VCC,GND,TXD,RXD,KEY引脚,蓝牙连接引脚(STATE),未连接输出低,连接后输出高;
2、led表示蓝牙连接状态,快闪表示没有蓝牙连接,慢闪表示进入AT双闪表示蓝牙已连接并打开端口;
3、底板设置防反接二极管,带3.3V LDO,输入电压3.6~6V,未配对时电流约30mA,配对后约10mA,禁止输入电压超过7V!
4、接口电平3.3V,各种单片机(51,AVR,PIC,ARM,MSP430等),5V单片机也可以直接连接,无需MAX232也不能经过MAX232!
5.空地有效距离10米(功率等级为CLASS 2)也有可能超过10米,但不能保证这个距离的连接质量
6.配对后,当全双工串口使用时,无需了解任何蓝牙协议,支持8位数据位、1位停止位和奇偶验证通信格式。这也是最常用的通信格式,不支持其他格式。
7.可以通过拉34脚进入AT命令模式设置参数和查询信息;
体积小(3).57cm*1.52cm),工厂贴片生产,保证贴片质量。并套透明热缩管,防尘美观,具有一定的防静电能力。
9、可通过AT通过命令切换到主机或从机模式AT命令连接指定设备;
10、支持从4800bps~1382400bps间标准波特率;
https://item.taobao.com/item.htm?spm=a230r.1.14.16.cbf753edcP10kQ&id=39244262350&ns=1&abbucket=8#detail
硬件连接
两颗蓝牙分别连接到串口。
软件测试
- 我们将两颗蓝牙配置为上电自动开启传输模式,波特率为9600,因此无需控制输出,只需接收两颗牙齿传输的数据。https://blog.csdn.net/weixin_42320020/article/details/88562539)
- 配置串口发送和接收,具体分析主机段数据。
- 测试数据是否正确。
GSM模块调试
ATK-SIM800C
本模块供电要求:5V 供电 ,计算机调试初始计算机USB供电能满足要求。因为我们加了10000UF的大电容。长期传输数据用电量推荐1A上述直流,TTL电平串口自适应兼容性3.3V和5V单片机。单片机可直接连接。待机在80MA休眠状态可设置在10左右MA左右低功耗。电脑调试USB–232和USB–TTL都可以,根据每个人的配件。支持短信、数据、彩信、互联网等。复位排针引出,可实现现场无人值守远程复位,带DTMF远程遥控功能的功能。该模块最大的优点是保留232口。在学习或开发过程中,可以监控51台低端单片机和模块指令的执行情况,更快地找出原因,节省开发和学习时间。[支持2,3,4G手机卡]
硬件连接
两个串口线接在板子另一路串口上,还需要接12V独立供电。
AT指令测试模块调试
首先用AT指令测试模块,达到可以发短信,打电话。
下边是部分AT指令:
AT | 返回 | 作用 |
---|---|---|
AT | OK | 模块通讯正常 |
AT+CPIN? | +CPIN:READY | 查询 SIM 卡的状态,主要是 PIN 码 |
AT+CSQ | +CSQ: 24,0 | 查询信号质量 |
AT+COPS? | +COPS:0,0,”CHINA MOBILE” | 查询当前运营商 |
AT+CGMI | SIMCOM_Ltd | 查询模块制造商 |
AT+CGMM | SIMCOM_SIM800C | 查询模块型号 |
AT+CGSN | 866104023267696 | 查询产品序列号(集 IMEI 号) |
AT+CNUM | +CNUM:””,”136******”,”129”,7,4 | 查询本机号码 |
ATE1 | OK | 设置回显模式(默认开启) |
ATD10086; | OK | 用于拨打任意电话号码 |
ATA | OK | 应答电话 |
ATH | OK | 挂断电话 |
AT+CMGF=1 | OK | 置短消息模式,设置为文本模式 |
AT+CSCS=“GSM” | OK | 用于设置 TE 字符集,纯英文为GSM,中英文为UCS2 |
AT+CMGS | > | 用于发短信 |
英文短信的发送
- 设置字符集为
AT+CSCS="GSM"
; - 设置文本模式为
AT+CMGF=1
; - 发送短信的目的人为
AT+CMGS="18********"
; - 然后模块返回:
>
,此时我们输入我们需要发送的内容:ATK-SIM800C MSG SEND TEST
; - 在发送完内容以后, 最后以十六进制(HEX)格式单独发送(不用添加回车):
1A
(即 0X1A),即可启动一次短信发送。 - 稍等片刻,在短信成功发送后,模块返回如: +CMGS: 39,的确认信息,表示短信成功发送
中文短信的发送
- 首先发送
AT+CMGF=1
, 设置为文本模式; - 设置文本模式参数
AT+CSMP=17,167,2,25
; - 设置字符集为
AT+CSCS="UCS2"
; - 首先要用将号码和发送内容转换为UNICODE 字符串,
1.号码182********,转换后的 UNICODE 字符串(去掉空格后)为:
2.00310038003200390030003100390035003600330032
3.ATK-SIM800C 中英文短信发送测试,装换后的 UNICODE 字符串为:
4.00410054004B002D00530049004D003800300030004300204E2D82F1658777ED4FE153D
190016D4B8BD5
由于使用了 UCS2字符集,所有字符/数字/汉字,都必须使用 UNICODE 编码
- 发送:
AT+CMGS=”00310038003200390030003100390035003600330032”
,这个指
令,然后模块返回:>
- 此时我们输入我们需要发送的内容:
00410054004B002D00530049004D003800300030004300204E2D82F1658777ED4FE153D 190016D4B8BD5
注意,此可以不用发送回车了; - 在发送完内容以后,最后以十六进制(HEX)格式当独发送(不用添加回
车):1A
(即 0X1A),启动一次短信发送。
一次中英文短信发送成功。
代码测试
我们要做的就是将上述步骤自动化,这里我们做的是英文短信,因为英文短信简单,也足够满足我们的需求。
- 初始化
- 短信测试
3. 这样既可得到我们需要的内容
GSM模块代码
//SIM800C主测试程序
void sim800c_test(void)
{
OLED_Clear();
sim800c_send_cmd((u8*)0X1A,"+CMGS:",10);
delay_ms(1000);
while(sim800c_send_cmd("AT","OK",100))//检测是否应答AT指令
{
OLED_ShowString(40,3,"SBLJZ ",16); //连接成功
sim800c_send_cmd((u8*)0X1A,"+CMGS:",10);
delay_ms(800);
}
OLED_ShowString(40,3,"LJCG ",16); //连接成功
delay_ms(10);
while(sim800c_send_cmd("AT+CMGF=1","OK",200)){
} //设置文本模式
OLED_ShowString(40,3,"WBMS ",16);//文本模式
while(sim800c_send_cmd("AT+CSCS=\"GSM\"","OK",200)){
} //设置TE字符集为UCS2
OLED_ShowString(40,3,"ZFMS ",16);//字符模式
//发送短信测试
OLED_ShowString(40,3,"ZZSZ ",16); //正在发送
if(sim800c_send_cmd("AT+CMGS=\"13113131313\"",">",800) == 0);
printf(temp_table_Send);
if(sim800c_send_cmd((u8*)0X1A,"+CMGS:",800)==0){
OLED_ShowString(40,3," FSCG ",16);return;}
OLED_ShowString(40,3," FSSB ",16);
USART_RX_STA_2=0;
if(USART_RX_STA_2&0X8000)sim_at_response(1);//检查从GSM模块接收到的数据
}
这样就可以了。
最后完善代码逻辑。
通过接收基点发来的数据,经过分析后,当出现超过阈值的数值之后发送一次短信,知道本次恢复正常后再次超过阈值才会发送第二次短信。
这是整个实验的效果视频。
https://www.bilibili.com/video/BV1CR4y1A7Mf?spm_id_from=333.337.search-card.all.click
最后附上完整的项目文件。自行下载。
https://download.csdn.net/download/weixin_42320020/85319611
这个项目到这里就算完了。
还有很多不足的地方,希望大佬可以指正。也希望和爱好者交流学习。
禁止转载!!!
博客:https://blog.csdn.net/weixin_42320020/?type=blog
QQ:2039723308
VX:Shiboven