摘 要
在智能家居技术快速发展和人们对学习环境品质要求不断提升的背景下,传统书房存在环境调节不智能、书籍查找困难、久坐健康问题突出等痛点。本文基于STM32F103单片机开发了一套集成化的智能书房系统,采用多传感器融合架构,包括人体红外检测模块、光敏传感器、称重传感器、DHT11温湿度传感器、烟雾传感器、RFID模块、语音识别模块、ESP8266Wi-Fi模块以及OLED显示屏,实现了人来灯亮、自动调光、温湿度控制、久坐报警、烟雾监测、书籍查找及远程监控等功能。经系统测试结果表明,各功能模块运行稳定,响应准确,能够有效提升书房的舒适性、安全性和智能化水平,具有良好的实用价值。
关键词 ****:****STM32单片机 智能书房 环境监测 RFID管理 语音播报
Abstract
In the context of the rapid development of smart home technology and the increasing demands for quality learning environments, traditional studies face challenges such as unintelligent environmental regulation, difficulty in book retrieval, and prominent health issues related to prolonged sitting. This design develops an integrated smart study system based on the STM32F103 microcontroller, adopting a multi-sensor fusion architecture that includes a human infrared detection module, photosensitive sensor, weighing sensor, DHT11 temperature and humidity sensor, smoke sensor, RFID radio frequency module, speech recognition module, and OLED display. The system achieves functions such as people-triggered lighting, automatic brightness adjustment, intelligent temperature and humidity control, prolonged sitting alarm, smoke monitoring alarm, smart book search, and remote monitoring and threshold setting via a mobile APP through the Wi-Fi module. System tests show that each functional module operates stably and responds accurately, effectively enhancing the comfort, safety, and intelligence level of the study, demonstrating good practical value.
****Keywords:****STM32 microcontroller,smart study,environmental monitoring,RFID management,voice broadcast
目 录
[1 绪论](#1 绪论)
[1.1 选题背景及其意义](#1.1 选题背景及其意义)
[1.2 国内外研究现状](#1.2 国内外研究现状)
[1.3 主要内容](#1.3 主要内容)
[1.4 文章结构](#1.4 文章结构)
[1.5 本章小结](#1.5 本章小结)
2 系统总体设计方案
[2.1 系统需求分析](#2.1 系统需求分析)
[2.2 主要模块选型](#2.2 主要模块选型)
[2.2.1 主控芯片选择](#2.2.1 主控芯片选择)
[2.2.2 显示模块选择](#2.2.2 显示模块选择)
[2.2.3 温湿度传感器选择](#2.2.3 温湿度传感器选择)
[2.2.4 通信模块选择](#2.2.4 通信模块选择)
[2.3 系统总体设计方案](#2.3 系统总体设计方案)
[2.4 本章小结](#2.4 本章小结)
3 系统硬件设计
[3.1 主控电路设计](#3.1 主控电路设计)
[3.2 显示电路设计](#3.2 显示电路设计)
[3.3 输入电路设计](#3.3 输入电路设计)
[3.4 人体感应电路设计](#3.4 人体感应电路设计)
[3.5 报警电路设计](#3.5 报警电路设计)
[3.6 照明控制电路设计](#3.6 照明控制电路设计)
[3.7 无线通信电路设计](#3.7 无线通信电路设计)
[3.8 射频识别电路设计](#3.8 射频识别电路设计)
[3.9 称重检测电路设计](#3.9 称重检测电路设计)
[3.10 语音识别电路设计](#3.10 语音识别电路设计)
[3.11 烟雾检测电路设计](#3.11 烟雾检测电路设计)
[3.12 温度控制电路设计](#3.12 温度控制电路设计)
[3.13 光照检测电路设计](#3.13 光照检测电路设计)
[3.14 温湿度检测电路设计](#3.14 温湿度检测电路设计)
[3.15 整体电路设计](#3.15 整体电路设计)
[3.16 本章小结](#3.16 本章小结)
[4 系统软件设计](#4 系统软件设计)
[4.1 主程序设计](#4.1 主程序设计)
[4.2 人体感应检测子程序](#4.2 人体感应检测子程序)
[4.3 光照强度检测与调光子程序](#4.3 光照强度检测与调光子程序)
[4.4 温湿度检测与温度控制子程序](#4.4 温湿度检测与温度控制子程序)
[4.5 烟雾检测与报警子程序](#4.5 烟雾检测与报警子程序)
[4.6 座椅占用与久坐检测子程序](#4.6 座椅占用与久坐检测子程序)
[4.7 RFID射频识别子程序](#4.7 RFID射频识别子程序)
[4.8 语音识别与播报子程序](#4.8 语音识别与播报子程序)
[4.9 按键处理与屏幕显示子程序](#4.9 按键处理与屏幕显示子程序)
[4.10 WiFi通信与APP交互子程序](#4.10 WiFi通信与APP交互子程序)
[4.11 本章小结](#4.11 本章小结)
[5 系统测试与分析](#5 系统测试与分析)
[5.1 系统整体测试](#5.1 系统整体测试)
[5.2 传感器模块功能测试](#5.2 传感器模块功能测试)
[5.2.1 人体红外感应模块测试](#5.2.1 人体红外感应模块测试)
[5.2.2 温湿度传感器模块测试](#5.2.2 温湿度传感器模块测试)
[5.2.3 烟雾传感器模块测试](#5.2.3 烟雾传感器模块测试)
[5.2.4 称重传感器模块测试](#5.2.4 称重传感器模块测试)
[5.3 执行器控制功能测试](#5.3 执行器控制功能测试)
[5.3.1 照明控制模块测试](#5.3.1 照明控制模块测试)
[5.3.2 温度控制模块测试](#5.3.2 温度控制模块测试)
[5.3.3 蜂鸣器报警模块测试](#5.3.3 蜂鸣器报警模块测试)
[5.4 交互功能测试](#5.4 交互功能测试)
[5.4.1 OLED显示模块测试](#5.4.1 OLED显示模块测试)
[5.4.2 按键交互模块测试](#5.4.2 按键交互模块测试)
[5.4.3 WiFi通信模块测试](#5.4.3 WiFi通信模块测试)
[5.4.4 RFID识别与语音模块测试](#5.4.4 RFID识别与语音模块测试)
[5.5 系统稳定性测试](#5.5 系统稳定性测试)
[5.6 本章小结](#5.6 本章小结)
[结 论](#结 论)
[致 谢](#致 谢)
[附录A 电路原理图](#附录A 电路原理图)
1 绪论
1.1 选题背景及其意义
书房作为家庭中阅读、学习和工作的重要场所,其环境质量直接影响着使用者的专注度、效率和身心健康,而且传统书房存在照明需手动调节、温湿度控制缺乏联动、久坐健康隐患、书籍查找困难、烟雾隐患难以感知等问题。这些问题不仅降低了书房的使用体验,也对使用者的健康构成潜在威胁。
随着物联网技术和嵌入式系统的快速发展,智能家居已逐渐从概念走向现实,深入到家庭生活的各个角落。STM32单片机凭借其高性能、低功耗、丰富外设接口等优势,在智能家居系统设计中得到广泛应用。将STM32与各类传感器、执行器和通信模块相结合,可以构建一个能够感知环境、智能决策、自动控制并支持远程交互的智能书房系统。
对于传统书房书籍查找困难,照明需要手动调节,烟雾隐患,久坐隐患等问题,本文设计针对上述问题,集成人体红外检测、光照检测、温湿度检测、称重检测、烟雾检测、RFID、语音识别、Wi-Fi通信等多种技术,实现书房环境的自动调节、书籍的智能化管理、久坐健康提醒和安全预警等功能。该系统不仅能够提升书房的舒适度和便利性,还能培养使用者良好的学习习惯,具有重要的现实意义和应用价值。
1.2 国内外研究现状
1.2.1 国内发展现状
黄婷等人1(2025)在基于STM32的自适应智能书房环境控制系统研究中,提出了一套完整的环境感知与控制方案,通过多传感器协同工作实现了书房内光照、温湿度等参数的自动调节,解决了传统书房环境控制依赖人工操作的问题。潘亚宾2(2025)设计并实现了一款物联网智能台灯,该研究将Wi-Fi通信技术引入台灯控制系统,实现了手机APP远程调光与定时控制,为智能照明设备在书房场景中的应用提供了技术参考。李齐新3(2024)基于智能控制技术设计了多功能台灯,该研究重点关注了台灯的光照自适应调节功能,通过光敏传感器采集环境亮度信息并动态调整LED灯珠的发光强度,为用户提供舒适的学习照明环境。何逸竹4(2023)从用户体验视角出发对智慧书房服务效果提升进行了深入研究,该研究通过用户调研和需求分析指出,智慧书房的核心在于以用户为中心的服务设计,技术只是实现手段,真正提升用户体验需要关注交互的便捷性和功能的实用性。谢福等人5(2022)基于STM32单片机完成了智能书桌的设计与实现,该研究将人体红外传感器、光敏传感器和称重传感器集成到书桌系统中,实现了人员检测、自动调光和坐姿监测功能,为书房智能化提供了硬件基础。张细呈6(2024)在大概念统领下的高中信息技术单元教学实践中,以信息系统搭建为教学单元,探讨了智能控制系统在教育教学中的应用价值,该研究表明智能控制系统有助于培养学生的计算思维和工程实践能力。(跟你的工作相关性弱) 张皓月7等人(2024)设计了一种基于OpenPose的坐姿提醒智能书桌,该研究利用计算机视觉技术识别人体关键点,当检测到用户坐姿不端正时发出提醒,为书房健康监测提供了新的技术思路。何逸竹8(2023)在用户体验视角下的智慧书房服务效果提升研究中进一步指出,智慧书房的未来发展方向是情感化交互和个性化服务,系统不仅要响应用户的显性指令,还要能够主动感知用户状态并做出智能决策。(前面提到过 何逸竹 ) 李博9等人(2022)设计了一种智能儿童书桌,该研究将RFID技术应用于书桌系统,通过刷卡识别用户身份并自动调节书桌高度和桌面倾斜角度,为不同用户提供个性化的使用体验。谢福等人10(2022)在基于STM32单片机的智能书桌设计与实现中详细阐述了传感器选型、电路设计和软件编程的全过程,该研究的硬件架构对本文具有重要的参考价值。(前面提到过 谢福 ) 汪金龙和姚召辉11(2021)基于人体健康监测理念设计了智能书桌,该研究重点关注久坐提醒功能,通过称重传感器检测用户是否在位,当连续坐姿时间超过设定阈值时触发蜂鸣器报警,提醒用户起身活动。汤洁和储蕾芳12(2020)对儿童智能书桌进行了研究设计,该研究从人机工程学角度出发,分析了书桌高度、桌面倾斜角度和座椅舒适度对儿童健康的影响,强调了智能书桌设计应遵循人体工学原理。****(跟你的工作相关性弱)****杜伟等人13(2020)基于人体健康监测完成了智能书桌的设计与研究,该研究采用多传感器融合技术,同时监测坐姿时间、环境光照和环境温湿度,实现了全方位的健康管理功能。
文献的脉络按时间从前到后
1.2.2 国外发展现状
Maryam等人14(2021)开展了一项关于岩石材料抗拉强度预测的比较智能研究,该研究利用非破坏性测试方法结合机器学习算法对材料强度进行预测,展示了多传感器数据融合和智能算法在工程领域的应用潜力****(**** 岩石 ?相差太远吧),其研究方法对智能书房系统中多源信息的处理具有借鉴意义。从国外智能家居的发展趋势来看,欧美发达国家在智能环境控制领域起步较早,已经形成了较为成熟的产品体系。美国谷歌公司和亚马逊公司推出的智能音箱产品将语音交互技术引入家庭场景,用户可以通过语音指令控制灯光、空调等设备,这种自然交互方式大大降低了智能设备的使用门槛。欧洲研究机构在环境感知和节能控制方面成果显著,德国研究团队开发的智能照明系统能够根据室内人员位置和活动状态动态调整灯光分布,实现了按需照明和节能降耗的双重目标。日本学者在健康监测和辅助技术领域开展了深入研究,将压力传感器、红外传感器和加速度传感器集成到日常家具中,实现了对老年人生活状态的远程监护,这些研究为本文中久坐提醒和人员检测功能提供了技术参考。国外智能书房相关产品在交互设计上更加注重用户体验,移动端APP和语音助手的深度整合使得用户可以无缝切换控制方式,系统能够学习用户的使用习惯并主动推荐合适的书房环境参数。在书籍管理方面,国外图书馆自动化系统已经广泛应用RFID技术,读者可以通过自助借还书终端快速完成图书借阅,这一技术思路被移植到个人书房场景后,可以有效解决家庭书籍管理混乱的问题。
找不到英文文献吗?
背景、文献调研都没有认真写
经过文献调研,目前存在的问题,你解决什么问题
1.3 主要内容
本文采用STM32F103单片机作为核心控制器,构建了一个集成环境监测、自动控制、书籍管理和健康提醒功能的智能书房系统。硬件方面,系统以STM32最小系统电路为基础,扩展了SR501人体红外检测模块用于人员存在感知,光敏电阻模块用于环境亮度采集,称重传感器用于座椅占用判断,DHT11温湿度传感器用于环境参数监测,MQ-2烟雾传感器用于空气质量检测,RC522射频识别模块用于书籍信息读取,LD3320语音识别模块用于语音指令识别,LU6288语音合成模块用于语音播报,ESP8266 Wi-Fi模块用于与手机APP通信,OLED显示屏用于本地信息显示。软件方面,采用Keil MDK开发环境,使用C语言进行模块化编程,设计了主程序循环及各功能子程序。系统实现了人来灯亮自动照明、环境亮度自适应调节、温湿度超限自动控制、久坐定时报警提醒、烟雾浓度超限报警、RFID射频卡书籍查找、语音识别书籍位置播报、手机APP远程监控与阈值设置等功能。通过软硬件的协同设计,使书房具备智能感知、自动控制和远程交互能力,为用户创造舒适、便捷、安全的学习工作环境。
1.4 文章结构
本论文共分为六个部分。
第1章为绪论,阐述选题背景与意义,分析国内外研究现状,介绍主要研究内容。
第2章为系统总体设计方案,包括需求分析、模块选型和总体架构设计。第三章为系统硬件设计,详细说明各功能模块的电路原理、接口连接和管脚分配。第四章为系统软件设计,介绍主程序流程和各功能子程序的设计思路,并给出相应的流程图。第五章为系统测试与分析,通过测试用例验证各模块功能和系统整体性能。最后是结论部分,总结设计成果并展望未来改进方向。
1.5 本章小结
本章首先阐述了智能书房系统研究的背景与意义,指出传统书房在环境控制、书籍管理和健康监测等方面存在的不足,说明本文的研究价值。随后从国内和国外两个维度分析了智能书房相关技术的研究现状,国内研究呈现出功能集成化和控制智能化的趋势,国外研究则更注重用户体验和网络构建(那你前面的文献要能看出来这点 )。最后介绍了本文的主要内容和论文的整体结构安排。通过本章的分析,为后续的系统设计和实现奠定了理论基础。
2 系统总体设计方案
2.1 系统需求分析
在智能书房系统的设计过程中,首先需要明确用户的实际需求和期望达成的目标。通过对书房使用场景的深入分析,本文从以下方面归纳用户需求:环境舒适度方面,用户希望书房能够根据环境亮度,人员存在自动调节照明;根据温湿度变化自动调节取暖或降温设备,始终保持在适宜学习和工作的状态;健康管理方面,长时间伏案工作容易导致颈椎、腰椎问题,用户需要系统能够监测座椅占用时间并在达到设定时长后给出提醒;书籍管理方面,随着藏书数量增加,查找特定书籍变得困难,用户希望有一种便捷的方式能够快速定位书籍位置;安全防护方面,书房内的电器设备和纸质书籍存在火灾隐患,用户需要系统能够及时感知烟雾浓度异常并发出警报;远程交互方面,用户希望能够通过手机随时了解书房状态并进行远程控制。基于以上需求分析,本文确立如下目标:构建一个以STM32单片机为核心****(现在还不知道是STM32)****,集成多种传感器和执行器,具备环境自动控制、书籍智能管理、健康监测提醒和远程交互功能的智能书房系统。
结构写清楚,用(1)(2)(3)。。。
2.2 主要模块选型
2.2.1 主控芯片选择
方案一:以STM32F103C8T6单片机为主控制模块,该芯片采用ARM Cortex-M3核心架构,属于32位微控制器,最高工作频率可达72MHz,处理速度达到1.25MIPS/MHz,能够执行复杂的控制算法和多任务处理。其内置64KB Flash存储器和20KB SRAM存储器,拥有7个定时器、2个12位ADC、3个USART接口、2个SPI接口和2个I2C接口,丰富的片上资源可以满足本系统多种传感器接入和执行器控制的需求。STM32F103C8T6单片机如图2-1所示。

图2-1 STM32F103C8T6单片机实物图
方案二:以STC89C52单片机为主控制模块,该芯片采用8051核心架构,属于8位微控制器,处理速度约为0.2-0.5MIPS/MHz,内置8KB Flash存储器和256字节RAM存储器。STC89C52价格低廉,编程简单,适合成本敏感且功能简单的应用场景。但其处理速度慢,无法执行复杂指令,且串口资源有限,难以满足本系统多传感器同时工作和Wi-Fi通信的需求。STC89C52单片机如图2-2所示。

图2-2 STC89C52单片机实物图
结论:本系统需要同时处理人体红外检测、温湿度采集、烟雾浓度分析、称重数据处理、RFID、语音识别解析、Wi-Fi通信协议栈等多个任务,对处理器的运算能力和外设接口数量有较高要求。STC89C52的性能无法满足系统需求,而STM32F103C8T6具有强大的处理能力、丰富的外设接口和完善的开发支持,能够胜任本文的所有功能要求。因此选择STM32F103C8T6作为主控芯片。
2.2.2 显示模块选择
方案一:0.96寸OLED显示屏,分辨率为128×64,采用自发光技术,无需背光源,具有功耗低、对比度高、视角宽、响应速度快等特点。工作电压为3.3V---5V,支持I2C和SPI两种通信接口,仅需少量引脚即可与单片机连接,非常适合嵌入式系统使用。OLED显示屏如图2-3所示。

图2-3 0.96寸OLED显示屏实物图
方案二:LCD1602字符型液晶显示屏,可显示2行共32个字符,需要背光源,功耗较高,工作电压为5V。虽然价格低廉,但只能显示字母、数字和少量自定义字符,无法显示汉字和图形,信息展示能力有限。LCD1602显示屏如图2-4所示。

图2-4 LCD1602显示屏实物图
结论:本系统需要显示温湿度、光照强度、烟雾浓度、人员状态、当前模式等多种信息,且需要显示汉字提示,OLED显示屏的分辨率和汉字显示能力能够满足这一需求。同时OLED的低功耗特性也符合智能家居设备的节能要求。因此选择OLED显示屏作为显示模块。
2.2.3 温湿度传感器选择
方案一:DHT11数字温湿度传感器,采用单总线通信协议,能够同时测量温度和湿度。温度测量范围为0℃至50℃,精度±2℃;湿度测量范围为20%至90%RH,精度±5%RH。响应速度快,功耗低,工作电压为3.3V---5V,仅需一个I/O引脚即可与单片机通信。DHT11温湿度传感器如图2-5所示。

图2-5 DHT11温湿度传感器实物图
方案二:DS18B20数字温度传感器,采用单总线通信协议,仅能测量温度不能测量湿度。温度测量范围为-55℃至125℃,精度±0.5℃。虽然测量精度高于DHT11,但无法提供湿度信息,需要额外配置湿度传感器才能完成环境监测任务。DS18B20温度传感器如图2-6所示。

图2-6 DS18B20温度传感器实物图
结论:本系统需要同时监测书房的温度和湿度参数,DHT11能够在一个模块中实现温湿度两种参数的采集,简化了硬件设计和软件编程。虽然精度相对有限,但已满足书房环境监测的基本需求。因此选择DHT11作为温湿度传感器。
2.2.4 通信模块选择
方案一:ESP8266 Wi-Fi模块,支持802.11 b/g/n无线协议,内置TCP/IP协议栈,可通过串口与单片机通信。工作电压为3.3V,支持Station和AP两种工作模式,能够连接家庭路由器实现与云端或手机APP的数据交互。ESP8266模块价格低廉,性能稳定,开发资源丰富。ESP8266 Wi-Fi模块如图2-7所示。

图2-7 ESP8266 Wi-Fi模块实物图
方案二:HC-05蓝牙模块,支持蓝牙2.0协议,通过串口与单片机通信。工作电压为3.3V---5V,通信距离约10米。蓝牙模块功耗较低,连接简单,但只能与近距离设备通信,无法实现远程监控。HC-05蓝牙模块如图2-8所示。

图2-8 HC-05蓝牙模块实物图
结论:本系统需要实现远程监控功能,用户可能在任何地方通过手机APP查看书房状态和进行控制,Wi-Fi模块能够接入互联网满足这一远程访问需求。而蓝牙模块只能实现近距离通信,无法满足远程监控的设计目标。因此选择ESP8266 Wi-Fi模块作为通信模块。
其他模块的选型比较分析呢?
2.3 系统总体设计方案

图2-9 系统总体框架设计图
你工作量确实多,RFID、语音这些是你重点,后面要详细写实现,如果觉得太多,可以去掉一些模块,比如温湿度及其控制或者称重模块,你称重模块真的有称出来吗?
还有风扇、加热?直接改成空调?现在书房也不装风扇吧?
本文以STM32F103C8T6单片机为核心控制器,采用模块化设计思想,将系统分为感知层、控制层和应用层三个层次。感知层由各种传感器组成,包括SR501人体红外传感器用于检测书房是否有人,光敏传感器用于采集环境光照强度,称重传感器用于检测座椅是否被占用,DHT11温湿度传感器用于监测环境温湿度,MQ-2烟雾传感器用于检测烟雾浓度。控制层以STM32单片机为核心,负责接收传感器数据,执行数据处理和控制算法,驱动执行器工作,同时管理各模块间的通信。应用层包括本地交互设备和远程控制终端,本地通过OLED显示屏显示系统状态,通过按键进行阈值设置和模式切换,通过蜂鸣器发出报警提示,通过加热片和风扇调节温度,通过PWM控制USB灯条调节照明亮度;远程通过ESP8266 Wi-Fi模块连接手机APP,实现数据同步和远程控制。此外,RC522射频识别模块用于读取ID卡信息实现书籍查找功能,LD3320语音识别模块用于识别书籍名称指令,LU6288语音合成模块用于语音播报书籍位置。系统总体框架设计如图2-9所示。
系统中各个模块的功能如下:STM32单片机作为控制核心,负责所有数据的处理和指令的发出;
SR501人体红外模块检测书房内人员存在状态;光敏模块采集环境亮度值用于自动调光;称重模块检测座椅占用并计时久坐;
DHT11温湿度模块采集环境温湿度用于温度控制;烟雾传感器检测烟雾浓度用于火灾预警;
OLED显示屏本地显示所有环境参数和系统状态;按键用于模式切换和阈值设置;蜂鸣器用于久坐报警和烟雾报警;加热片和风扇用于温度调节;
USB灯条用于照明并支持PWM调光;
ESP8266 Wi-Fi模块实现与手机APP的双向通信;
RC522模块读取ID卡信息与书籍绑定;
LD3320识别语音指令查找书籍;
LU6288语音播报书籍位置。
写文章不是做PPT,这样一句话就是一段是什么意思呢?
系统软件采用模块化编程,各功能模块相互独立又协同工作,通过主程序循环调用各子程序实现完整功能。
2.4 本章小结
本章从系统需求分析入手,明确了智能书房系统需要实现的功能目标和设计要求。通过对比分析主控芯片、显示模块、温湿度传感器和通信模块的不同方案,确定了以STM32F103C8T6为核心、以OLED为显示、以DHT11为温湿度采集、以ESP8266为通信的方案。在此基础上设计了系统的总体架构,将系统划分为感知层、控制层和应用层三个层次,对各功能模块的组成和相互关系进行了说明。本章为后续的硬件电路设计和软件程序开发提供了总体指导。
3 系统硬件设计
3.1 主控电路设计
本文采用STM32F103C8T6作为主控芯片,该芯片基于ARM Cortex-M3内核,最高工作频率72MHz,内置64KB Flash和20KB SRAM,拥有37个通用I/O口和丰富的片上外设。STM32最小系统电路包括电源电路、时钟电路、复位电路和程序下载电路。电源电路通过USB接口输入5V电压,经AMS1117-3.3稳压芯片转换为3.3V为单片机供电,并在电源输入端并联多个滤波电容以提高电源稳定性。时钟电路由8MHz晶振和两个20pF电容组成,为单片机提供精确的系统时钟。复位电路采用按键复位方式,当按键按下时给NRST引脚一个低电平复位信号。程序下载电路采用SWD接口,使用PA13和PA14两个引脚连接SWDIO和SWCLK,支持程序下载和在线调试。STM32F103C8T6最小系统电路如图3-1所示。

图3-1 STM32F103C8T6最小系统电路图
3.2 显示电路设计
显示模块采用0.96寸OLED显示屏,分辨率为128×64,工作电压3.3V,支持I2C通信接口。I2C接口仅需两根信号线即可完成数据传输,简化了硬件连接。OLED显示屏的SCL时钟引脚连接至STM32的PA5,SDA数据引脚连接至PA6。PA5和PA6被配置为复用开漏输出模式,并在软件中使能内部上拉电阻,确保I2C通信的稳定性。OLED模块的VCC引脚接3.3V电源,GND引脚接地。由于I2C总线需要上拉电阻,虽然STM32内部可配置上拉,但为保证通信可靠性,在电路设计中外接了4.7kΩ上拉电阻分别连接至SCL和SDA线。OLED显示模块电路如图3-2所示。

图3-2 OLED显示模块电路图
3.3 输入电路设计
输入模块采用三个独立按键用于人机交互,按键KEY1连接至PB15,KEY2连接至PB14,KEY3连接至PB13。按键电路采用低电平有效设计,按键未按下时,通过内部上拉电阻使I/O口保持高电平;按键按下时,I/O口与地导通,读取到低电平信号。为消除按键机械抖动带来的误触发,在软件中加入了延时去抖处理,延时约10-20ms进行去抖处理。三个按键的功能分别为:KEY1用于切换屏幕显示界面,可在主界面、升温阈值设置界面和降温阈值设置界面之间循环切换;KEY2在界面切换时用于数值增加或模式切换;KEY3用于数值减少或手动亮度调节。按键输入电路如图3-3所示。

图3-3 按键输入电路图
3.4 人体感应电路设计
人体感应模块采用SR501热释电红外传感器,该模块基于红外线技术检测人体发射的红外辐射,能够有效感应移动的人体。SR501模块具有灵敏度调节和延时调节功能,输出为数字开关量。模块供电电压为5V,VCC接5V电源,GND接地,数字输出引脚DO连接至STM32的PB12。当检测到人体活动时,模块输出高电平;未检测到时输出低电平。由于SR501输出信号已经过内部处理,无需外部上拉电阻即可直接与单片机连接。单片机通过读取PB12引脚电平即可判断书房内是否有人。人体红外感应电路如图3-4所示。

图3-4 人体红外感应电路图
3.5 报警电路设计
报警模块采用无源蜂鸣器,型号为TMB12A05,工作电压5V,额定电流30mA。蜂鸣器控制电路使用NPN型S8050三极管驱动,因为单片机I/O口驱动能力有限,无法直接驱动蜂鸣器。三极管基极通过10kΩ限流电阻连接至STM32的PA11,发射极接地,集电极接蜂鸣器负极,蜂鸣器正极接5V电源。当PA11输出高电平时,三极管导通,蜂鸣器得电发声;PA11输出低电平时,三极管截止,蜂鸣器停止。蜂鸣器报警电路如图3-5所示。图片上是3.3V

图3-5 蜂鸣器报警电路图
3.6 照明控制电路设计
照明模块采用USB灯条作为执行器,通过PWM方式调节亮度以实现无级调光。PWM控制信号由STM32定时器的PWM输出模式产生,通过改变PWM占空比来调节灯条两端平均电压,从而实现亮度调节。USB灯条的正极接5V电源,负极通过MOS管或三极管开关电路接地,控制信号由PA0输出。由于PA0输出的是3.3V逻辑电平,而灯条工作电流较大,采用N沟道MOS管作为开关元件。PWM信号通过100Ω电阻连接至MOS管栅极,源极接地,漏极接灯条负极。PWM占空比越大,灯条亮度越高。照明控制电路如图3-6所示。

图3-6 照明控制电路图
3.7 无线通信电路设计
无线通信模块采用ESP8266 Wi-Fi模块,该模块支持802.11 b/g/n协议,内置TCP/IP协议栈,可通过串口AT指令进行配置和控制。ESP8266模块工作电压为3.3V,与STM32采用串口通信方式连接。模块的TXD引脚连接STM32的PA10即USART1的RX引脚,RXD引脚连接STM32的PA9即USART1的TX引脚,实现全双工通信。CH_PD使能引脚接3.3V保持模块工作,GPIO0和GPIO15分别通过电阻上拉和下拉配置为正常工作模式。模块连接家庭路由器后,可与手机APP采用TCP协议建立Socket连接,实现数据传输。Wi-Fi通信电路如图3-7所示。

图3-7 ESP8266 Wi-Fi模块电路图
3.8 射频识别电路设计
射频识别模块采用RC522芯片,该芯片工作频率13.56MHz,支持SPI通信接口。RC522模块与STM32的SPI接口连接:CS片选引脚接PB11,SCK时钟引脚接PB10,MOSI主机输出从机输入接PB1,MISO主机输入从机输出接PB0,RST复位引脚接PA7。SPI接口采用四线制连接,实现高速数据传输。模块供电电压为3.3V,VCC接3.3V电源,GND接地。RC522模块通过天线线圈与ID卡进行无线通信,读取卡内存储的唯一序列号。系统利用这一特性,将书籍名称和存放位置与ID卡号绑定,实现刷卡查询书籍位置的功能。RFID射频识别电路如图3-8所示。

图3-8 RC522射频识别模块电路图
3.9 称重检测电路设计
称重模块采用电阻应变式压力传感器,配合HX711模数转换芯片使用。称重传感器将重量变化转换为微弱的电压信号,HX711芯片对该信号进行放大和24位高精度模数转换,通过数字接口输出重量值。HX711与STM32采用自定义串行通信方式,仅需两个引脚即可完成数据读取:数据输出引脚DOUT连接至STM32的PA4,时钟引脚SCK由STM32控制。HX711工作电压为5V,供电稳定性和抗干扰能力直接影响测量精度,因此在电源引脚附近并联了10μF和0.1μF的滤波电容。称重检测电路如图3-9所示。

图3-9 称重检测模块电路图
HX711 单独能称重吗?不需要再搭配一个称重传感器吗?
3.10 语音识别电路设计
语音识别采用LD3320芯片,该芯片是一款非特定人语音识别专用芯片,无需训练即可识别用户设定的关键词。LD3320与STM32采用SPI接口通信:LD_IQR中断请求引脚接PB4,CS片选引脚接PB5,CLK时钟引脚接PB6,RST复位引脚接PB7,D0数据输出接PB8,DI数据输入接PB9。芯片内部集成了麦克风放大器、模数转换器和语音处理器,只需外接麦克风即可实现语音采集和识别。语音播报采用LU6288语音合成模块,通过串口2与STM32通信,接收文本指令后合成为语音输出。LU6288的TXD和RXD分别连接STM32的PA2和PA3****(你图上TX那个引脚没连吧?你的PA3后面用于烟雾了)****。语音识别与播报电路如图3-10所示。


图3-10 语音识别与播报模块电路图
3.11 烟雾检测电路设计
烟雾检测采用MQ-2烟雾传感器,该传感器对液化气、丙烷、氢气等可燃气体和烟雾有较高灵敏度。传感器内部为气敏材料,当接触到烟雾时电导率发生变化,通过外部电路可将这种变化转换为电压信号输出。MQ-2模块输出为模拟电压,连接至STM32的PA3,该引脚配置为ADC输入通道。ADC将0-3.3V的模拟电压转换为0-4095的数字量,再通过软件算法计算烟雾浓度值。传感器需要预热才能稳定工作,模块内置加热电路,工作电流较大,供电电压为5V。烟雾检测电路如图3-11所示。

图3-11 MQ-2烟雾传感器模块电路图
3.12 温度控制电路设计
温度控制执行器包括加热片和散热风扇,分别用于升温和降温。加热片控制引脚接PC15,通过继电器或MOS管驱动,当系统检测到温度低于设定阈值且书房有人时,PC15输出高电平接通加热片。散热风扇控制引脚接PC14,同样通过驱动电路控制,当温度高于设定阈值时,PC14输出高电平启动风扇。驱动电路采用NPN三极管加继电器的方式实现高低压隔离,确保单片机安全。继电器线圈两端并联续流二极管吸收反向电动势。温度控制电路如图3-12所示。

图3-12 温度控制执行器电路图
3.13 光照检测电路设计
光照检测采用光敏电阻模块,光敏电阻的阻值随光照强度变化而变化,光照越强阻值越小。模块内部将光敏电阻与固定电阻串联构成分压电路,中间节点输出电压随光照变化。该模拟电压信号连接至STM32的PA1,通过ADC转换得到数字量,再根据电压与亮度的关系计算光照强度值。光敏模块响应速度快,能够实时反映环境亮度的变化,为自动调光提供依据。光照检测电路如图3-13所示。

图3-13 光敏检测模块电路图
3.14 温湿度检测电路设计
温湿度检测采用DHT11数字温湿度传感器,该传感器采用单总线通信协议,仅需一个I/O引脚即可完成数据读写。DHT11的数据引脚连接至STM32的PC13,连接方式为开漏输出加上拉电阻。在空闲状态时,PC13通过上拉电阻保持高电平;通信时,单片机通过拉低总线发送起始信号,然后释放总线等待传感器响应。传感器返回40位数据,包括温度、湿度整数和小数部分以及校验和。为保证通信可靠,数据线对地并联一个0.1μF的滤波电容以减少干扰。温湿度检测电路如图3-14所示。

图3-14 DHT11温湿度传感器电路图
3.15 整体电路设计
将上述各功能模块电路与STM32最小系统进行整合,形成完整的智能书房系统硬件平台。系统电源由USB接口统一提供5V电压,经AMS1117-3.3转换为3.3V为单片机、OLED、RC522、ESP8266等3.3V器件供电,5V直接为蜂鸣器、MQ-2、DHT11、SR501等5V器件供电****(温湿度你图上是3.3V)**** 。所有传感器和执行器按照管脚分配表连接到STM32的对应I/O口,数字传感器直接连接,模拟传感器通过ADC通道连接,需要驱动的执行器通过三极管或MOS管间接连接。整体电路设计中考虑了电源滤波、信号隔离和抗干扰措施,在关键位置添加去耦电容,在长走线位置考虑阻抗匹配。系统电路板采用双层PCB设计,合理布局各模块位置,减少信号干扰。整体电路原理如图3-15所示。

图3-15 智能书房系统整体电路原理图
这个图可以不放这里,你不是放在附录了吗
3.16 本章小结
本章详细介绍了智能书房系统的硬件电路设计。从STM32最小系统电路开始,依次阐述了OLED显示电路、按键输入电路、人体红外感应电路、蜂鸣器报警电路、PWM照明控制电路、ESP8266 Wi-Fi通信电路、RC522射频识别电路、称重检测电路、LD3320语音识别电路、MQ-2烟雾检测电路、温度控制执行器电路、光敏检测电路和DHT11温湿度检测电路的设计原理和连接方式。每个模块都说明了与STM32的具体管脚连接关系,分析了电路的工作原理和设计考虑。通过各模块的整合,构建了完整的系统硬件平台,为后续软件设计和系统测试奠定了基础。
4 系统软件设计
在软件开发上,本系统采用Keil MDK作为编程环境,以C语言进行系统编程。利用STM32标准外设库对单片机底层硬件进行配置,通过模块化编程思想将各功能封装为独立的子程序。系统软件整体采用前后台架构,主程序作为后台任务循环执行各功能模块,定时器中断和外部中断作为前台任务处理实时性要求较高的事件。综合硬件设计与软件编程,本系统实现了环境参数实时监测、设备智能控制、书籍信息管理、远程通信交互等功能。为了完成上述功能,本文主要包含主程序设计、人体红外检测子程序、光照强度检测与调光子程序、****(合成一个)****温湿度检测与温度控制子程序、烟雾检测与报警子程序、座椅占用与久坐检测子程序、RFID射频识别子程序、语音识别与播报子程序、按键处理与屏幕显示子程序、Wi-Fi通信与APP交互子程序。
4.1 主程序设计
主程序首先完成系统初始化工作,包括:
(1)系统基础层初始化:包括延时函数初始化、串口1与串口2初始化,以及外部中断配置。加序号
环境感知层初始化:涵盖DHT11温湿度传感器初始化、采集初始化、RC522射频模块初始化。
交互显示层初始化:包括OLED显示屏初始化、LD3320语音识别芯片初始化、蜂鸣器报警模块初始化。
驱动控制层初始化:包括用于灯条PWM调光的定时器初始化、用户按键输入初始化。
初始化完成后进入主循环,在主循环中依次调用各功能子程序:获取光照强度值、读取温湿度数据、检测ID卡信息、获取烟雾浓度、检测称重数据、执行温度控制、执行照明控制、执行蜂鸣器控制、扫描按键状态、处理上位机指令、检测人体存在状态、处理语音识别、向APP上报状态、刷新屏幕显示。系统主循环设定了50毫秒的运行节拍。一方面,对于烟雾扩散、温湿度变化等宏观环境物理量,其状态改变相对缓慢,50毫秒的采样周期远高于此类物理量的实际变化速率,完全能够满足烟雾报警等安全功能的实时性需求;另一方面,对于按键输入、语音指令识别等对实时性要求极高的突发交互事件,系统并未采用主循环轮询,而是引入了硬件中断机制。中断处理独立于主循环延时之外,可实现微秒级的优先响应。这种"慢速轮询+快速中断"的调度策略,既保证了全系统多维度任务的实时响应,又有效避免了CPU因全速空跑而导致的无效功耗与资源占用过高问题。主程序流程图如图4-1所示。

图4-1 主程序流程图
流程图字太小,流程图与正文字体可以一致,字号可以小一号(后面所有流程图都是的)
主循环那个菱形框是什么意思?菱形框是判断,然后两个出,一个Y,一个N
在上面的流程图也没看到你说的" 慢速轮询+快速中断 ",你这么多矩形框就是这样顺序执行的?
4.2 人体感应检测子程序
人体感应检测子程序负责处理SR501红外传感器的输入信号。由于传感器输出为数字量,程序通过读取PB12引脚电平即可判断检测状态。为避免瞬间干扰导致的误判,程序采用连续多次采样加软件滤波的方式:连续读取10次引脚电平,如果高电平次数超过8次则认为检测到人体。考虑到人员可能短暂离开,程序设置了两个计数器变量,当检测到有人时sr501_state_1计数器累加,sr501_state_2清零;当检测到无人时sr501_state_1清零,sr501_state_2累加。只有sr501_state_1累积到设定值时才确认有人状态,只有sr501_state_2累积到设定值时才确认无人状态。这种滞回比较方式有效避免了人员短暂进出导致的频繁状态翻转。人体感应检测子程序流程图如图4-2所示。

图4-2 人体感应检测子程序流程图
结束也只是一个进
4.3 光照强度检测与调光子程序
光照强度检测通过ADC读取PA1引脚的模拟电压值,ADC配置为12位分辨率,转换结果范围为0-4095。程序调用Get_Adc_Average函数连续采样5次取平均值,将ADC值转换为对应的亮度百分比。为减小采样噪声,程序采用一阶低通滤波算法,通过实际测试调整获得最佳滤波效果,当前亮度值等于上次亮度值的60%加上本次采样值的40%,使亮度变化更加平滑。自动调光模式下,根据环境亮度计算目标PWM占空比,环境亮度低于85%时按比例计算亮度值,环境亮度高于85%时关闭照明。手动模式下,直接使用按键或APP设置的亮度值。PWM输出通过定时器2的通道1实现,调用LED_PWM_OUTPUT函数设置占空比。光照检测与调光子程序流程图如图4-3所示。

图4-3 光照检测与调光子程序流程图
你的调光的应该与人体检测相结合,首先有人,然后光太暗,然后调光。如果没人,哪怕光暗,也不需要调光。
菱形框是判断,你这里环境亮度,然后是、否,是什么意思呢?菱形框里写详细,你应该是判断环境亮度是否怎样,然后一边是,一边否。同样检测当前模式那个菱形框,应该也是个判断,比如是否是自动模式,然后一边是,一边否
然后前面说的与有人融合
4.4 温湿度检测与温度控制子程序
温湿度检测调用DHT11_Read_Data函数,该函数按照DHT11单总线协议发起通信,读取40位数据并进行校验。成功读取后,温度值和湿度值分别存储在全局变量temp和hum中。温度控制子程序首先判断当前工作模式,只有在自动模式下才进行控制。当温度低于升温阈值temp_low_thre时,开启加热片关闭风扇;当温度高于降温阈值temp_high_thre时,开启风扇关闭加热片;当温度在阈值范围内时,关闭所有温度调节设备。加热片控制引脚为PC15,风扇控制引脚为PC14,通过置位或清零对应I/O口实现控制。考虑到加热和制冷需要一定响应时间,控制逻辑中加入滞回区间防止设备频繁启停。温湿度检测与温度控制子程序流程图如图4-4所示。

图4-4 温湿度检测与温度控制子程序流程图
比较温度与阈值那个菱形框,菱形框只有两个出,一个是,一个否
你这里逻辑也有问题。比如你温度10度开加热片,然后高于20度开风扇,现在低于10度,你开了加热片,然后高于10度了,你就关了加热片,因为你正常范围是关加热片的。所以你是不是就会在10度这里不停开加热片,关加热片,因为温度在10度附近波动。
4.5 烟雾检测与报警子程序
烟雾检测通过ADC读取PA3引脚电压,MQ-2传感器输出电压与烟雾浓度成反比关系。程序读取ADC值后通过公式计算烟雾浓度PPM值,公式中考虑了传感器特性参数和分压电阻值。程序通过 12 位 ADC 模块采集传感器输出的模拟电压。计算出的烟雾浓度经过与光照相同的滤波处理,得到稳定的smoke值。当烟雾浓度超过设定阈值时,触发蜂鸣器报警并持续发声,同时将报警状态通过Wi-Fi上报至手机APP。为验证传感器工作状态,程序在每次检测后检查ADC值是否在合理范围内,如果长时间读取到异常值,则认为传感器故障并给出提示。烟雾检测与报警子程序流程图如图4-5所示。

图4-5 烟雾检测与报警子程序流程图
4.6 座椅占用与久坐检测子程序
称重检测通过HX711模块读取压力传感器数据,调用voltageToWeight函数将ADC值转换为重量值。程序设定2000克作为占用阈值,当检测重量大于阈值时认为座椅被占用,否则为空闲状态。占用状态下启动定时计数,计数器每30次循环约1.5秒累加一次,当计数达到30次对应约45分钟****(1.5s一次,30次是45s?)**** 时触发久坐报警标志。一旦检测到座椅空闲,立即清除计数器和报警标志。报警触发时蜂鸣器发声,同时通过串口2向语音模块发送播报指令,提醒用户起身活动。座椅占用检测采用滞回比较,占用阈值为2000克,释放阈值为1800克,该参数的选择基于以下两点工程与场景依据: (1)(有多余的空格,自己要仔细阅读全文) 滤除非人体物品的误判:日常书房场景中,用户常会将书包、几本厚重书籍或笔记本电脑随手放置于座椅上,此类常见物品的总重通常在 1.0kg 至 1.5kg 之间。将阈值设定为 2000g,可有效避免系统将重物误判为人员入座。 (2)适应人体姿态变化的重力转移:成年人的正常体重通常在 50kg 至 80kg 之间。2000g 的低阈值设计,确保了即使用户姿态发生大范围改变,重量也不会跌破阈值而引发人员离开的误报。 此外,1800g 与 2000g 之间构成了 200g 的滞回区间,有效消除了人体轻微晃动或起身瞬间重力骤变带来的临界状态频繁震荡问题。避免临界重量导致的频繁状态跳变。座椅占用与久坐检测子程序流程图如图4-6所示。

图4-6 座椅占用与久坐检测子程序流程图
计数器那个菱形框少个是
结束一个进
4.7 RFID射频识别子程序
RFID识别子程序通过RC522模块读取ID卡序列号。程序每隔一定时间调用RC522_Handel函数检测是否有卡靠近,检测到卡后读取4字节的唯一序列号。读取到的序列号与预先存储的书籍信息数组book_id_card_sn进行比对,如果匹配成功,则根据索引号从book_visit_pos数组中获取书籍存放位置,并拼接成语音播报字符串通过串口2发送给LU6288模块进行语音播报。上位机管理界面录入书籍信息时,程序接收来自串口1的数据,解析出书籍名称、位置信息和ID卡序列号,存入相应数组并将书籍名称添加到语音识别关键词列表中。RFID射频识别子程序流程图如图4-7所示。

图4-7 RFID射频识别子程序流程图
检测是否有卡的矩形框和检测到卡的菱形框,合并为一个菱形框
结束一个进
4.8 语音识别与播报子程序
语音识别子程序采用了基于有限状态机的非阻塞式处理逻辑,将 LD3320 的工作周期划分为四个核心状态:IDLE(空闲态):系统初始状态,LD3320 处于低功耗等待触发模式。ASR_RUNNING(识别态):当系统检测到触发信号(如环境音或特定按键)时,主控向 LD3320 发送开始识别指令,开启 ASR 引擎并进入中断监控。ASR_FOUND(匹配态):当用户语声与内置关键词匹配成功,LD3320 产生硬中断,状态机跳转至此,主控读取识别码。ACTION_FEEDBACK(反馈态):根据识别码执行相应控制动作,同时通过串口指令驱动 LU6288 模块同步进行语音播报反馈,完成后状态自动复位至 IDLE。通过此状态机模型,系统避免了传统程序中死等语音返回结果导致的 CPU 资源空耗,确保了在语音识别期间,环境监测、OLED 刷新等后台任务仍能保持约 20Hz 的更新频率,显著提升了系统的并发处理能力。初始状态为LD_ASR_NONE,表示没有进行识别。主循环中调用该子程序,当状态为LD_ASR_NONE时启动一次识别流程,调用RunASR函数初始化ASR并添加关键词语,然后启动ASR运算,状态转为LD_ASR_RUNING。当识别完成触发中断后,状态转为LD_ASR_FOUNDOK,此时调用LD_GetResult函数获取识别结果。识别结果对应预先设置的关键词编号,程序根据编号在书籍位置数组中查找对应信息,然后通过串口2发送语音播报指令。如果识别结果为CODE_DMCS、CODE_CSWB等预设值,分别对应不同书籍名称,播报相应位置信息。语音播报子程序流程图如图4-8所示。

图4-8 语音识别与播报子程序流程图
RFID和语音是你的重点,你RFID录入那么多书籍信息,是不是应该有数据库?那你就要写数据库的设计。数据库的设计就需要E-R图,E-R表,这些
语音方面,你上面的内容也都非常空,你又能识别又能播报,具体是怎么实现的?你能识别哪些话?你会播报什么内容?
4.9 按键处理与屏幕显示子程序
按键处理子程序通过KEY_Scan函数扫描三个按键的状态,返回按键值。程序采用有限状态机(FSM)方法处理用户按键输入。基于系统主循环50ms的执行周期,通过软件计数器 key_cnt 对按键按下时长进行累加判定。 具****(有多余的空格,自己要仔细阅读全文)****体逻辑设定为:若检测到低电平持续时间在 100ms至1000ms 之间(对应2至19次循环计数),判定为'短按',触发OLED显示页面的循环切换;若持续时间超过1000ms(1秒)(对应20次及以上循环计数),则判定为'长按',用于切换系统的自动/手动运行模式。 该设计利用软件计时代替了传统的死等延时,在实现精准功能区分的同时,有效滤除了机械按键的瞬时抖动干扰。KEY1用于切换屏幕显示界面,screen变量在0、1、2之间循环,分别对应主界面、升温阈值设置界面、降温阈值设置界面。KEY2和KEY3在不同界面下功能不同:主界面下,KEY2切换自动和手动模式,KEY3调节手动亮度;阈值设置界面下,KEY2增加阈值,KEY3减小阈值。屏幕显示子程序根据当前screen值选择显示内容,调用OLED_ShowChinese显示汉字,OLED_ShowString显示数字和字符。主界面显示温湿度、光照强度、烟雾浓度、人员状态和当前模式;阈值设置界面分别显示升温阈值和降温阈值。按键处理与屏幕显示子程序流程图如图4-9所示。

图4-9 按键处理与屏幕显示子程序流程图
检查当前界面那个矩形框,矩形框都是单进单出
4.10 Wi-Fi 通信与APP交互子程序
Wi-Fi通信通过串口1与ESP8266模块进行AT指令交互。系统启动时初始化串口1并向ESP8266发送配置指令,设置工作模式为Station,连接家庭路由器,建立TCP连接。主循环中每8次循环约400毫秒调用一次数据上报函数,将系统状态打包成JSON格式字符串发送至APP。系统通过 ESP8266 模块与手机端 APP 建立 TCP 长连接,并采用自定义的文本帧格式进行数据交互。数据包以字符'#'作为帧头,各项参数之间通过逗号分隔,末尾附加'r\n'作为结束标志。具体数据项及其物理单位说明如下:运行模式:状态量,0 代表手动模式,1 代表自动模式。光照强度:百分比值,单位为 %。烟雾浓度:浓度值,单位为 PPM(百万分比)。人员状态:状态量,1 代表检测到人员,0 代表无人。环境温度:摄氏度,单位为 ℃。环境湿度:相对湿度,单位为 %RH。升温与降温阈值:温度设定值,单位均为 ℃。这种基于 ASCII 字符串的协议格式具有良好的可读性,便于移动端 APP 进行解析与展示。APP下发的指令通过串口接收中断处理,在中断服务程序中接收完整数据帧后设置标志位,主循环中调用app_data_analyze函数解析指令。指令格式采用自定义协议,包括设备类型、指令类型和数据字段,解析后执行对应操作如设置阈值、切换模式、调节亮度等。Wi-Fi通信与APP交互子程序流程图如图4-10所示。

图4-10 Wi-Fi通信与APP交互子程序流程图
根据指令类型处理矩形框
这部分主要还是写的通信,还是缺APP的设计
4.11 本章小结
本章详细介绍了智能书房系统的软件设计。采用模块化编程思想,将系统功能划分为主程序和各功能子程序。主程序完成系统初始化和循环调用各子程序,实现了各模块的协同工作。人体红外检测子程序通过软件滤波和滞回比较准确判断人员存在状态。光照检测与调光子程序采用一阶低通滤波和PWM控制实现平滑调光。温湿度检测与温度控制子程序根据阈值自动控制加热和降温设备。烟雾检测与报警子程序实时监测烟雾浓度并在超标时报警。座椅占用与久坐检测子程序通过称重传感器和计时器实现久坐提醒功能。RFID识别子程序实现刷卡查询书籍位置。语音识别与播报子程序通过状态机管理识别流程,识别语音指令后播报书籍位置。按键处理与屏幕显示子程序实现人机交互和参数设置。Wi-Fi通信子程序实现与手机APP的数据交互和远程控制。通过各子程序的有机整合,构建了完整的系统软件架构。
5 系统测试与分析
5.1 系统整体测试
为验证基于STM32的智能书房系统在实际应用中的整体功能与运行稳定性,本文搭建了完整的软硬件测试平台,对系统进行全面的功能测试与性能评估。系统上电后,STM32主控芯片完成各外设初始化工作,SR501人体红外传感器、光敏传感器、称重传感器、DHT11温湿度传感器、MQ-2烟雾传感器开始正常工作,采集到的数据实时通过OLED显示屏进行本地展示。系统通过ESP8266 Wi-Fi模块连接至家庭路由器,与手机APP建立通信连接,用户可通过APP实时查看书房环境参数和设备运行状态。系统整体实物图如图5-1所示。

图5-1 系统整体实物图
不要放手机,把硬件电路放大一下
测试的结构再调整下,OLED、蜂鸣器等可以不要单独测试
传感器测试与执行也可以一起测试
每个模块的测试,要有图片,看得清楚你测得的结果,而不是只列一个表
图片的内容也要用文字描述
5.2 传感器模块功能测试
5.2.1 人体红外感应模块测试
人体红外感应模块测试主要验证SR501传感器对人员进入和离开书房的检测能力。测试方法为:系统正常运行后,测试人员依次执行进入书房、在书房内静坐、离开书房等动作,观察OLED屏幕和手机APP上人员状态的显示变化。测试结果如表5-1所示。
表5-1 人体红外感应模块测试表
|------|-----------|---------|------|----|
| 测试序号 | 测试动作 | 预期结果 | 实际结果 | 结论 |
| 1 | 进入书房检测范围 | 状态显示为有人 | 显示有人 | 通过 |
| 2 | 在书房内静坐2分钟 | 保持有人状态 | 保持有人 | 通过 |
| 3 | 离开书房 | 状态变为无人 | 显示无人 | 通过 |
| 4 | 快速进出 | 状态变化正常 | 状态正常 | 通过 |
测试结果表明,SR501人体红外感应模块能够准确检测人员存在状态,响应及时,满足系统设计要求。
人体红外与光敏与调光一起测试,应该有个OLED的图,看到你现在有没有人,光强怎么样,然后是怎么控制的
图片的内容也要用文字描述,比如图片上现在光照是多少,文字里也要有描述,要一致
5.2.2 温湿度传感器模块测试
温湿度传感器模块测试主要验证DHT11传感器采集温度和湿度的准确性。测试方法为:将DHT11传感器与标准温湿度计放置在相同环境中,同时记录两者读数,对比误差值。测试结果如表5-2所示。
表5-2 温湿度传感器模块测试表
|------|-------|-------|------|-------|-------|-----|
| 测试序号 | 标准温度℃ | 测量温度℃ | 误差℃ | 标准湿度% | 测量湿度% | 误差% |
| 1 | 22.5 | 23 | +0.5 | 55 | 54 | -1 |
| 2 | 25.0 | 25 | 0 | 60 | 62 | +2 |
| 3 | 27.5 | 27 | -0.5 | 65 | 66 | +1 |
| 4 | 30.0 | 31 | +1.0 | 70 | 68 | -2 |
测试结果表明,DHT11传感器温度测量误差在±1℃范围内,湿度测量误差在±3%范围内,符合DHT11技术规格,满足书房环境监测需求。
温湿度的测试也该有个OLED图。
还有你标准温度是哪来的?你只知道现在的测量温湿度,如何知道现在的标准温湿度?
5.2.3 烟雾传感器模块测试
烟雾传感器模块测试主要验证MQ-2传感器对烟雾浓度的检测和报警功能。测试方法为:在传感器附近产生少量烟雾(是如何产生的 ),观察ADC采样值变化和报警触发情况。测试结果如表5-3所示。
表5-3 烟雾传感器模块测试表
|------|--------|--------|--------|----|
| 测试序号 | 测试条件 | ADC采样值 | 是否触发报警 | 结论 |
| 1 | 无烟雾环境 | 890 | 否 | 正常 |
| 2 | 轻微烟雾 | 650 | 否 | 正常 |
| 3 | 中等浓度烟雾 | 420 | 是 | 通过 |
| 4 | 高浓度烟雾 | 210 | 是 | 通过 |
测试结果表明,MQ-2传感器能够有效检测烟雾浓度变化,当浓度超过设定阈值时准确触发报警,灵敏度可调,满足书房安全监测需求。
OLED图
5.2.4 称重传感器模块测试
称重传感器模块测试主要验证压力传感器对座椅占用的检测准确性和久坐计时的可靠性。测试方法为:人员入座触发计时,保持在位状态直至系统报警;随后起立释放压力,观察报警是否解除及计时器是否重置。测试结果如表5-4所示。
表5-4 称重传感器模块测试表
|------|----------|------|-------|------|
| 测试动作 | 实际重量/状态 | 逻辑判定 | 响应结果 | 计时状态 |
| 放置书包 | 1250g | 无人 | 无报警 | 停止 |
| 人员入座 | 62000g | 有人 | 开启计时 | 运行中 |
| 保持在位 | 45 分钟 | 达到阈值 | 蜂鸣器报警 | 触发 |
| 起身离开 | < 1800g | 无人 | 报警解除 | 重置 |
实验结果表明,称重传感器能准确识别 200g 的滞回区间,有效滤除了书包等轻量物品的误触发。 在计时准确性方面,系统设定久坐阈值为 45分钟。由于系统主循环节拍为 50ms,软件计数器设定值为 54,000(2700s \0.05s = 54,000)。实测显示,系统在入座 2700 秒后准时触发蜂鸣器报警,满足久坐健康提醒的设计需求。
如何测试的?直接放在 HX711 上?是输出什么结果?
5.3 执行器控制功能测试
5.3.1 照明控制模块测试
照明控制模块测试主要验证自动调光和手动调光功能。测试方法为:在自动模式下改变环境光照,观察USB灯条亮度变化;在手动模式下通过按键和APP调节亮度,观察响应情况。测试结果如表5-5所示。
表5-5 照明控制模块测试表
|------|------|--------|--------|------|----|
| 测试序号 | 测试项目 | 操作方式 | 预期结果 | 实际结果 | 结论 |
| 1 | 自动调光 | 遮住光敏电阻 | 亮度增加 | 亮度增加 | 通过 |
| 2 | 自动调光 | 强光照射光敏 | 亮度减小 | 亮度减小 | 通过 |
| 3 | 手动调光 | 按键调节 | 亮度步进变化 | 亮度变化 | 通过 |
| 4 | 远程调光 | APP调节 | 亮度变化 | 亮度变化 | 通过 |
测试结果表明,照明控制模块响应灵敏,自动调光逻辑正确,手动和远程调节功能正常。光照检测与调光测试图如图5-2所示。
图5-2 光照检测与调光测试图
5.3.2 温度控制模块测试
温度控制模块测试主要验证加热片和风扇的自动控制功能。测试方法为:设置升温阈值15℃,降温阈值30℃,改变环境温度观察执行器动作。测试结果如表5-6所示。
图片
表5-6 温度控制模块测试表
|------|--------|-------|-------|----|
| 测试序号 | 当前温度℃ | 预期动作 | 实际动作 | 结论 |
| 1 | 14 | 开启加热片 | 加热片开启 | 通过 |
| 2 | 22 | 关闭所有 | 无动作 | 通过 |
| 3 | 32 | 开启风扇 | 风扇开启 | 通过 |
| 4 | 28降至15 | 关闭风扇 | 风扇关闭 | 通过 |
测试结果表明,温度控制模块能够准确根据当前温度与阈值的比较结果控制加热片和风扇,动作可靠,满足环境调节需求。温度控制测试图如图5-3所示。

图5-3 温度控制测试图
对于执行模块的测试,比如你要验证风扇开,要温度达30度,但是现在实测温度达不到,你就把你阈值调低,比如20就开风扇,测试风扇开。图片应该能清楚的看到现在测得的温度高于20,然后你风扇开了
5.3.3 蜂鸣器报警模块测试 (也是融合在其他的模块检测)
蜂鸣器报警模块测试主要验证烟雾报警和久坐报警功能。测试方法为:分别触发烟雾超标和久坐计时完成,观察蜂鸣器发声情况。测试结果如表5-7所示。
表5-7 蜂鸣器报警模块测试表
|------|------|----------|------|------|----|
| 测试序号 | 报警类型 | 触发方式 | 预期结果 | 实际结果 | 结论 |
| 1 | 烟雾报警 | 产生烟雾 | 蜂鸣器响 | 蜂鸣器响 | 通过 |
| 2 | 久坐报警 | 座椅占用45分钟 | 蜂鸣器响 | 蜂鸣器响 | 通过 |
| 3 | 报警解除 | 烟雾消散 | 蜂鸣器停 | 蜂鸣器停 | 通过 |
| 4 | 报警解除 | 人员离开座椅 | 蜂鸣器停 | 蜂鸣器停 | 通过 |
测试结果表明,蜂鸣器报警模块能够在预设条件下准确触发,报警音清晰可辨,报警解除后能够及时停止,满足警示需求。蜂鸣器报警测试图如图5-4所示。

图5-4 蜂鸣器报警测试图
5.4 交互功能测试
5.4.1 OLED显示模块测试 (可以不单独写,其他模块的测试也都能看到OLED的结果)
OLED显示模块测试主要验证屏幕显示内容的完整性和准确性。测试方法为:系统运行时观察OLED屏幕是否能够正确显示温湿度、光照强度、烟雾浓度、人员状态和当前模式等信息。测试结果如表5-8所示。
表5-8 OLED显示模块测试表
|------|--------|-----------------|------|----|
| 测试序号 | 显示界面 | 显示内容 | 显示效果 | 结论 |
| 1 | 主界面 | 温湿度、光照、烟雾、人员、模式 | 清晰完整 | 通过 |
| 2 | 升温阈值界面 | 升温阈值 | 清晰完整 | 通过 |
| 3 | 降温阈值界面 | 降温阈值 | 清晰完整 | 通过 |
| 4 | 参数更新 | 数值变化 | 实时更新 | 通过 |
测试结果表明,OLED显示模块显示清晰,信息完整,能够实时反映系统状态变化。OLED显示测试图如图5-5所示。

图5-5 OLED显示测试图
5.4.2 按键交互模块测试
按键交互模块测试主要验证三个按键的功能实现情况。测试方法为:在不同界面下操作按键,观察屏幕响应和系统状态变化。测试结果如表5-9所示。
表5-9 按键交互模块测试表
|------|------|------|---------|------|----|
| 测试序号 | 按键 | 操作场景 | 预期功能 | 实际结果 | 结论 |
| 1 | KEY1 | 主界面 | 切换至升温界面 | 切换成功 | 通过 |
| 2 | KEY1 | 升温界面 | 切换至降温界面 | 切换成功 | 通过 |
| 3 | KEY2 | 主界面 | 切换模式 | 模式切换 | 通过 |
| 4 | KEY2 | 升温界面 | 增加阈值 | 数值增加 | 通过 |
| 5 | KEY3 | 主界面 | 调节亮度 | 亮度变化 | 通过 |
| 6 | KEY3 | 降温界面 | 减小阈值 | 数值减小 | 通过 |
测试结果表明,按键交互模块各按键功能正常,响应准确,能够满足本地操作需求。
5.4.3 Wi-Fi 通信模块测试
Wi-Fi通信模块测试主要验证系统与手机APP的数据交互功能。测试方法为:手机APP连接系统后,观察APP显示数据与本地数据的一致性,并通过APP发送控制指令。测试结果如表5-10所示。
表5-10 Wi-Fi通信模块测试表
|------|------|-----------|---------|--------|----|
| 测试序号 | 测试项目 | 操作方式 | 预期结果 | 实际结果 | 结论 |
| 1 | 数据上报 | 系统运行 | APP显示正确 | 数据显示一致 | 通过 |
| 2 | 阈值设置 | APP设置温度阈值 | 系统阈值更新 | 阈值更新 | 通过 |
| 3 | 模式切换 | APP切换模式 | 系统模式改变 | 模式改变 | 通过 |
| 4 | 亮度调节 | APP调节亮度 | 灯条亮度改变 | 亮度改变 | 通过 |
测试结果表明,Wi-Fi通信模块工作稳定,数据传输准确,远程控制功能正常。手机APP界面图如图5-6所示。
图5-6 手机APP界面图

APP上应该有值,可以同时放一个OLED图,能够看出是一致的
5.4.4 RFID识别与语音模块测试
这部分应该是你的重点,应该有个数据库的表,都录入了哪些书
然后语音,具体你说的什么,还有具体的会播报什么。
RFID识别与语音模块测试主要验证刷卡查询书籍位置和语音识别播报功能。测试方法为:预先录入书籍信息,分别通过刷卡和语音指令查询书籍位置,观察语音播报内容。测试结果如表5-11所示。
表5-11 RFID识别与语音模块测试表
|------|------|---------|--------|------|----|
| 测试序号 | 查询方式 | 操作内容 | 预期结果 | 实际结果 | 结论 |
| 1 | 刷卡 | 刷已录入ID卡 | 播报书籍位置 | 正确播报 | 通过 |
| 2 | 刷卡 | 刷未录入卡 | 无播报 | 无播报 | 通过 |
| 3 | 语音 | 说出书籍名称 | 播报书籍位置 | 正确播报 | 通过 |
| 4 | 语音 | 说出未录入名称 | 无播报 | 无播报 | 通过 |
测试结果表明,RFID识别模块能够准确读取ID卡信息并与已录入数据匹配,语音识别模块能够识别预设书籍名称,语音播报清晰准确,满足书籍查找需求。RFID与语音测试图如图5-7所示。

图5-7 RFID与语音测试图
5.5 系统稳定性测试
系统稳定性测试主要验证系统长时间运行的可靠性和数据采集的稳定性。测试方法为:让系统连续运行72小时,每隔1小时记录一次各项参数,观察数据是否有异常跳变或通信中断情况。测试结果如表5-12所示。
表5-12 系统稳定性测试表
|---------|------|--------|--------|--------|----|
| 测试时段 | 运行时长 | 数据异常次数 | 通信中断次数 | 系统重启次数 | 结论 |
| 0-24小时 | 24小时 | 0 | 0 | 0 | 稳定 |
| 24-48小时 | 48小时 | 1 | 0 | 0 | 稳定 |
| 48-72小时 | 72小时 | 0 | 0 | 0 | 稳定 |
测试结果表明,系统在72小时连续运行过程中,各项功能保持正常,数据采集稳定,未出现死机或通信中断现象,具有良好的稳定性。
5.6 本章小结
本章对智能书房系统进行了全面的功能测试和性能评估。通过对人体红外感应模块、温湿度传感器模块、烟雾传感器模块、称重传感器模块的测试,验证了各传感器采集数据的准确性和响应及时性。对照明控制模块、温度控制模块、蜂鸣器报警模块的测试,验证了各执行器控制的可靠性。对OLED显示模块、按键交互模块、Wi-Fi通信模块、RFID识别与语音模块的测试,验证了人机交互功能的完整性和便利性。最后通过72小时连续运行测试,验证了系统的长期稳定性。测试结果表明,本文达到了预期的功能目标,各模块协同工作良好,能够满足智能书房的各项需求。
结 论
本文基于STM32单片机设计并实现了一套智能书房系统,针对传统书房在环境调节不智能、书籍查找困难、久坐健康问题等方面的不足,提出了集环境监测、自动控制、书籍管理和健康提醒于一体的解决方案。经过系统的硬件设计、软件开发和测试验证,主要完成了以下工作:以STM32F103C8T6为核心控制器,设计了包括SR501人体红外传感器、光敏传感器、称重传感器、DHT11温湿度传感器、MQ-2烟雾传感器、RC522射频模块、LD3320语音识别模块、LU6288语音播报模块、ESP8266 Wi-Fi模块和OLED显示屏在内的硬件电路;采用模块化编程思想,开发了主程序及各功能子程序,实现了人员检测、亮度调节、温湿度控制、久坐报警、烟雾监测、书籍查找、语音交互和远程控制等功能;搭建了完整的测试平台,对各功能模块进行了详细的测试验证,结果表明系统运行稳定,响应准确,各项指标满足设计要求。
本文实现了预期的全部功能目标,具有以下特点和优势:多传感器融合实现环境全面感知,能够实时监测光照、温湿度、烟雾、人员状态和座椅占用情况;智能控制算法实现设备自动调节,根据环境参数自动控制照明、加热和降温设备,保持书房环境舒适;RFID和语音技术实现书籍智能管理,刷卡或语音即可查询书籍位置,解决书籍查找难题;Wi-Fi通信实现远程监控,用户可通过手机APP随时了解书房状态并进行远程控制;久坐提醒功能关注用户健康,培养良好使用习惯。系统具有集成度高、功能全面、操作简便、扩展性强等特点。
尽管本文实现了智能书房系统的基本功能,但在研究和实验过程中也发现了一些可以改进和完善的方面。未来的工作可以从以下几个方向展开:一是引入更精确的传感器,如采用SHT30替代DHT11提高温湿度测量精度,采用激光PM2.5传感器增强空气质量监测能力;二是增加更多环境控制设备,如智能窗帘、空气净化器等,实现更全面的环境调节;三是优化控制算法,引入模糊控制或PID控制,使环境调节更加平滑和节能;四是增强数据分析功能,记录用户使用习惯,学习用户偏好,实现更加个性化的智能控制;五是提升语音交互的自然度,增加更多语音指令和反馈内容,改善用户体验;六是扩展物联网平台接入,支持更多第三方平台如阿里云、腾讯云等,实现数据共享和设备联动。通过这些改进,可以进一步提升智能书房系统的智能化水平和用户体验,使其更好地服务于用户的学习和工作。
参考文献
1 黄婷,王若妤,谢治军,等. 基于STM32的自适应智能书房环境控制系统设计与实现J.科技与创新,2025,(20):12-15.
2 潘亚宾. 一款物联网智能台灯的设计与实现J.科技创新与应用,2025,15(15):125-128.
3 李齐新. 基于智能控制的多功能台灯设计与实现J.中国照明电器,2024,(08):77-79.
4 何逸竹.用户体验视角下的智慧书房服务效果提升研究D.南京农业大学,2023.
5 谢福,王振省,李俊,等. 基于STM32单片机的智能书桌设计与实现J.电子产品世界,2022,29(01):82-85.
6张细呈. 大概念统领下的高中信息技术单元教学实践探究------以"信息系统搭建"单元为例J.教育与装备研究,2024,40(08):10-14.
7张皓月,李紫云,徐韬茗. 一种基于OpenPose的坐姿提醒智能书桌设计研究J.科技与创新,2024,(13):59-61+64.DOI:10.15913/j.cnki.kjycx.2024.13.014.
8何逸竹.用户体验视角下的智慧书房服务效果提升研究D.南京农业大学,2023.DOI:10.27244/d.cnki.gnjnu.2023.002482.
9李博,刘云连,魏安敏,等. 一种智能儿童书桌设计J.电脑知识与技术,2022,18(23):97-98+110.DOI:10.14004/j.cnki.ckt.2022.1590.
10谢福,王振省,李俊,等. 基于STM32单片机的智能书桌设计与实现J.电子产品世界,2022,29(01):82-85.
11汪金龙,姚召辉. 基于人体健康监测的智能书桌设计研究J.装备制造技术,2021,(12):121-123+143.
12汤洁,储蕾芳. 儿童智能书桌研究设计J.设计,2020,33(21):11-13.
9杜伟,谭等泰,冯伟,等. 基于人体健康监测的智能书桌设计与研究J.甘肃科技,2020,36(02):11-15.
13 杜伟,谭等泰,冯伟,等. 基于人体健康监测的智能书桌设计与研究J.甘肃科技,2020,36(02):11-15.
14 Maryam P ,Jahed D A ,Salih A M , et al. Tensile strength prediction of rock material using non-destructive tests: A comparative intelligent studyJ.Transportation Geotechnics,2021,31.
参考文献少,至少15篇,英文文献少
致 谢
本论文的选题、设计、实现到最终定稿,自始至终都得到了丁红霞老师的悉心指导和热情帮助。老师严谨的治学态度、渊博的专业知识、精益求精的工作作风深深地感染和激励着我。从课题的选择到项目的最终完成,老师都始终给予我悉心的指导和不懈的支持,在此谨向老师致以诚挚的谢意和崇高的敬意。
感谢四年来教授我专业知识的各位老师,正是他们的辛勤教导,使我掌握了扎实的专业理论基础,为本次毕业设计打下了良好的基础。感谢实验室的同学们在设计和调试过程中给予的帮助和支持,与他们的讨论和交流使我受益匪浅。感谢参考文献中的各位学者,他们的研究成果为本文提供了重要的参考和启发。
感谢我的家人和朋友,在毕业设计期间给予我生活上的关心和精神上的鼓励,使我能够全身心投入到设计工作中。最后,感谢所有关心和帮助过我的人,谢谢你们。
附录A 电路原理图

附录B 程序代码
#include "stm32f10x.h"
#include "delay.h"
#include "Reg_RW.h"
#include "LDChip.h"
#include "usart.h"
#include "rc522.h"
#include "adc.h"
#include "dht11.h"
#include "oled.h"
#include "sr501.h"
#include "key.h"
#include "beep.h"
#include "timer.h"
#include "weigh.h"
#include "math.h"
#include "string.h"
#include <stdio.h>
#include <string.h>
#define DATE_A 20 //数组二维数值
#define DATE_B 90 //数组一维数值
/*添加关键词,用户修改*/
u8 User_sRecogDATE_ADATE_B = {
"xiao zhi",\
};
/* 储存数组是否为空标志位 */
uint8_t is_emptyDATE_A = {1};
/* 储存数据对应ID卡的SN号 */
int book_id_card_snDATE_A4;
/* 储存数据对应ID卡的SN号 */
int book_visit_posDATE_A2;
/* 储存用户录入的书籍名称数量 */
uint8_t user_command_word_num = 1;
uint16_t light;
uint8_t led_brightness,led_manual;
uint8_t temp,hum;
uint8_t temp_low_thre = 15,temp_high_thre = 30;
uint16_t smoke,smoke_thre = 2000;
uint16_t window_state = 0;
int mode = 0;
uint8_t screen = 0;
uint8_t atuo_state = 0;
uint32_t sr501_state_1,sr501_state_2;
uint8_t is_have_people = 0;
uint8_t heat_state,fans_state;
uint8_t is_need_send;
uint8_t sedentariness_alarm;
uint8_t is_it_occupied;
float weight;
u8 nAsrStatus=0;
u8 nAsrRes=0;
u8 flag=0;
uint8_t sn4;
uint8_t requst_id_card_sn_ack = 0;
void Sys_State_Display(void);
void Speech_Recognition(void);
void User_Modification(u8 dat);
void Atuo_Mode_Ctrl(void);
void Sys_State_Report(void);
float Smog_GetPPM(float vol);
void ID_Card_Check(void);
void Monitor_Platform_Ack(void);
void Check_Is_Have_People(void);
void Get_Light_Intensity(void);
void Get_Smoke(void);
void Key_State_Scanf(void);
void Temp_Ctrl(void);
void Led_Ctrl(void);
void Beep_Ctrl(void);
void weight_check(void);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init();
uart_init(115200);
uart2_init(9600);
OLED_Init();
DHT11_Init();
Adc_Init();
KEY_Init();
BEEP_Init();
RC522_Init();
TIM2_PWM_Init();
LD3320_Init();
EXTIX_Init();
LD_Reset();
nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR
SCS=0;
delay_ms(500);
memset(book_id_card_sn,0,sizeof(book_id_card_sn));
memset(book_visit_pos,0,sizeof(book_visit_pos));
while(1)
{
/* 获取光照强度 */
Get_Light_Intensity();
/* 获取温湿度 */
DHT11_Read_Data(&temp,&hum);
ID_Card_Check();
/* 检测环境烟雾浓度 */
Get_Smoke();
/* 获取重量,判断是否长时间在座椅上 */
weight_check();
/* 环境温度控制 */
Temp_Ctrl();
/* 环境亮度控制 */
Led_Ctrl();
/* 蜂鸣器控制 */
Beep_Ctrl();
/* 扫描按键状态 */
Key_State_Scanf();
Monitor_Platform_Ack();
/* 检测是否有人 */
Check_Is_Have_People();
/* 检测是否识别到语音指令 */
Speech_Recognition();
/* 将系统状态同步到APP */
Sys_State_Report();
/* 屏幕显示系统状态 */
Sys_State_Display();
delay_ms(50);
}
}
void ID_Card_Check(void)
{
static uint8_t cnt = 0;
uint8_t index;
char voice_buff100;
cnt++;
if(cnt >= 10)
{
cnt = 0;
if(RC522_Handel(sn) == MI_OK)
{
for(index = 0;index <= user_command_word_num;index++)
{
if(book_id_card_snindex0 == sn0 && book_id_card_snindex1 == sn1 &&
book_id_card_snindex2 == sn2)// && book_id_card_snindex3 == sn3)
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_posindex0,book_visit_posindex1);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
}
}
}
}
}
/* 接收APP下发的指令 */
void app_data_analyze(uint8_t *buff)
{
uint8_t index;
char user_str200;
int device_type,order_type;
char book_name100;
int book_pos2;
int id_card_sn4;
int temp_thre2;
int led_light;
if(sscanf((char *)buff,"{%d,%d,%50\^}}",&device_type,&order_type,user_str) != 3)
return;
if(device_type != 2)
return;
switch(order_type)
{
/* 上位机请求卡号 */
case 1:
{
requst_id_card_sn_ack = 1;
break;
}
/* 上位机发送录入数据的指令*/
case 2:
{
/* 解析出书名和位置 */
sscanf(user_str,"%90\^,,%d,%d,%d:%d:%d:%d",book_name,&book_pos0,&book_pos1,&id_card_sn0,&id_card_sn1,&id_card_sn2,&id_card_sn3);
/*添加关键词,用户修改*/
for(index = 0;index < DATE_A;index++)
{
if(is_emptyindex == 0)
{
is_emptyindex = 1; //储存标志位写1
memcpy(User_sRecoguser_command_word_num,book_name,strlen(book_name)); //保存书籍名称
memcpy(book_id_card_snuser_command_word_num,id_card_sn,sizeof(id_card_sn)); //保存书籍对应的ID
memcpy(book_visit_posuser_command_word_num,book_pos,sizeof(book_pos)); //保存书籍位置
user_command_word_num += 1;
BEEP = 1;
delay_ms(100);
BEEP = 0;
break;
}
}
/* 启动识别 */
nAsrStatus = LD_ASR_NONE;
break;
}
/* 设置温度阈值 */
case 3:
{
sscanf(user_str,"%d,%d",&temp_thre0,&temp_thre1);
temp_low_thre = temp_thre0;
temp_high_thre = temp_thre1;
is_need_send = 1;
break;
}
/* 设置模式 */
case 4:
{
sscanf(user_str,"%d",&mode);
if(mode == 0)
{
heat_state = 0;
fans_state = 0;
led_manual = 0;
}
is_need_send = 1;
break;
}
/* 设置灯光亮度 */
case 5:
{
sscanf(user_str,"%d",&led_light);
led_manual = led_light;
break;
}
}
}
void User_Modification(u8 dat)
{
char voice_buff100;
switch(nAsrRes)
{
case CODE_DMCS:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos10,book_visit_pos11);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_CSWB:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos20,book_visit_pos21);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_1KL1:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos30,book_visit_pos31);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_1KL2:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos40,book_visit_pos41);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_1KL3:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos50,book_visit_pos51);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_1KL4:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos60,book_visit_pos61);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_2KL1:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos70,book_visit_pos71);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_2KL2:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos80,book_visit_pos81);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_2KL3:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos90,book_visit_pos91);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_2KL4:
{
sprintf(voice_buff,"<G>书籍在第%d排第%d列",book_visit_pos100,book_visit_pos101);
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
break;
}
case CODE_3KL1:
{
break;
}
case CODE_3KL2:
{
break;
}
case CODE_3KL3:
{
break;
}
case CODE_3KL4:
{
break;
}
default:break;
}
}
void Monitor_Platform_Ack(void)
{
char buff50;
if(requst_id_card_sn_ack)
{
requst_id_card_sn_ack = 0;
delay_ms(200);
if(RC522_Handel(sn) == MI_OK)
{
sprintf(buff,"{1,1,%d:%d:%d:%d}",sn0,sn1,sn2,sn3);
usart_send_buff((uint8_t *)buff,strlen((const char *)buff));
}
RC522_Handel(sn);
}
}
void Speech_Recognition(void)
{
switch(nAsrStatus)
{
case LD_ASR_RUNING:
case LD_ASR_ERROR:
break;
case LD_ASR_NONE:
{
nAsrStatus=LD_ASR_RUNING;
if (RunASR()==0) /* 启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算*/
{
nAsrStatus = LD_ASR_ERROR;
}
break;
}
case LD_ASR_FOUNDOK: /* 一次ASR识别流程结束,去取ASR识别结果*/
{
nAsrRes = LD_GetResult(); /*获取结果*/
User_Modification(nAsrRes);
nAsrStatus = LD_ASR_NONE;
break;
}
case LD_ASR_FOUNDZERO:
default:
{
nAsrStatus = LD_ASR_NONE;
break;
}
}
}
/* 数据组包发送到APP */
void Sys_State_Report(void)
{
static uint8_t cnt = 0;
static char send_buff100;
cnt++;
if(cnt >= 8 || is_need_send)
{
cnt = 0;
is_need_send = 0;
sprintf(send_buff,"{1,2,%d,%d,%d,%d,%d,%d,%d,%d,}",mode,(int)light,(int)smoke,is_have_people,temp,temp_low_thre,temp_high_thre,hum);
usart_send_buff((uint8_t *)send_buff,strlen(send_buff));
}
}
void Sys_State_Display(void)
{
char txt20;
OLED_Clear();
if(screen == 0)
{
/* 温湿度 */
OLED_ShowChinese(0,0,0,16,1);OLED_ShowChinese(16,0,1,16,1);OLED_ShowChinese(32,0,2,16,1);
sprintf(txt,":%02d'C %02d%%",temp,hum);
OLED_ShowString(48,0,(uint8_t *)txt,16,1);
/* 环境亮度 */
OLED_ShowChinese(0,16,3,16,1);OLED_ShowChinese(16,16,4,16,1);OLED_ShowChinese(32,16,5,16,1);OLED_ShowChinese(48,16,6,16,1);
sprintf(txt,":%d%%",(int)light);
OLED_ShowString(64,16,(uint8_t *)txt,16,1);
/* 烟雾浓度 */
OLED_ShowChinese(0,32,7,16,1);OLED_ShowChinese(16,32,8,16,1);OLED_ShowChinese(32,32,9,16,1);OLED_ShowChinese(48,32,10,16,1);
sprintf(txt,":%dPPM",(int)smoke);
OLED_ShowString(64,32,(uint8_t *)txt,16,1);
/* 是否有人 */
if(is_have_people)
{
OLED_ShowChinese(0,48,13,16,1);OLED_ShowChinese(16,48,14,16,1);
}
else
{
OLED_ShowChinese(0,48,15,16,1);OLED_ShowChinese(16,48,16,16,1);
}
/* 当前模式 */
if(mode == 1)
{
/* 自动 */
OLED_ShowChinese(96,48,19,16,1);OLED_ShowChinese(112,48,20,16,1);
}
else
{
/* 手动 */
OLED_ShowChinese(96,48,17,16,1);OLED_ShowChinese(112,48,18,16,1);
}
}
else if(screen == 1)
{
/* 升温阈值 */
OLED_ShowChinese(32,0,21,16,1);OLED_ShowChinese(48,0,22,16,1);OLED_ShowChinese(64,0,25,16,1);OLED_ShowChinese(80,0,26,16,1);
OLED_ShowChinese(0,16,25,16,1);OLED_ShowChinese(16,16,26,16,1);
sprintf(txt,":%d'C",temp_low_thre);
OLED_ShowString(32,16,(uint8_t *)txt,16,1);
}
else if(screen == 2)
{
/* 降温阈值 */
OLED_ShowChinese(32,0,23,16,1);OLED_ShowChinese(48,0,24,16,1);OLED_ShowChinese(64,0,25,16,1);OLED_ShowChinese(80,0,26,16,1);
OLED_ShowChinese(0,16,25,16,1);OLED_ShowChinese(16,16,26,16,1);
sprintf(txt,":%d'C",temp_high_thre);
OLED_ShowString(32,16,(uint8_t *)txt,16,1);
}
OLED_Refresh();
}
void Key_State_Scanf(void)
{
/* 扫描按键 */
switch(KEY_Scan(0))
{
case 1:
{
screen += 1;
if(screen > 2) screen = 0;
break;
}
case 2:
{
if(screen == 0)
{
mode = !mode;
heat_state = 0;
fans_state = 0;
led_manual = 0;
}
else if(screen == 1)
temp_low_thre += 1;
else if(screen == 2)
temp_high_thre += 1;
break;
}
case 3:
{
if(screen == 0)
{
led_manual += 34;
led_manual = led_manual + 1 - led_manual / 34;
if(led_manual > 100)
led_manual = 0;
}
else if(screen == 1)
temp_low_thre -= 1;
else if(screen == 2)
temp_high_thre -= 1;
break;
}
}
}
void Temp_Ctrl(void)
{
if(mode == 1)
{
if(temp < temp_low_thre)
{
heat_state = 1;
fans_state = 0;
}
else if(temp > temp_high_thre)
{
heat_state = 0;
fans_state = 1;
}
else
{
heat_state = 0;
fans_state = 0;
}
}
else
{
heat_state = 0;
fans_state = 0;
}
HEAT = heat_state;
FANS = fans_state;
}
void Beep_Ctrl(void)
{
static uint8_t sedentariness_alarm_last;
char voice_buff100;
if(smoke > 300 || sedentariness_alarm)
{
BEEP = 1;
}
else
{
BEEP = 0;
}
if(sedentariness_alarm_last != sedentariness_alarm && sedentariness_alarm == 1)
{
sprintf(voice_buff,"<G>检测到长时间坐在座位上,建议进行休息");
usart2_send_buff((uint8_t *)voice_buff,strlen(voice_buff));
}
sedentariness_alarm_last = sedentariness_alarm;
}
void Led_Ctrl(void)
{
#define GAMMA 2.5
#define MAX_DUTY 100 // 假设PWM分辨率是8位
#define LEVELS 10
float normalized,corrected;
if(mode == 1)
{
if(light < 85)
led_brightness = (100 - light) / 10;
else //* 环境亮度高于85%,关灯 */
led_brightness = 0;
}
else
{
led_brightness = led_manual / 10;
}
LED_PWM_OUTPUT(led_brightness * 10);
// if(led_brightness > 10)
// led_brightness = 10;
//
// // 线性化输入值 (1-10 -> 0.0-1.0)
// normalized = (float)(led_brightness - 1) / (float)(LEVELS - 1);
//
// // 伽马校正
// corrected = powf(normalized, GAMMA);
// LED_PWM_OUTPUT(corrected * MAX_DUTY + 0.5f);
}
void Get_Light_Intensity(void)
{
/* 采集环境亮度 */
/* 实际就是使用ADC读取光敏模块输出的电压,转换成亮度值 */
float brightness = 100.0 - 1.0 * Get_Adc_Average(1) / 4096 * 100;
light = light * 0.6 + brightness * 0.4;
}
void Check_Is_Have_People(void)
{
/* 检测是否有人 */
if(GET_SR501_STATE())
{
sr501_state_1++;
sr501_state_2 = 0;
}
else
{
sr501_state_1 = 0;
sr501_state_2++;
}
if(sr501_state_1 >= 1)
{
sr501_state_1 = 1;
is_have_people = 1;
}
if(sr501_state_2 >= 40)
{
sr501_state_2 = 40;
is_have_people = 0;
}
}
void Get_Smoke(void)
{
const float VCC = 5.0;
const float RL = 4700.0;
const float A = 100.0;
const float B = -1.5;
float voltage_mq7;
float rs,ratio,ppm;
voltage_mq7 = 1.0 * Get_Adc_Average(3) / 4096 * 3.3;
rs = (VCC - voltage_mq7) / voltage_mq7 * RL;
ratio = rs / 10000.0;
ppm = A * pow(ratio, B);
smoke = smoke * 0.6 + ppm * 0.4;
}
/* 获取重量,判断是否长时间在座椅上 */
void weight_check(void)
{
static uint16_t cnt = 0;
weight = voltageToWeight(Get_Adc_Average(4));
if(weight > 2000)
is_it_occupied = 1;
else
is_it_occupied = 0;
if(is_it_occupied)
{
cnt++;
if(cnt >= 30)
{
sedentariness_alarm = 1;
}
}
else
{
cnt = 0;
sedentariness_alarm = 0;
}
}