目录
摘 要
本文详细介绍了家用回水泵的设计与实现过程,涵盖了硬件和软件的设计、测试与调试等各个方面。家用回水泵在现代家庭中具有重要的应用价值,能够有效节约水资源,提高用水效率。为实现这一目标,我们首先进行了系统功能的需求分析,选择了适合的硬件组件,包括220V转12V的芯片LNK304、继电器、水泵控制器、水流开关、M8六角螺纹温度传感器(NTC)、HT1621及段码液晶显示器、基于TTP224的触摸按键和RTC实时时钟等。这些硬件组件相互配合,共同实现了家用回水泵的智能控制功能。
在系统总体设计中,我们从硬件结构和软件功能两方面入手,设计了系统的总体框架和工作流程。系统的开发环境选用了常见的嵌入式开发平台keil5,结合C语言进行编程,实现了系统各个模块的功能。
在硬件设计部分,电源管理是关键的一环,我们选择了LNK304芯片来将220V交流电转换为12V直流电,以为其他硬件组件提供稳定的电源。继电器和水泵控制器的组合实现了对水泵的启停控制,而水流开关则用于检测水流状态,确保系统在无水流的情况下停止运行以保护水泵。M8六角螺纹温度传感器用于实时监测水温,结合HT1621及段码液晶显示器,我们实现了水温的实时显示和监控。基于TTP224的触摸按键设计使得用户可以通过简单的触摸操作来控制系统的工作模式和参数设置,增强了系统的可操作性和用户体验。RTC实时时钟模块则用于记录和管理系统的工作时间,支持定时任务的执行。
在软件设计部分,我们通过绘制软件框图和详细的代码模块说明,展示了系统各功能模块的逻辑关系和数据处理流程。为了实现系统的各项功能,我们在C语言的基础上编写了多个模块化的代码段,包括电源管理模块、温度监控模块、水流控制模块、用户界面模块等。电源管理模块主要负责对LNK304芯片的控制,确保电源的稳定输出;温度监控模块则采集M8六角螺纹温度传感器的数据,并将实时温度显示在段码液晶显示器上;水流控制模块根据水流开关的状态控制水泵的启停;用户界面模块通过触摸按键接收用户的操作指令,并作出相应的系统调整。我们在实现过程中总结了各模块的设计心得和实现体会,通过多次调试和优化,确保系统稳定运行,提高了系统的响应速度和控制精度。
为了验证系统的功能和性能,我们进行了全面的测试。测试结果表明,系统能够满足设计要求,实现了预期的功能。在系统集成测试中,我们将所有硬件和软件组件集成到一起,模拟实际使用环境进行长时间运行测试,验证系统的稳定性和可靠性。我们在总结测试结果和系统性能的基础上,提出了进一步的改进方向和优化建议,例如提高温度传感器的采集精度,优化水泵控制的算法,提升用户界面的交互体验等。
关键词:嵌入式;家用回水泵;段码液晶显示器;控制系统
1引言
1.1课题背景
随着人们生活水平的不断提高,智能化家居设备越来越受到关注,家庭用水系统的智能化和便捷性成为焦点。家用回水器系统作为智能家居的重要组成部分,通过在热水系统中实现热水循环,可以减少用户等待时间和水资源浪费,显著提升生活质量。传统的热水供应系统存在等待时间长、水资源浪费等问题,尤其在大户型家庭和多层建筑中尤为明显。为了满足用户对快捷、节能和环保的需求,家用回水器系统的研发和应用应运而生。
家用回水器系统的主要功能是通过在热水管路中加入回水器,确保热水循环使用,使用户可以随时享用热水,而无需长时间等待。同时,通过合理的控制和调节,回水器系统可以实现节能降耗,减少能源浪费。因此,设计并实现一款高效、智能的家用回水器系统,对于提升家庭生活质量和节约水资源具有重要意义。
家用回水器系统不仅提高了热水的使用效率,还通过智能控制和管理优化了能耗。借助先进的温度传感器和流量控制技术,该系统能够精确监控和调节热水的使用状态,实现按需供水,避免不必要的能源浪费。这种智能化的设计理念,既满足了用户对舒适便捷生活的需求,也符合现代社会对环保和节能的追求。因此,研究和开发家用回水器系统,不仅具有实际应用价值,也在技术创新和环保节能方面具有重要意义。
图1-1 家用回水器
1.2国内外研究现状
1.2.1国外研究现状
1.先进的传感技术应用
在国际研究领域,家用回水器技术的发展日益引起广泛关注。研究者们普遍致力于采用先进的传感技术,以提高热水循环系统的监测精度和实时性。各种高性能传感器的应用,如温度传感器、流量传感器、压力传感器等,使得国际上的家用回水器系统更为智能,能够更好地适应不同家庭环境和使用需求。例如,基于光电技术的温度传感器可以实时监测水温变化,确保热水供应的稳定性和安全性,而高灵敏度的流量传感器则能够准确检测水流量,优化系统的控制策略。
2.智能控制算法的应用
国际上的研究者倾向于采用先进的智能控制算法,以实现对家用回水器系统的智能化调控。这些算法包括模糊控制、神经网络控制、自适应控制等,通过对传感器实时数据的综合分析,能够更精确地调整回水器的运行模式,提高系统的效率和响应速度。例如,模糊控制算法可以根据不同家庭的热水使用习惯,自动调节回水器的工作时间和频率,而神经网络控制算法则能够通过学习和预测用户行为,实现更为智能和个性化的控制。在不同国家和地区,研究者们纷纷提出了适应于当地水质和用水习惯的控制策略,推动了家用回水器技术的不断创新。
3.智能家居系统整合
国际上,智能家居概念的普及和智能化生活方式的提倡,使得研究者们开始将家用回水器与智能家居系统进行有机整合。通过联动各类智能设备,如智能温控系统、智能照明系统、智能安防系统等,形成全方位的家庭环境监控和调控网络。这不仅提升了用户对居家环境的感知和掌控能力,也使家用回水器能够根据家庭的整体能源消耗和使用习惯进行优化调度,进一步提高系统的节能效果和使用便利性。例如,智能家居系统可以在检测到家庭成员回家前启动回水器,提前预热热水,减少等待时间。
4.前沿材料与技术的引入
国际研究者在家用回水器材料方面进行了深入研究,引入了一些新型的材料和技术,如纳米材料、高效绝热材料、智能复合材料等。这些材料具有更高的导热性、绝热性和耐腐蚀性,有望进一步提高家用回水器的效率和使用寿命。例如,纳米材料的应用可以显著提高热交换效率,减少热损失,而高效绝热材料则能够有效防止热量散失,保持水温稳定。此外,国际上还有一些研究关注智能复合材料的应用,通过材料自身的智能响应特性,实现对系统运行状态的自我调节和优化。
5.政策法规推动
一些国际地区制定了严格的节能环保标准和法规,推动了家用回水器技术的研究和应用。这种法规的制定既促使了家用回水器行业的健康发展,也促进了技术创新,推动了更多环保型、高效能的产品投放市场。例如,欧盟的能源效率指令和美国的能源之星计划都对家用回水器的能效提出了明确要求,推动了相关技术的升级和改进。这些政策法规不仅保护了消费者的利益,也对环境保护和资源节约起到了积极作用。
6. 用户体验和市场需求研究
国际研究者在家用回水器的用户体验和市场需求方面也进行了深入研究。通过调查用户的使用习惯和需求,研究者们不断优化回水器的设计和功能,使其更加符合用户的期望。例如,一些研究发现,用户对回水器的噪音水平、控制界面的便捷性、安装维护的简易性等都有较高的要求。基于这些调查结果,国际上的家用回水器产品在设计时更加注重人性化和用户体验,提供更加安静、高效和易于操作的解决方案。
7.多领域协同创新
国际上的家用回水器研究还体现出多领域协同创新的特点。研究者们不仅在水力学、热力学等传统工程领域进行深入探索,还将物联网技术、大数据分析、人工智能等新兴技术融入到回水器系统的设计和优化中。例如,物联网技术的应用使得家用回水器可以实现远程监控和管理,大数据分析则帮助优化系统运行参数,提高能效,人工智能技术则为智能控制和预测提供了强大的支持。
综合而言,国际研究者在家用回水器技术领域的研究更加注重技术的先进性和系统的智能化。通过引入新材料、新技术和前沿的控制策略,国际研究者不断推动着家用回水器技术的发展,并为解决全球范围内的水资源浪费问题提供了创新性的解决方案。这也对国内的研究者提出了更高的挑战,需要更加紧密地关注国际领先水平,吸取国际研究的经验,推动中国家用回水器技术的全面提升。在这一引人注目的研究课题中,我们将深入探讨各种技术手段的整合,以期为未来智能家居和节能环保生活的建设提供新的范本和启示。
1.2.2国内研究现状
在国内,家用回水器技术的研究同样取得了显著的进展,为提升家庭热水系统的效率和节能效果提供了重要支持。以下是当前国内对于家用回水器研究现状的几个优势方面:
1.传感技术的进展
在传感技术领域,国内研究者积极探索适用于家用回水器的高性能传感器。温度传感器、流量传感器、压力传感器等国产传感器的研发与应用成为国内研究的亮点。这些传感器不仅具有较高的灵敏度和稳定性,而且在成本上更具竞争力,为国内家用回水器技术的本土化提供了可行性。例如,国内研究机构开发的高精度温度传感器可以实时监测水温变化,确保系统的稳定运行和热水供应的安全性。
2.微控制器技术的采用
国内研究者在微控制器技术的应用上取得了一系列成果。STM32系列微控制器由于其强大的性能、低功耗和丰富的外设接口,在国内家用回水器设计中得到广泛应用。这些微控制器不仅提供了可靠的硬件支持,而且为系统的灵活性和可扩展性带来了便利。通过STM32微控制器,国内研究者能够实现对回水器系统的精细控制和优化,从而提高系统的效率和用户体验。
3.智能控制算法的优化
国内研究者在智能控制算法方面进行了深入研究,尤其注重在提高回水器系统适应性和智能化水平方面的改进。通过引入模糊逻辑、遗传算法、神经网络等先进算法,国内研究者致力于提高家用回水器对复杂环境的适应性,实现更加精准和高效的热水循环。例如,模糊逻辑控制算法可以根据用户的热水使用习惯,自动调整回水器的运行模式,而遗传算法则通过不断优化参数,提高系统的整体性能。
4.智能家居系统的发展
随着智能家居概念的兴起,国内研究者也开始将家用回水器与智能家居系统相融合。通过整合智能家居平台,实现对回水器的远程监控和智能调控。这一趋势不仅提高了用户对家庭热水系统的掌控能力,也为智能化生活奠定了基础。例如,用户可以通过智能家居应用程序在回家前启动回水器,确保到家时即有热水可用,减少等待时间和能源浪费。
5.行业标准和政策的推动
在国内,相关行业标准和政策的推动也加速了家用回水器技术的研究与发展。国家对于家用热水系统的能效和环保要求日益提高,推动了相关产业的技术创新和产品升级。例如,《家用热水器能效限定值及能效等级》标准的实施,对家用回水器的能效提出了明确要求,促使企业不断提升技术水平和产品性能,推动了整个行业的进步。
6.多领域协同创新
国内的家用回水器研究也体现出多领域协同创新的特点。研究者们不仅在热力学、水力学等传统工程领域进行深入探索,还将物联网技术、人工智能、大数据分析等新兴技术融入到回水器系统的设计和优化中。例如,物联网技术的应用使得家用回水器能够实现远程监控和智能控制,大数据分析则帮助优化系统参数,提高能效,而人工智能技术则为智能预测和自动调节提供了支持。
综上所述,国内在家用回水器技术领域的研究不仅注重技术创新,更强调本土化需求。通过自主研发先进的传感器、采用国产微控制器、优化智能控制算法,国内研究者积极应对挑战,推动了家用回水器技术在国内市场的发展。然而,在面对全球环境问题和资源紧缺的挑战时,国内研究者仍需密切关注国际先进技术的发展趋势,加强国际合作,共同推动家用回水器技术的创新与进步。
1.3应用场景
家用回水器系统的应用场景非常广泛,涵盖了从普通家庭到大型建筑的各类需求,其多样化和智能化的特性使其在以下几个方面展现出显著的优势:
1.普通家庭:
在普通家庭中,尤其是面积较大的住宅,回水器系统可以显著改善热水供应效率。传统热水系统往往需要长时间等待热水流出,造成不便和水资源浪费。通过安装家用回水器,热水可以在管道中循环流动,确保用户打开水龙头时立即有热水可用。这不仅提高了生活品质,也有效减少了用水量,节约了水资源。此外,智能回水器系统可以根据用户的用水习惯,自动调节运行时间和频率,进一步提高了节能效果。
2.高层公寓和多层建筑:
在高层公寓和多层建筑中,热水供应问题尤为突出。由于楼层高度和管道长度的增加,热水传输过程中热损失较大,用户等待热水的时间更长。家用回水器系统可以在这种环境下发挥重要作用,通过在热水管路中循环热水,减少等待时间,提供稳定的热水供应。特别是在早晚用水高峰期,智能控制系统可以提前预热管道中的水,确保用户在高峰期也能迅速获得热水,提升居住体验。
3.酒店和民宿:
酒店和民宿等商业场所对热水供应的要求更高,用户流动性大,用水高峰时段集中。家用回水器系统可以大幅提升热水供应的效率和可靠性,为住客提供优质的服务体验。智能控制系统可以根据入住率和用水高峰时段,灵活调整热水供应策略,确保住客在任何时间都能享受到即开即热的热水服务。此外,节能回水器系统可以显著降低酒店的运营成本,减少能源消耗,提升整体经济效益。
4.医院和养老院:
在医院和养老院等特殊场所,热水供应的可靠性和及时性尤为重要。家用回水器系统可以确保这些场所的热水需求得到充分满足,提供稳定的热水供应,保障患者和老人的生活质量。智能控制系统可以根据不同区域的用水需求,灵活调整热水供应策略,确保各个部门的热水供应均衡可靠。此外,节能回水器系统可以减少医院和养老院的运营成本,提高整体效益。
2总体设计
2.1系统功能描述
2.1.1系统硬件选用及其功能描述:
基于STM32F103C8T6设计的家用回水器系统是一款智能化程度高、可靠性强的设备,专为优化家庭热水供应而设计。该系统充分利用STM32F103C8T6芯片的优势,结合先进的传感技术和实时操作系统,以确保在不同使用环境下均能提供高效、节能的热水供应方案。以下是该系统的详细硬件选用及其功能描述:
1.嵌入式系统架构:
STM32F103C8T6芯片:
图2-1 STM32F103C8T6芯片
我们选用了STM32F103C8T6芯片作为本系统的核心。这款微控制器提供了高性能的计算能力和实时操作系统支持,能够高效处理多种传感器数据,并快速响应用户的热水需求。
外设接口:
集成了与传感器、显示屏、电机驱动模块等外设的接口,为系统提供了良好的可扩展性和灵活性。
2.控制器技术:
多控制器融合:
整合HT1621芯片(图2-2)、段码液晶显示屏(图2-3)、TTP224芯片触摸按键(图2-5)等多种传感器,实现对室内环境的多方面监测,采用此类高精度传感器,确保准确获取各项参数,为系统提供优秀的室内供水控水服务。
HT1621芯片概述:
支持时钟/数据输入的串行接口,具有低功耗、高性价比的特点,适用于需要驱动液晶显示的各种应用场景。HT1621通过串行接口接收来自微控制器的数据,并将这些数据存储在内部的显示数据RAM中,然后根据这些数据控制LCD的各个段进行显示。HT1621内置的扫描时钟生成电路负责定时扫描各段,以保证LCD显示的稳定性。该芯片支持32x4或24x8段的LCD显示驱动,提供灵活的接口,内置RC振荡器,无需外接时钟源。其低功耗设计适合电池供电的便携设备,内存映射显示数据RAM简化了电路设计。HT1621广泛应用于家用电器、便携式设备、工业控制和消费电子等需要液晶显示的嵌入式系统,凭借其强大的功能和易用性,提升了系统的可靠性和稳定性。
图2-2 HT1621芯片
主要应用:家用回水器显示面板、家用电器(如微波炉、空调的显示面板)、便携式设备(如手持设备、电子词典的显示屏)、工业控制(如工业仪表、控制面板的显示部分)、消费电子(如电话机、计算器等电子设备的显示界面)。
LNK304DN-T交流/直流转换器产品概述:
LNK304DN-T交流/直流转换器产品概述:LNK304DN-T是一款高效的交流/直流转换器,专为家用电器、消费电子和工业应用等设计,能够将高压交流电转换为稳定的低压直流电。该芯片集成了一个高压功率MOSFET、PWM控制器、过温保护、过流保护、欠压锁定等多种功能,使得电源设计更加简洁、可靠。LNK304DN-T具有宽输入电压范围,可以在90V至265V的交流电压下稳定工作,同时输出功率可以达到2.7W至4.5W。其高频率开关技术和能量高效传递特点,使其能够在各种环境下稳定工作,并有效减少电磁干扰。LNK304DN-T采用SO-8封装,体积小巧,便于集成到各种电子产品中。
主要应用:LNK304DN-T适用于各种需要高效能量转换的应用场景,如家用电器(如微波炉、冰箱、洗衣机等)、消费电子(如电视机、音响设备等)、工业控制系统(如工业传感器、电机驱动等)、照明设备(如LED驱动电源、节能灯等)。
图2-3 LNK304DN-T交流/直流转换芯片
M8六角螺纹温度传感器产品概述:
图2-4 M8六角螺纹温度传感器
M8六角螺纹温度传感器是一种采用标准M8螺纹接口设计的高精度温度测量装置,广泛应用于各种工业和民用温度测量场合。该传感器通过六角螺纹方便地安装到被测物体或系统中,能够稳定可靠地监测温度变化,提供精确的温度数据。
主要特点:
M8六角螺纹温度传感器具有高精度、快速响应、耐用性强和安装方便的特点。其高精度的温度感应元件能够在宽温度范围内提供准确的温度测量,快速响应特性确保温度变化能够迅速被检测到。传感器的六角螺纹设计使其易于安装和固定,适用于各种机械设备和管道系统。耐用性强的设计能够在恶劣环境下长期稳定工作,满足工业领域的严格要求。
主要应用:
M8六角螺纹温度传感器广泛应用于工业自动化、HVAC系统(供暖、通风与空调)、机械设备、汽车工业和家用电器等领域。在工业自动化中,它用于设备和系统的温度监控与控制;在HVAC系统中,用于环境温度的实时监测;在机械设备和汽车工业中,用于发动机和设备的温度管理;在家用电器中,用于各种电器的温度检测与控制。
这种传感器因其高精度、可靠性和易于安装的特点,成为温度测量与控制的理想选择,广泛应用于各类需要精确温度监控的场合。
3.用户界面与交互:
LCD段码液晶概述:
图2- 5 LCD段码液晶显示屏
LCD段码液晶(Segment LCD)是一种利用液晶材料控制光透过与否,以显示数字、字母和符号的显示技术。段码液晶显示器由多个独立的显示段组成,每个段都可以通过施加电压来控制其显示状态,从而组合成各种需要的字符或图形。这种显示技术因其低功耗、高对比度、宽视角和长寿命的特点,广泛应用于各类电子设备中。
主要特点:
LCD段码液晶显示器具有低功耗、高对比度、宽视角、长寿命、易于驱动的优点。低功耗使其非常适合电池供电设备;高对比度和宽视角保证了在各种环境光照条件下的清晰显示;长寿命和简单的驱动电路则使其具有良好的可靠性和集成便捷性。
用户友好设计:
设计简洁、直观的用户界面,以确保用户能够轻松使用系统的各项功能,同时查看相关的参数设置。
TTP224N-BSB触摸芯片概述:
图2- 6 TTP224N触摸芯片
TTP224N-BSB是一款电容式触摸传感器芯片,专为替代传统的机械按键而设计。它采用电容感应技术,通过检测人体触摸产生的电容变化来实现按键输入。TTP224N-BSB支持多达4个独立触摸按键,并提供简单的接口,方便与各种微控制器或其他电子设备集成。
主要特点:
TTP224N-BSB芯片具有高灵敏度、低功耗、抗干扰能力强的特点。其自动校准功能可以在不同的环境条件下保持稳定的触摸感应性能。芯片支持两种工作模式:直接输出模式和矩阵输出模式,满足不同应用需求。此外,TTP224N-BSB还具备较宽的工作电压范围(2.4V至5.5V),适用于各种电源系统。
主要应用:
TTP224N-BSB广泛应用于家用电器(如微波炉、洗衣机、空调的触摸控制面板)、消费电子(如遥控器、MP3播放器、智能手机的触摸按键)、工业控制(如触摸屏人机界面)、医疗设备(如触摸控制的医疗仪器)等。其高灵敏度和低功耗的特点,使其成为替代传统机械按键的理想解决方案。
触摸按键概述:
图2- 7 触摸按键工作原理图
触摸按键是一种利用电容感应技术来检测用户触摸的输入装置,广泛应用于现代电子设备中。相比于传统的机械按键,触摸按键没有机械运动部件,具有更高的可靠性和更长的使用寿命。触摸按键通过检测手指接触表面时产生的电容变化来实现输入,能够提供更灵敏和直观的用户体验。
主要特点:
触摸按键具有高灵敏度、快速响应、耐用性强、易于清洁和设计灵活等优点。高灵敏度保证了轻触即可触发按键,快速响应使用户操作更加流畅。由于没有机械部件,触摸按键的耐用性显著提高,不易损坏或磨损。表面平整的设计使其易于清洁,适用于各种环境。此外,触摸按键可以通过简单的电路和软件设计来实现各种形状和尺寸,提供更大的设计灵活性。
主要应用:
触摸按键广泛应用于家用电器(如家用回水器、微波炉、洗衣机、空调的控制面板)、消费电子(如智能手机、平板电脑、遥控器、MP3播放器)、工业设备(如触摸屏人机界面、工业控制面板)、汽车电子(如车载信息娱乐系统、空调控制面板)和医疗设备(如触摸控制的医疗仪器)等。其美观、便捷和高可靠性的特点使其成为现代电子产品中的重要组成部分。
水流开关及水泵概述:
图2- 8 水泵及水流开关工作接线图
水泵是一种用于输送或循环水及其他液体的机械装置,广泛应用于家庭、工业和农业等多个领域。水流开关是一种用于检测和控制管道内水流状态的传感器设备,通常与水泵配合使用,以确保系统的安全和高效运行。
水泵概述:
水泵通过电动机或其他动力源驱动叶轮旋转,将液体从低压区输送到高压区。根据工作原理和应用场景的不同,水泵可以分为离心泵、潜水泵、自吸泵、柱塞泵等多种类型。水泵的主要特点包括高效节能、结构紧凑、运行平稳、维护方便和使用寿命长等。
水流开关概述:
水流开关用于监测管道内的水流状态。当管道内有水流通过时,水流开关会产生信号,控制水泵启动或停止,确保系统在无水或低流量情况下避免干转或过载损坏。水流开关的类型包括机械式、磁性式和电子式等,具有高灵敏度、响应迅速、安装简单和可靠性高的特点。
主要特点:
- 水泵:高效节能、运行平稳、维护方便、结构紧凑、使用寿命长。
- 水流开关:高灵敏度、响应迅速、安装简单、可靠性高。
主要应用:
- 家庭:供水系统、花园灌溉、泳池循环等。
- 工业:冷却系统、锅炉供水、污水处理、液体输送等。
- 农业:灌溉系统、农田排水、畜牧用水等。
水泵和水流开关的结合使用,可以实现对水流的精确控制和管理,保证系统的高效、安全运行,广泛应用于各种需要水流控制的场合。
本项目旨在通过各个系统模块的应用来提供一款智能、高效、可靠的家用室内回水器,满足用户对于室内热水循环系统的需求,并为用户提供良好的使用体验。
2.1.2需求分析:
家用回水器的设计目标是提高家用热水系统的使用效率,减少水资源浪费,实现智能控制和用户友好界面。基于STM32C8T6微控制器的回水器系统需要满足以下需求:
1. 系统功能需求
- 温度监测与控制
系统需要实时监测水温,并根据用户设定的温度范围自动启动或停止水泵,确保用户在打开水龙头时能够立即获得热水。
使用M8六角螺纹温度传感器进行水温检测,温度数据需要准确可靠,并能够实时更新。
- 用户界面与交互
系统应提供直观的用户界面,用于显示当前水温、运行状态等信息。
采用LCD段码液晶显示器(HT1621芯片驱动)显示温度和状态信息,界面清晰易读。
配备触摸按键(TTP224N-BSB触摸芯片),用户可以方便地设置温度范围和系统运行模式。
- 电源管理
系统需要一个稳定的电源管理方案,将交流电转换为稳定的直流电供给系统使用。
使用LNK304DN-T交流/直流转换器,提供系统所需的稳定电源。
- 水流控制
系统需要检测水流状态,根据水流情况自动控制水泵的启停。
配备水流开关,当检测到水流时启动水泵,确保用户在使用热水时能够立即获得热水。
2. 硬件需求
- 微控制器
选用STM32C8T6微控制器,具备足够的I/O口和计算能力,能够处理温度传感器的数据、驱动LCD显示器、响应触摸按键输入,并控制水泵的启停。
- 温度传感器
使用M8六角螺纹温度传感器,提供准确的水温检测,确保系统能够及时响应水温变化。
- 显示器
采用LCD段码液晶显示器,使用HT1621芯片驱动,提供清晰的温度和状态显示。
- 触摸按键
配备TTP224N-BSB触摸芯片,实现用户友好的触摸按键输入,用户可以方便地进行系统设置。
- 电源管理
使用LNK304DN-T交流/直流转换器,提供系统所需的稳定电源,确保系统稳定运行。
- 水流开关与水泵
配备水流开关和水泵,检测水流状态,并根据需求自动控制水泵的启停。
3. 软件需求
- 实时温度监测与控制算法
实现温度数据的采集和处理,根据用户设定的温度范围自动控制水泵的启停。
- 用户界面程序
实现LCD显示温度和状态信息,触摸按键的响应和设置功能。
- 电源管理与故障检测
实现电源管理算法,确保系统在电源波动时仍能稳定运行,并具备基本的故障检测和报警功能。
- 水流检测与控制程序
实现水流检测与控制算法,确保水流开关状态能够及时反馈并控制水泵的启停。
通过以上需求分析,系统能够满足用户对于实时、智能、可靠的室内空气净化需求,并提供了一系列人性化、用户友好的功能。系统以实时监测为基础,通过先进的传感器技术,全方位、多角度地感知室内的空气质量。这种细致入微的监测不仅包括PM2.5和环境温湿度等关键参数,还对其他可能的污染源进行全面检测,确保用户能够清晰了解室内环境的整体状况。在用户界面与交互方面,系统以简洁直观的设计为用户提供了友好的使用体验。配备OLED屏和按键,用户能够通过直观的界面轻松了解室内空气状况,并且能够通过按键进行各种设置和操作,以便根据需要进行实时调整,以确保系统在不同场景下都能够为用户提供良好的使用体验。
2.2系统设计方案:
2.2.1系统总体设计:
基于STM32C8T6的家用回水器系统总体设计旨在通过多种硬件和软件组件的有机结合,实现高效、智能的家庭热水回收和管理系统。以下是系统总体设计的详细内容:
系统结构
系统总体架构由以下几个主要部分组成:
- 主控单元
使用STM32C8T6微控制器作为核心处理单元,负责数据处理、控制逻辑执行以及与各个外设的通信。该微控制器具有足够的I/O端口和计算能力,能够满足系统的需求。 - 温度检测单元
采用M8六角螺纹温度传感器,用于实时检测水温。传感器的温度数据通过ADC接口传输到主控单元进行处理。 - 显示和交互单元
配备LCD段码液晶显示器,使用HT1621芯片驱动,用于显示当前水温、系统状态等信息。用户可以通过TTP224N-BSB触摸芯片实现的触摸按键与系统进行交互,进行温度设定和模式选择。 - 电源管理单元
系统使用LNK304DN-T交流/直流转换器将220V交流电转换为系统所需的直流电源,确保整个系统能够稳定运行。电源管理单元需要提供稳定的电压和电流,并具有过流、过压保护功能。 - 水流检测和控制单元
系统配备水流开关用于检测水流状态。当检测到水流时,信号传输到主控单元,控制水泵的启动和停止,确保用户在打开水龙头时能够立即获得热水。
系统功能
- 温度监测和控制
系统实时监测水温,根据用户设定的温度范围自动控制水泵的启停。温度数据通过温度传感器采集,传输到主控单元进行处理和判断。 - 用户界面和交互
通过LCD显示器显示当前水温和系统状态,用户可以通过触摸按键进行温度设置和模式选择。显示和交互单元需要提供直观、清晰的界面,确保用户能够方便地操作系统。 - 智能控制和节能
系统通过温度和水流检测,实现智能控制,避免水资源浪费,提高热水利用效率。在用户设定的温度范围内,系统能够自动调节水泵的工作状态,达到节能目的。
系统设计目标
- 高效性
系统需要快速响应用户需求,实时提供热水,减少等待时间。通过高效的温度监测和控制算法,确保水泵的合理工作,提升系统的整体效率。 - 可靠性
系统在各种工作环境下都需要稳定运行,具备良好的抗干扰能力和故障恢复能力。通过硬件和软件的优化设计,确保系统在长时间工作中的稳定性和可靠性。 - 用户友好性
系统的用户界面需要简洁明了,操作方便。通过直观的LCD显示和灵敏的触摸按键,用户可以轻松设置和控制系统,提升使用体验。 - 安全性
系统在设计时需要考虑电气安全、防水和耐热等方面,确保用户在使用过程中的安全。通过可靠的电源管理和故障检测功能,保障系统的安全运行。
基于以上系统设计方案进行合理讨论后,我们旨在打造一款高性能、智能、安全可靠的家用回水器,基于STM32C8T6的家用回水器设计旨在提高家庭热水系统的使用效率,减少水资源浪费,并为用户提供便捷的使用体验。该系统集成了多个关键硬件组件,包括HT1621芯片驱动的LCD段码液晶显示器、LNK304DN-T交流/直流转换器、M8六角螺纹温度传感器、TTP224N-BSB触摸芯片、触摸按键、水流开关和水泵。通过实时温度监测和智能控制,用户可以随时获得所需的热水,同时系统提供直观的界面显示当前水温和状态信息。电源管理部分确保系统在各种工作环境下的稳定运行,水流开关实现了水泵的自动启停控制,提高了系统的智能化水平。总之,该设计充分考虑了用户需求和系统功能,具备良好的实用性和可靠性,能够有效提升家用热水系统的使用效率和用户体验。。
2.2.2开发环境:
为了有效地开发基于STM32F103RCT6的空气净化器系统,我们选择了一系列现代化的开发工具和硬件设计平台,以确保项目的高效开发和可靠性。
- 主控板:
STM32F103RCT6微控制器:
作为系统的主控芯片,提供强大的计算能力和丰富的外设接口,支持实时操作系统和控制算法的顺利运行。
- 开发工具及版本:
嵌入式开发工具:
使用KEIL 5作为主要的嵌入式开发工具,该版本具有强大的集成开发环境(IDE),能够有效管理和调试STM32系列的嵌入式系统。Keil5是一款非常友好和强大的C语言软件开发系统。为我们提供了清晰直观的操作界面,而且使用起来十分的轻松便捷,并具备编译器、编译器、安装包和调试跟踪,主要新增包管理器功能,支持多种编译方式和相关环境。适合我们使用。
编译器:
配套KEIL 5的ARM编译器,用于将高级编程语言代码转化为STM32F103RCT6可执行的二进制代码。
调试工具:
利用KEIL 5的调试功能,包括实时监视、变量查看和实时跟踪,以保障系统在开发过程中的稳定性和可调试性。
- 硬件设计:
设计工具:
使用Altium Designer进行硬件设计,该工具提供了先进的电路设计和PCB布局功能,确保电路板设计的精准和高效。Altium Designer作为一款专业的电子设计自动化(EDA)软件,专注于电路板设计、仿真和制造领域。它提供了全面的设计解决方案,整合了原理图设计、PCB设计、信号完整性分析、模拟仿真、设计规则检查和制造文件生成等功能。
具备直观而强大的用户界面,Altium Designer使设计师能够轻松创建复杂的电路板设计。支持多层PCB设计,可迅速进行电路板的布局和布线,同时提供了丰富的元器件库,包括标准元件和供应商特定元件,以便设计师快速找到所需元件并进行设计。
Altium Designer还配备强大的仿真工具,能够进行数字电路、模拟电路和混合信号电路的仿真和性能分析。设计师可利用仿真工具验证电路的功能性、时序和稳定性,并通过优化设计来满足项目要求。Altium Designer的全面功能和用户友好的界面使其成为电子设计领域的重要工具。
主控板设计:
通过Altium Designer设计主控板,包括主控芯片的布局、外设接口的连接以及电源电路的设计,以最大限度地优化电路板的性能和可靠性。
传感器集成:
在硬件设计中,对多种传感器及硬件进行合理的布局和连接,以确保传感器能够稳定、高效地运行。
通过以上选择的开发环境,我们能够确保在项目开发的各个阶段都能够高效、稳定地进行工作,同时能够快速响应和解决可能出现的问题。这样的开发环境不仅提高了开发效率,还有助于确保最终交付的空气净化器系统达到高质量的标准。
2.3设计理念
2.3.1总体框图
图2-6 项目总体框图
2.3.2硬件应用描述
基于STM32C8T6的家用回水器设计中,各个硬件组件的合理应用是确保系统稳定、高效运行的关键。以下是主要硬件组件的应用描述:
- STM32C8T6微控制器
STM32C8T6微控制器作为系统的核心控制单元,负责所有数据处理和控制逻辑的执行。该微控制器具有丰富的I/O端口和强大的计算能力,可以与多个外设进行通信和控制。主要应用如下:
通过ADC接口读取温度传感器的数据,实现实时温度监测。
控制HT1621驱动的LCD段码液晶显示器,显示当前水温和系统状态。
接收TTP224N-BSB触摸芯片的按键输入,处理用户指令。
控制水流开关和水泵的启停,确保系统按照设定的温度范围运行。
- M8六角螺纹温度传感器
M8六角螺纹温度传感器用于实时监测水温,其输出的模拟信号通过ADC接口传输到STM32C8T6微控制器。主要应用如下:
实时检测水温,确保系统能够快速响应温度变化。
提供准确的温度数据,使系统能够根据用户设定的温度范围自动控制水泵。
- HT1621芯片和LCD段码液晶显示器
HT1621芯片用于驱动LCD段码液晶显示器,显示当前水温、系统状态和其他信息。主要应用如下:
接收来自STM32C8T6微控制器的数据,驱动LCD显示器显示温度和状态信息。
确保显示内容清晰、稳定,为用户提供直观的界面。
- TTP224N-BSB触摸芯片和触摸按键
TTP224N-BSB触摸芯片实现触摸按键功能,用户通过触摸按键与系统进行交互。主要应用如下:
检测用户的触摸输入,将触摸信号传输给STM32C8T6微控制器。
处理用户输入的温度设置和系统模式选择,确保系统能够根据用户需求进行调整。
- LNK304DN-T交流/直流转换器
LNK304DN-T交流/直流转换器将220V交流电转换为系统所需的直流电源,提供稳定的电压和电流。主要应用如下:
将高压交流电转换为低压直流电,供给STM32C8T6微控制器和其他硬件组件使用。
提供稳定的电源,确保系统在各种工作条件下能够正常运行。
- 水流开关和水泵
水流开关用于检测水流状态,水泵用于实现热水回流。主要应用如下:
检测水流状态,将水流信号传输给STM32C8T6微控制器。
根据检测到的水流状态和温度数据,控制水泵的启停,确保用户在需要时能够立即获得热水。
通过以上硬件组件的合理应用和集成,基于STM32C8T6的家用回水器能够实现高效、智能的家庭热水管理,提升用户的使用体验和资源利用效率。
- 继电器:
集成继电器,用于控制系统的开关和各个组件的电源供应。通过继电器,系统能够灵活地实现各种工作模式。
- 电源电路:
设计稳定可靠的电源电路,确保系统各组件能够正常运行。采用过压、过流保护等技术,提高整个系统的安全性和稳定性。
- PCB布局与连接:
利用Altium Designer进行PCB布局设计,确保电路板的紧凑性和信号传输的稳定性。精心设计的连接方案保证各组件协同工作,提高系统整体性能。
通过这些硬件组件的有机结合,空气净化器系统能够实现对室内环境的全面监测和智能控制,为用户提供高效、便捷、安全的空气净化体验。
3详细设计
3.1硬件设计与实现
在基于STM32C8T6的家用回水器设计中,硬件设计与实现是系统功能和性能的基础。下面详细描述HT1621芯片控制LCD段码液晶的设计与实现。
3.1.1HT1621芯片控制LCD段码液晶
图3- 1 HT1621芯片控制LCD段码液晶典型电路
HT1621芯片的主要特点:
低功耗设计:适用于需要长期运行的电池供电设备。
多种显示模式:支持静态、动态和多种扫描方式。
高集成度:内部集成了振荡器和电压调节器,简化了外围电路设计。
灵活的接口:支持串行和并行接口,方便与微控制器连接。
设计与实现步骤
连接与接口设计
电源连接:HT1621芯片的VDD和VSS引脚连接到系统的电源和地。
数据接口:HT1621采用串行接口与STM32C8T6微控制器通信,使用三线接口(CS、WR、DATA)。
LCD连接:HT1621的SEG和COM引脚连接到LCD段码液晶显示器的对应引脚,具体连接方式根据LCD显示器的规格确定。
初始化HT1621
配置初始化指令:在STM32C8T6微控制器的初始化程序中,向HT1621发送配置指令,设置工作模式、显示模式等参数。
清除显示寄存器:初始化时,将HT1621的显示寄存器清零,确保显示器初始状态为空白。
显示数据更新
数据写入:根据实时温度数据和系统状态,计算需要显示的段码,通过串行接口将数据写入HT1621的显示寄存器。
刷新显示:HT1621会根据显示寄存器的数据,自动驱动LCD段码液晶显示器,刷新显示内容。
显示效果优化
对比度调整:通过调整HT1621的电压配置,优化LCD显示器的对比度,确保显示内容清晰可见。
刷新频率设置:根据显示效果需求,调整HT1621的刷新频率,避免闪烁现象。
3.1.2M8六角螺纹温度传感器(NTC)
M8六角螺纹温度传感器(NTC)在家用回水器设计中扮演着重要角色,用于实时监测水温并将数据反馈给控制系统,以下是其设计与实现的详细描述:
传感器特点与工作原理:
NTC特性:负温度系数,随温度变化导致电阻值变化。
精确度:高精度温度测量,适合家庭热水系统的需求。
稳定性:温度响应快速,适应家庭水温变化的实时监测。
设计与实现步骤:
连接与安装: 将M8六角螺纹温度传感器安装在水管上,通过螺纹固定,确保传感器与水流紧密接触,提高测量精度。
电路连接: 将传感器的一端连接到STM32C8T6微控制器的模拟输入引脚,通过ADC接口读取传感器输出的电压信号。
数据处理: 使用STM32C8T6的ADC模块,将传感器输出的模拟电压信号转换为数字数据,表示实时水温。
校准与精度控制: 在系统初始化阶段,进行传感器的校准和参数配置,确保温度测量的精确度和稳定性。
实时监测与反馈: 系统通过周期性地读取传感器数据,实现对水温的实时监测。根据监测到的温度数据,系统可以自动调节水泵的工作状态,保持设定的温度范围内。
M8六角螺纹温度传感器(NTC)的有效应用,使家用回水器能够智能化地管理和优化热水系统,提升用户的使用体验和能效管理水平。
3.1.3LNK304(220V-12V)
LNK304是一款用于AC/DC转换的集成电路,特别适用于家用电器和工业设备的电源管理。以下是其在家用回水器设计中的应用描述:
电源转换特点与工作原理:
- 输入电压范围:适用于220V交流电源。
- 输出电压:12V直流电压。
- 集成功能:具有过流保护、过压保护和短路保护功能,提高了系统的稳定性和安全性。
- 高效能:采用开关电源技术,具有较高的能量转换效率,减少能源损耗。
设计与实现步骤:
- 电路连接: 将220V交流电源输入连接到LNK304的输入端,通过外部电路进行滤波和保护,确保稳定的输入电压。
- 输出调节: LNK304通过内部开关电路和反馈机制,将输入的220V交流电源转换为稳定的12V直流电压,用于驱动STM32C8T6微控制器及其它低压设备。
- 保护功能: 在设计中充分利用LNK304内置的保护功能,如过流保护和过压保护,保护系统免受电力波动和突发电流的影响。
- 效率优化: 通过合理的电路设计和选型,确保LNK304的电能转换效率达到最佳状态,减少能源损耗和热量产生。
图3-3 LNK304数据规则图
LNK304作为家用回水器电源管理的核心部件,提供稳定、高效的电源转换功能,为系统的可靠性和长期运行提供了重要保障。
3.1.4TTP224芯片的触摸按键
TTP224是一种集成了触摸控制功能的芯片,适用于电子设备中的触摸键盘设计。以下是其在家用回水器设计中的应用描述:
触摸芯片特点与工作原理:
- 触摸输入:支持4至8个触摸按键,通过触摸控制实现用户界面交互。
- 高灵敏度:能够感应轻微的触摸动作,提升用户体验。
- 低功耗设计:适合长时间运行的电池供电设备。
- 集成功能:内置了多种触摸检测算法和滤波器,有效抑制外部干扰。
设计与实现步骤:
- 触摸按键设计: 使用TTP224芯片,设计4个触摸按键用于家用回水器的操作和控制。
- 硬件连接: 将TTP224芯片与STM32C8T6微控制器通过I2C或GPIO接口连接,传输触摸输入信号。
- 触摸检测: TTP224芯片通过内部的触摸检测电路,实时监测触摸按键的状态变化。一旦检测到触摸动作,即向微控制器发送相应的触摸信号。
- 软件处理: 在STM32C8T6的应用程序中,通过读取TTP224芯片发送的触摸事件,执行相应的控制操作,如调节温度设定、选择工作模式等。
- 用户界面优化: 通过合理设计触摸按键的位置和功能分配,优化家用回水器的用户界面,提升操作便捷性和用户体验。
TTP224芯片的应用使得家用回水器能够通过触摸控制实现智能化操作,提高了系统的交互性和功能灵活性。
3.1.5水流开关
水流开关在家用回水器设计中起到检测水流状态的关键作用,以下是其在系统中的设计与实现描述:
水流开关特点与工作原理:
- 功能:用于检测水流的存在或缺失。
- 工作原理:基于水流导电性原理,当水流通过时闭合开关,断开水流时开启开关。
- 适用性:适合于流体系统中的水流检测,如家用热水回水器中的水泵控制。
设计与实现步骤:
- 安装位置: 将水流开关安装在水流通道中,确保能够准确感知水流的流动状态。
- 电路连接: 将水流开关的输出连接到STM32C8T6微控制器的数字输入引脚,用于接收水流状态的信号。
- 状态监测: 微控制器通过周期性地读取水流开关的状态,实时监测水流的存在或缺失。
- 控制水泵: 根据水流开关的状态信息,控制家用回水器中的水泵启停,确保在需要时能够及时供应热水。
- 安全保护: 在设计中考虑水流开关的可靠性和稳定性,确保其能够在各种工作条件下准确运行,避免因水流异常造成的系统故障或安全隐患。
水流开关作为家用回水器系统的重要组成部分,保障了系统在水流正常情况下的稳定运行,并通过与微控制器的联动实现智能化的水泵控制。
3.1.6继电器控制水泵
在家用回水器设计中,继电器用于控制水泵的启停,以下是其在系统中的设计与实现描述:
继电器特点与工作原理:
- 功能:用于将低电压控制信号(如来自STM32C8T6微控制器的信号)转换为高电压、大电流的输出信号,以控制高功率设备如水泵的启停。
- 工作原理:通过控制继电器的电磁线圈,使其在控制信号作用下切换高功率电路的通断。
- 适用性:适合于需要控制高功率设备的电子和电气控制系统。
设计与实现步骤:
- 选型与连接: 选择适配家用回水器系统需求的继电器,确保其能够承受水泵的启动电流和运行电压。
- 电路连接: 将继电器的控制端连接到STM32C8T6微控制器的数字输出引脚,将水泵的电源线连接到继电器的输出端。
- 控制逻辑: 在STM32C8T6的应用程序中编写控制逻辑,根据系统需求和用户操作,控制继电器的通断状态,进而控制水泵的启停。
- 保护措施: 考虑到水泵启停频繁的特点,设计电路中应包括过流保护和电压保护等保护措施,确保系统稳定和设备寿命。
- 安全考虑: 在设计中注意继电器的触点寿命和绝缘性能,确保在长时间运行和不良环境条件下的安全可靠性。
通过继电器控制水泵,家用回水器系统可以实现对水流的精确控制和节能管理,提升用户的使用便利性和系统的整体效率。
3.2软件设计与实现心得体会
3.2.1软件框图
3.2.2代码模块说明
3.2.2.1整体系统模块说明
3.2.2.1.1功能概述
模块名称 | 功能 |
整体系统模块 | 初始化系统,并运行 |
3.2.2.1.2接口设计/硬件设计
STM32F103RCT6 | |
I/O | PA3 |
I/O | PA8 |
I/O | PA11 |
I/O | PB0 |
I/O | PB1 |
I/O | PB2 |
I/O | PB3 |
I/O | PB4 |
I/O | PB12 |
I/O | PB13 |
I/O | PC0 |
VCC | 3V3 |
VCC | 5V |
GND | GND |
3.2.2.1.3软件设计
/*
*-----------------------------------------------------------------------------
* (C) Copyright 2022-2032, nbufe. All Rights Reserved
*-----------------------------------------------------------------------------
* File name : main.c
* Description : 空气净化器
* Author : nbufe
* Update date : 2024.1.1
*-----------------------------------------------------------------------------
* Note :
*
*
**/
/*----------------------------------------------------------------------------*/
/* INCLUDES */
/*----------------------------------------------------------------------------*/
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "stdint.h"
#include "./BSP/LED/led.h"
#include "./BSP/EXTI/exti.h"
#include "./BSP/DHT11/dht11.h"
#include "./BSP/OLED/oled.h"
#include "./BSP/RTC/rtc.h"
#include "./BSP/G_TIMER/GeneralTIM.h"
#include "./BSP/G_TIMER/gtim_pwm.h"
#include "./BSP/key/key.h"
#include "./BSP/DLCD/DLCD.h"
#include "./BSP/DS18B20/bsp_DS18B20.h"
/*----------------------------------------------------------------------------*/
/* DECLARATION */
/*----------------------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
/* 定义字符数组用于显示周 */
char* weekdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saterday"};
const unsigned char shuzi[] =
{
0XAF, 0XA0, 0XCB, 0XE9, 0XE4, 0X6D, 0X6F, 0XA8, 0XEF, 0XED
};
/*----------------------------------------------------------------------------*/
/* DATA */
/*----------------------------------------------------------------------------*/
DHT11_Data_TypeDef DHT11_Data;
uint8_t i, DS18B20ID[8];
int temperature;
extern char dispnum[7];
uint8_t tempsec;
/*----------------------------------------------------------------------------*/
/* FUNCTION */
/*----------------------------------------------------------------------------*/
/**
* 功能:
* 参数: None
* 返回: None
* 说明: None
*/
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
SystemClock_Config(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
Delay_Init(72); /* 延时初始化 */
usart_init(115200); /* 串口1初始化 */
Led_Init(); /* LED初始化 */
DHT11_Init(); /* DHT11初始化 */
OLED_I2C_Init(); /* OLED I2C初始化 */
OLED_Init(); /* OLED初始化 */
rtc_init(); /* 初始化RTC */
EXTI_Init(); /* EXTI初始化 */
rtc_set_time(2024, 1, 13, 20, 18, 18);
Key_Init();
GENERAL_TIMx_Init(); /* 通用定时器初始化并配置PWM输出功能 */
ht1621_init(); //HT1621初始化
DS18B20_Init(); //DS18B20初始化
DS18B20_ReadId(DS18B20ID); //读DS18B20序列号
DS18B20_GetTemp_MatchRom(DS18B20ID);
HAL_Delay(100);
while(1)
{
uint8_t tempsec1=calendar.sec%10;
uint8_t tempsec2=calendar.sec/10;
write_ht1621(0x0d,shuzi[tempsec1]);//第八位数
write_ht1621(0x0f,shuzi[tempsec2]|0x10);//第七位数 write_ht1621(0x0f,0x10);//边框x9
uint8_t tempmin1=calendar.min%10;
uint8_t tempmin2=calendar.min/10;
write_ht1621(0x11,shuzi[tempmin1]|0x10);//第六位数
write_ht1621(0x13,shuzi[tempmin2]);//第五位数
uint8_t hour1=calendar.hour%10;
uint8_t hour2=calendar.hour/10;
write_ht1621(0x17,shuzi[hour1]);//第三位数
write_ht1621(0x19,shuzi[hour2]);//第二位数
uint8_t date1=calendar.date%10;
uint8_t date2=calendar.date/10;
uint8_t month1=calendar.month%10;
uint8_t month2=calendar.month/10;
uint8_t week1=calendar.week%10;
write_ht1621(0x1B,shuzi[week1]|0x10);//第一位数
write_ht1621_4(0x00,0x80);//WEEKx1
uint8_t temperatureC1=temperature%10;
uint8_t temperatureC2=temperature/10;
write_ht1621(0x05,shuzi[temperatureC2]);//第九位数
write_ht1621(0x03,shuzi[temperatureC1]|0x10);//第十位数加度
if(calendar.hour>=4&&calendar.hour<8)
{
write_ht1621(0x07,0x80);//时间图标判定x29清晨
}
else if(calendar.hour>=8&&calendar.hour<11)
{
write_ht1621(0x07,0x40);//时间图标判定x28早晨
}
else if(calendar.hour>=11&&calendar.hour<13)
{
write_ht1621(0x07,0x20);//时间图标判定x27正午
}
else if(calendar.hour>=13&&calendar.hour<17)
{
write_ht1621(0x07,0x10);//时间图标判定x26下午
}
else if(calendar.hour>=17&&calendar.hour<22)
{
write_ht1621(0x08,0x10);//时间图标判定x25傍晚
}
else if(calendar.hour>=22&&calendar.hour<=24)
{
write_ht1621(0x08,0x20);//时间图标判定x24晚上
}
else if(calendar.hour>0&&calendar.hour<=4)
{
write_ht1621(0x08,0x20);//时间图标判定x24晚上
}
HAL_Delay(100);
ht1621_all_off(24);
}
}
3.2.2.2RTC时钟模块
3.2.2.2.1功能概述
模块名称 | 功能 |
RTC时钟模块 | 储存定时 |
3.2.2.2.2接口设计/硬件设计
STM32F103RCT6 | 直流电机风扇模块 | ||
I/O | PA8 | VCC | VCC |
VCC | 5V | GND | GND |
GND | GND |
3.2.2.2.3软件设计
/*
*-----------------------------------------------------------------------------
* (C) Copyright 2022-2032, nbufe. All Rights Reserved
*-----------------------------------------------------------------------------
* File name : rtc.c
* Description :
* Author : nbufe
* Update date : 2023.10.15
*-----------------------------------------------------------------------------
*
*
*/
/* 包含头文件 ----------------------------------------------------------------*/
#include "./BSP/RTC/rtc.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/
RTC_HandleTypeDef g_rtc_handle; /* RTC控制句柄 */
_calendar_obj calendar; /* 时间结构体 */
/* 私有函数原形 --------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/
/**
* 功能: RTC写入后备区域SRAM
* 参数: bkrx 后备区寄存器编号,范围:0~41,对应 RTC_BKP_DR1~RTC_BKP_DR42
* data 要写入的数据,16位长度
* 返回: None
* 说明: None
*/
void rtc_write_bkr(uint32_t bkrx, uint16_t data)
{
HAL_PWR_EnableBkUpAccess(); /* 取消备份区写保护 */
HAL_RTCEx_BKUPWrite(&g_rtc_handle, bkrx + 1, data);
}
/**
* 功能: RTC读取后备区域SRAM
* 参数: bkrx 后备区寄存器编号,范围:0~41;对应 RTC_BKP_DR1~RTC_BKP_DR42
* 返回: 读取到的值
* 说明: None
*/
uint16_t rtc_read_bkr(uint32_t bkrx)
{
uint32_t temp = 0;
temp = HAL_RTCEx_BKUPRead(&g_rtc_handle, bkrx + 1);
return (uint16_t)temp; /* 返回读取到的值 */
}
/**
* 功能: RTC初始化
* 参数: None
* 返回: 0,成功 1,进入初始化模式失败
* 说明: 默认尝试使用LSE,当LSE启动失败后,切换为LSI.
* 通过BKP寄存器0的值,可以判断RTC使用的是LSE/LSI:
* 当BKP0==0X5050时,使用的是LSE, 当BKP0==0X5051时,使用的是LSI
* 注意:切换LSI/LSE将导致时间/日期丢失,切换后需重新设置.
*/
uint8_t rtc_init(void)
{
/* 检查是不是第一次配置时钟 */
uint16_t bkpflag = 0;
__HAL_RCC_PWR_CLK_ENABLE(); /* 使能PWR电源时钟 */
__HAL_RCC_BKP_CLK_ENABLE(); /* 使能BKP备份时钟 */
HAL_PWR_EnableBkUpAccess(); /* 取消备份区写保护 */
g_rtc_handle.Instance = RTC;
g_rtc_handle.Init.AsynchPrediv = 32767; /* 时钟周期设置,理论值:32767, 这里也可以用 RTC_AUTO_1_SECOND */
g_rtc_handle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
if (HAL_RTC_Init(&g_rtc_handle) != HAL_OK) /* 初始化RTC */
{
return 1;
}
bkpflag = rtc_read_bkr(0); /* 读取BKP0的值 */
if ((bkpflag != 0X5050) && (bkpflag != 0x5051)) /* 之前未初始化过,重新配置 */
{
rtc_set_time(2024, 1, 13, 18, 18, 18); /* 设置时间 */
}
__HAL_RTC_ALARM_ENABLE_IT(&g_rtc_handle, RTC_IT_SEC); /* 允许秒中断 */
__HAL_RTC_ALARM_ENABLE_IT(&g_rtc_handle, RTC_IT_ALRA); /* 允许闹钟中断 */
HAL_NVIC_SetPriority(RTC_IRQn, 0x2, 0); /* 设置RTC中断 */
HAL_NVIC_EnableIRQ(RTC_IRQn); /* 使能中断 */
rtc_get_time(); /* 更新时间 */
return 0;
}
/**
* 功能: RTC MSP初始化
* 参数: hrtc RTC句柄
* 返回: None
* 说明: RTC底层驱动,时钟配置,此函数会被HAL_RTC_Init()调用
*/
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
uint16_t retry = 200;
__HAL_RCC_RTC_ENABLE(); /* RTC时钟使能 */
RCC_OscInitTypeDef rcc_oscinitstruct;
RCC_PeriphCLKInitTypeDef rcc_periphclkinitstruct;
/* 使用寄存器的方式去检测LSE是否可以正常工作 */
RCC->BDCR |= 1 << 0; /* 开启外部低速振荡器LSE */
while (retry && ((RCC->BDCR & 0X02) == 0)) /* 等待LSE准备好 */
{
retry--;
Delay_ms(5);
}
if (retry == 0) /* LSE起振失败 使用LSI */
{
rcc_oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_LSI; /* 选择要配置的振荡器 */
rcc_oscinitstruct.LSIState = RCC_LSI_ON; /* LSI状态:开启 */
rcc_oscinitstruct.PLL.PLLState = RCC_PLL_NONE; /* PLL无配置 */
HAL_RCC_OscConfig(&rcc_oscinitstruct); /* 配置设置的rcc_oscinitstruct */
rcc_periphclkinitstruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; /* 选择要配置的外设 RTC */
rcc_periphclkinitstruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; /* RTC时钟源选择 LSI */
HAL_RCCEx_PeriphCLKConfig(&rcc_periphclkinitstruct); /* 配置设置的rcc_periphClkInitStruct */
rtc_write_bkr(0, 0X5051);
}
else
{
rcc_oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_LSE ; /* 选择要配置的振荡器 */
rcc_oscinitstruct.LSEState = RCC_LSE_ON; /* LSE状态:开启 */
rcc_oscinitstruct.PLL.PLLState = RCC_PLL_NONE; /* PLL不配置 */
HAL_RCC_OscConfig(&rcc_oscinitstruct); /* 配置设置的rcc_oscinitstruct */
rcc_periphclkinitstruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; /* 选择要配置外设 RTC */
rcc_periphclkinitstruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; /* RTC时钟源选择LSE */
HAL_RCCEx_PeriphCLKConfig(&rcc_periphclkinitstruct); /* 配置设置的rcc_periphclkinitstruct */
rtc_write_bkr(0, 0X5055);
}
}
/**
* 功能: RTC时钟中断
* 参数: None
* 返回: None
* 说明: 秒钟中断 / 闹钟中断 共用同一个中断服务函数
* 根据RTC_CRL寄存器的 SECF 和 ALRF 位区分是哪个中断
*/
void RTC_IRQHandler(void)
{
if (__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_SEC) != RESET) /* 秒中断 */
{
rtc_get_time(); /* 更新时间 */
__HAL_RTC_ALARM_CLEAR_FLAG(&g_rtc_handle, RTC_FLAG_SEC); /* 清除秒中断 */
//printf("sec:%d\r\n", calendar.sec); /* 打印秒钟 */
}
if (__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_ALRAF) != RESET) /* 闹钟中断 */
{
__HAL_RTC_ALARM_CLEAR_FLAG(&g_rtc_handle, RTC_FLAG_ALRAF); /* 清除闹钟中断 */
printf("Alarm Time:%d-%d-%d %d:%d:%d\n", calendar.year, calendar.month, calendar.date, calendar.hour, calendar.min, calendar.sec);
}
__HAL_RTC_ALARM_CLEAR_FLAG(&g_rtc_handle, RTC_FLAG_OW); /* 清除溢出中断标志 */
while (!__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_RTOFF)); /* 等待RTC寄存器操作完成, 即等待RTOFF == 1 */
}
/**
* 功能: 判断年份是否是闰年
* 参数: year : 年份
* 返回: 0, 非闰年; 1, 是闰年;
* 说明: 月份天数表:
* 月份 1 2 3 4 5 6 7 8 9 10 11 12
* 闰年 31 29 31 30 31 30 31 31 30 31 30 31
* 非闰年 31 28 31 30 31 30 31 31 30 31 30 31
*/
static uint8_t rtc_is_leap_year(uint16_t year)
{
/* 闰年规则: 四年闰百年不闰,四百年又闰 */
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
return 1;
}
else
{
return 0;
}
}
/**
* 功能: 设置时间, 包括年月日时分秒
* 参数: syear 年份
* smon 月份
* sday 日期
* hour 小时
* min 分钟
* sec 秒钟
* 返回: 0, 成功; 1, 失败;
* 说明: 以1970年1月1日为基准, 往后累加时间,合法年份范围为: 1970 ~ 2105年
* HAL默认为年份起点为2000年
*/
uint8_t rtc_set_time(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec)
{
uint32_t seccount = 0;
seccount = rtc_date2sec(syear, smon, sday, hour, min, sec); /* 将年月日时分秒转换成总秒钟数 */
__HAL_RCC_PWR_CLK_ENABLE(); /* 使能电源时钟 */
__HAL_RCC_BKP_CLK_ENABLE(); /* 使能备份域时钟 */
HAL_PWR_EnableBkUpAccess(); /* 取消备份域写保护 */
/* 上面三步是必须的! */
RTC->CRL |= 1 << 4; /* 进入配置模式 */
RTC->CNTL = seccount & 0xffff;
RTC->CNTH = seccount >> 16;
RTC->CRL &= ~(1 << 4); /* 退出配置模式 */
while (!__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_RTOFF)); /* 等待RTC寄存器操作完成, 即等待RTOFF == 1 */
return 0;
}
/**
* 功能: 设置闹钟, 具体到年月日时分秒
* 参数: syear 年份
* smon 月份
* sday 日期
* hour 小时
* min 分钟
* sec 秒钟
* 返回: 0, 成功; 1, 失败;
* 说明: 以1970年1月1日为基准, 往后累加时间,合法年份范围为: 1970 ~ 2105年
*/
uint8_t rtc_set_alarm(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec)
{
uint32_t seccount = 0;
seccount = rtc_date2sec(syear, smon, sday, hour, min, sec); /* 将年月日时分秒转换成总秒钟数 */
__HAL_RCC_PWR_CLK_ENABLE(); /* 使能电源时钟 */
__HAL_RCC_BKP_CLK_ENABLE(); /* 使能备份域时钟 */
HAL_PWR_EnableBkUpAccess(); /* 取消备份域写保护 */
/* 上面三步是必须的! */
RTC->CRL |= 1 << 4; /* 进入配置模式 */
RTC->ALRL = seccount & 0xffff;
RTC->ALRH = seccount >> 16;
RTC->CRL &= ~(1 << 4); /* 退出配置模式 */
while (!__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_RTOFF)); /* 等待RTC寄存器操作完成, 即等待RTOFF == 1 */
return 0;
}
/**
* 功能: 得到当前的时间
* 参数: None
* 返回: None
* 说明: 该函数不直接返回时间, 时间数据保存在calendar结构体里面
*/
void rtc_get_time(void)
{
static uint16_t daycnt = 0;
uint32_t seccount = 0;
uint32_t temp = 0;
uint16_t temp1 = 0;
const uint8_t month_table[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* 平年的月份日期表 */
seccount = RTC->CNTH; /* 得到计数器中的值(秒钟数) */
seccount <<= 16;
seccount += RTC->CNTL;
temp = seccount / 86400; /* 得到天数(秒钟数对应的) */
if (daycnt != temp) /* 超过一天了 */
{
daycnt = temp;
temp1 = 1970; /* 从1970年开始 */
while (temp >= 365)
{
if (rtc_is_leap_year(temp1)) /* 是闰年 */
{
if (temp >= 366)
{
temp -= 366; /* 闰年的秒钟数 */
}
else
{
break;
}
}
else
{
temp -= 365; /* 平年 */
}
temp1++;
}
calendar.year = temp1; /* 得到年份 */
temp1 = 0;
while (temp >= 28) /* 超过了一个月 */
{
if (rtc_is_leap_year(calendar.year) && temp1 == 1) /* 当年是不是闰年/2月份 */
{
if (temp >= 29)
{
temp -= 29; /* 闰年的秒钟数 */
}
else
{
break;
}
}
else
{
if (temp >= month_table[temp1])
{
temp -= month_table[temp1]; /* 平年 */
}
else
{
break;
}
}
temp1++;
}
calendar.month = temp1 + 1; /* 得到月份 */
calendar.date = temp + 1; /* 得到日期 */
}
temp = seccount % 86400; /* 得到秒钟数 */
calendar.hour = temp / 3600; /* 小时 */
calendar.min = (temp % 3600) / 60; /* 分钟 */
calendar.sec = (temp % 3600) % 60; /* 秒钟 */
calendar.week = rtc_get_week(calendar.year, calendar.month, calendar.date); /* 获取星期 */
}
/**
* 功能: 输入公历日期得到星期(使用 基姆拉尔森计算公式 计算)
* 参数: syear 年份
* smon 月份
* sday 日期
* 返回: 0, 星期天; 1 ~ 6: 星期一 ~ 星期六
* 说明: 起始时间为: 公元0年3月1日开始, 输入往后的任何日期, 都可以获取正确的星期
*/
uint8_t rtc_get_week(uint16_t year, uint8_t month, uint8_t day)
{
uint8_t week = 0;
if (month < 3)
{
month += 12;
--year;
}
week = (day + 1 + 2 * month + 3 * (month + 1) / 5 + year + (year >> 2) - year / 100 + year / 400) % 7;
return week;
}
/**
* 功能: 将年月日时分秒转换成秒钟数
* 参数: syear 年份
* smon 月份
* sday 日期
* hour 小时
* min 分钟
* sec 秒钟
* 返回: 转换后的秒钟数
* 说明: 以1970年1月1日为基准, 1970年1月1日, 0时0分0秒, 表示第0秒钟
* 最大表示到2105年, 因为uint32_t最大表示136年的秒钟数(不包括闰年)!
*/
static long rtc_date2sec(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec)
{
uint32_t Y, M, D, X, T;
signed char monx = smon; /* 将月份转换成带符号的值, 方便后面运算 */
if (0 >= (monx -= 2)) /* 1..12 -> 11,12,1..10 */
{
monx += 12; /* Puts Feb last since it has leap day */
syear -= 1;
}
Y = (syear - 1) * 365 + syear / 4 - syear / 100 + syear / 400; /* 公元元年1到现在的闰年数 */
M = 367 * monx / 12 - 30 + 59;
D = sday - 1;
X = Y + M + D - 719162; /* 减去公元元年到1970年的天数 */
T = ((X * 24 + hour) * 60 + min) * 60 + sec; /* 总秒钟数 */
return T;
}
/*----------------------------------------------------------------------------*/
/* END OF FLIE (C) COPYRIGHT nbufe */
/*----------------------------------------------------------------------------*/
3.2.2.3 LCD段码液晶显示屏模块
3.2.2.3.1功能概述
模块名称 | 功能 |
LCD段码液晶屏 | UI显示 |
3.2.2.3.2接口设计/硬件设计
STM32F103RCT6 | 粉尘传感器模块 | ||
I/O | PB12 | I/O | SCL |
I/O | PB13 | I/O | SDA |
VCC | 3V3 | VCC | VCC |
GND | GND | GND | GND |
3.2.2.3.3软件设计
*-----------------------------------------------------------------------------
* (C) Copyright 2022-2032, nbufe. All Rights Reserved
*-----------------------------------------------------------------------------
* File name : DLCD.c
* Description :
* Author : nbufe
* Update date : 2023.10.15
*-----------------------------------------------------------------------------
* Note :
*
*
**/
/*----------------------------------------------------------------------------*/
/* INCLUDES */
/*----------------------------------------------------------------------------*/
#include "./BSP/DLCD/DLCD.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
/*----------------------------------------------------------------------------*/
/* DECLARATION */
/*----------------------------------------------------------------------------*/
/* HT1621 命令定义 */
#define COMMAND_CODE 0x80 /* 命令码 */
#define WRITE_DATA_CODE 0xA0 /* 写命令 */
#define HT1621_SYS_EN 0x02 /* 打开系统振荡器 */
#define HT1621_RC256 0x30 /* 内部时钟 */
#define HT1621_BIAS 0x52 /* 1/3duty 4com LCD偏置 */
/*----------------------------------------------------------------------------*/
/* DATA */
/*----------------------------------------------------------------------------*/
// 存储LCD RAM数据的数组
unsigned char Lcdram[32] =
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
char dispnum[7] = {0x00, 0x00, 0x00, 0x00, 0x00};
// 存储温度数字(0-9)的7段显示格式的数组
//const unsigned char Wendu[] =
//{
// 0X5F, 0X50, 0X3D, 0X79, 0X72, 0X6B, 0X6F, 0X51, 0X7F, 0X7B
//};
/*----------------------------------------------------------------------------*/
/* FUNCTION */
/*----------------------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/
/**
* @brief HT1621初始化
* @param 无
* @retval 无
*/
void ht1621_init(void)
{
/* 引脚配置相关 */
gpio_config();
Delay_ms(500); /* 延时使LCD工作电压稳定 */
/* 配置HT1621 */
lcd_off();
write_cmd_ht1621(HT1621_SYS_EN); /* 打开系统振荡器 */
write_cmd_ht1621(HT1621_RC256); /* 使用RC_256K系统时钟源,片内RC振荡器 */
write_cmd_ht1621(HT1621_BIAS); /* BIAS 13 4个公共口 */
lcd_on();
}
/**
* @brief 配置GPIO引脚
* @param 无
* @retval 无
*/
static void gpio_config(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(HT1621_CS_PORT, HT1621_CS_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(HT1621_DATA_PORT, HT1621_DATA_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(HT1621_WR_PORT, HT1621_WR_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(HT1621_RD_PORT, HT1621_RD_PIN, GPIO_PIN_SET);
/*Configure GPIO pin : HT1621_CS_PIN */
GPIO_InitStruct.Pin = HT1621_CS_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(HT1621_CS_PORT, &GPIO_InitStruct);
/*Configure GPIO pin : HT1621_DATA_PIN */
GPIO_InitStruct.Pin = HT1621_DATA_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(HT1621_DATA_PORT, &GPIO_InitStruct);
/*Configure GPIO pin : HT1621_WR_PIN */
GPIO_InitStruct.Pin = HT1621_WR_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(HT1621_WR_PORT, &GPIO_InitStruct);
/*Configure GPIO pin : HT1621_RD_PIN */
GPIO_InitStruct.Pin = HT1621_RD_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(HT1621_RD_PORT, &GPIO_InitStruct);
LCD_CS_1();
LCD_DATA_1();
LCD_WR_1();
LCD_RD_1();
}
/**
* @brief 读引脚初始化
* @param 无
* @retval 无
*/
static void read_gpio_config(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin : HT1621_DATA_PIN */
GPIO_InitStruct.Pin = HT1621_DATA_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(HT1621_DATA_PORT, &GPIO_InitStruct);
}
/**
* @brief 写数据到HT1621
* @param Data:要写入的数据bits
* @param num:传送数据位数
* @retval 无
*/
void write_bit_ht1621(uint8_t data, uint8_t num)
{
uint8_t i;
for (i = 0; i < num; i++)
{
LCD_WR_0(); /* 拉低WR脚 Data线上的数据在WR脚位上升沿写入 */
if (((data & 0x80) >> 7) == 1) /* 如果当前bit为1,就拉高DATA引脚 */
{
LCD_DATA_1();
}
else if (((data & 0x80) >> 7) == 0) /* 如果当前bit为0,就拉低DATA引脚 */
{
LCD_DATA_0();
}
LCD_WR_1(); /* 当前这一bit写完,拉高WR脚,为下次WR为上升沿做准备 */
data <<= 1; /* 当前位用完了,移到下一位继续上述动作 */
}
}
/**
* @brief 写命令到HT1621
* @param Cmd:命令
* @retval 无
*/
void write_cmd_ht1621(uint8_t cmd)
{
LCD_CS_0(); /* 拉低CS脚 CS拉低时WR有效 */
write_bit_ht1621(COMMAND_CODE, 4); /* 写入命令标志100 0x80 */
write_bit_ht1621(cmd, 8); /* 写入命令数据 */
LCD_CS_1(); /* 拉高CS脚 */
}
/**
* @brief 将要显示的数据写到HT1621
* @param Addr:写入初始地址
* @param Data:要写入的数据
* @param Mode:COMMAND_CODE(0X80) / WRITE_DATA_CODE(0XA0)
* @retval 无
*/
void write_ht1621(uint8_t addr, uint8_t data)
{
LCD_CS_0();
write_bit_ht1621(WRITE_DATA_CODE, 3); /* 命令模式或数据模式 */
write_bit_ht1621(addr << 2, 6); /* 写入地址 */
write_bit_ht1621(data, 8); /* 写入数据 这里是对应两个SEG写的 故而为8 */
LCD_CS_1();
}
/**
* @brief 将要显示的数据写到HT1621
* @param Addr:写入初始地址
* @param Data:要写入的数据
* @param Mode:COMMAND_CODE(0X80) / WRITE_DATA_CODE(0XA0)
* @retval 无
*/
void write_ht1621_4(uint8_t addr, uint8_t data)
{
LCD_CS_0();
write_bit_ht1621(WRITE_DATA_CODE, 3); /* 命令模式或数据模式 */
write_bit_ht1621(addr << 2, 6); /* 写入地址 */
write_bit_ht1621(data,4); /* 写入数据 这里是对应单个SEG写的 故而为4 */
LCD_CS_1();
}
/**
* @brief 读HT1621返回的数据
* @param Addr:读数据的地址
* @retval 读到的数据
*/
uint8_t read_ht1621(uint8_t addr)
{
uint8_t data = 0;
uint8_t i;
LCD_CS_0();
HAL_Delay(1); // 替换 Delay_us(10)
write_bit_ht1621(0xC0, 3); /* 命令模式或数据模式 */
write_bit_ht1621(addr << 2, 6); /* 写入地址 */
read_gpio_config();
for (i = 0; i < 4; i++)
{
LCD_RD_1();
HAL_Delay(1); // 替换 Delay_us(10)
if (HAL_GPIO_ReadPin(HT1621_DATA_PORT, HT1621_DATA_PIN) == GPIO_PIN_SET)
{
data |= 0x08;
}
LCD_RD_0();
HAL_Delay(1); // 替换 Delay_us(10)
data >>= 1;
}
LCD_CS_1();
HAL_Delay(1); // 替换 Delay_us(10)
gpio_config();
return data;
}
/**
* @brief 液晶显示关闭
* @param 无
* @retval 无
*/
void lcd_off(void)
{
write_cmd_ht1621(LCD_OFF);
}
/**
* @brief 液晶显示打开
* @param 无
* @retval 无
*/
void lcd_on(void)
{
write_cmd_ht1621(LCD_ON);
}
/**
* @brief 清除显示
* @param 无
* @retval 无
*/
void ht1621_all_off(uint8_t num)
{
uint8_t i;
uint8_t addr = 0;
for (i = 0; i < num; i++)
{
write_ht1621(addr, 0x00);
addr += 2;
}
}
/**
* @brief 全部显示
* @param 无
* @retval 无
*/
void ht1621_all_on(uint8_t num)
{
uint8_t i;
uint8_t addr = 0;
for (i = 0; i < num; i++)
{
write_ht1621(addr, 0xff);
addr += 2;
}
}
/**
* @brief 全部点亮,显示相同数字
* @param 无
* @retval 无
*/
void HT1621_all_on_num(uint8_t num, uint8_t xx)
{
uint8_t i;
uint8_t addr = 0;
for (i = 0; i < num; i++)
{
write_ht1621(addr, xx);
addr += 2;
}
}
/*----------------------------------------------------------------------------*/
/* END OF FLIE (C) COPYRIGHT nbufe */
/*----------------------------------------------------------------------------*/
4测试与调试
4.1调试与优化
为了确保基于STM32C8T6的家用回水器能够稳定、可靠地工作,需要对系统进行全面、详细的测试。测试过程涵盖硬件和软件的各个方面,确保系统在各种使用场景和环境条件下都能正常运行。具体测试内容如下:
1. 硬件测试
- 微控制器功能测试
- 确认STM32C8T6微控制器的各个I/O端口能够正常工作。
- 测试微控制器与各个外设(温度传感器、LCD显示器、触摸按键、水流开关等)的接口通信是否稳定。
- 温度传感器测试
- 检查M8六角螺纹温度传感器的温度测量精度和响应时间。
- 模拟不同的水温条件,确保传感器能够准确实时地反馈温度数据。
- 显示器测试
- 测试LCD段码液晶显示器的显示效果,确保字符和数字显示清晰、稳定。
- 验证HT1621芯片的驱动功能,检查不同状态下的显示内容是否正确。
- 触摸按键测试
- 检查TTP224N-BSB触摸芯片的灵敏度和响应速度。
- 确保触摸按键输入准确,能正确触发设定的功能。
- 电源管理测试
- 测试LNK304DN-T交流/直流转换器的输出电压和电流,确保其能够提供稳定的电源。
- 检查系统在不同电压波动条件下的工作情况,确保电源管理部分的可靠性。
- 水流开关和水泵测试
- 检查水流开关在不同流量条件下的响应情况,确保其能准确检测到水流状态。
- 测试水泵的启动和停止功能,确保在检测到水流时水泵能够正常启动并维持稳定运行。
2. 软件测试
- 温度监测与控制算法测试
- 模拟不同的温度条件,测试温度监测和控制算法的准确性和稳定性。
- 验证系统在温度变化时能够及时启动或停止水泵,确保用户设定的温度范围内获得热水。
- 用户界面测试
- 检查LCD显示界面的各项信息是否准确、实时更新。
- 测试触摸按键的响应和设置功能,确保用户输入能够正确识别并执行。
- 电源管理与故障检测测试
- 测试系统在电源波动或故障情况下的应对能力,确保系统能够稳定运行或及时报警。
- 验证系统的故障检测功能,确保在异常情况下能够及时通知用户。
- 水流检测与控制程序测试
- 检查水流检测与控制程序的响应速度和准确性,确保水流开关状态能够及时反馈并控制水泵的启停。
3. 环境与可靠性测试
- 环境适应性测试
- 测试系统在不同温度和湿度条件下的运行情况,确保其在实际使用环境中的可靠性。
- 检查系统的防水和耐热能力,确保在家庭热水系统的使用环境中能够稳定工作。
- 长时间运行测试
- 进行长时间连续运行测试,检查系统在长时间工作状态下的稳定性和可靠性。
- 测试系统的电气安全性能,确保在长时间运行过程中不会出现电气安全隐患。
图 41 设备测试状态
通过以上全面的测试,能够确保基于STM32C8T6的家用回水器在各种工作环境和使用条件下的稳定性、可靠性和用户体验。测试过程中的问题和不足将及时反馈并进行调整和优化,确保最终产品的高质量和实用性。
4.2总结
在完成家用回水器项目的过程中,我们经历了一系列的学习、挑战和收获。基于STM32C8T6的家用回水器在设计完成后,进行了全面且详细的测试,以确保系统的稳定性和可靠性。硬件测试涵盖了微控制器、温度传感器、LCD显示器、触摸按键、电源管理模块、水流开关和水泵等各个组件,确保它们在不同工作条件下都能正常运行。软件测试重点验证了温度监测与控制算法、用户界面、故障检测和水流控制程序的准确性和响应速度。环境适应性测试和长时间运行测试进一步确保了系统在实际使用中的耐用性和安全性。通过这些测试,不仅验证了系统的设计和功能,还识别并解决了潜在问题,优化了系统性能。最终,该家用回水器能够为用户提供可靠、高效和便捷的热水供应体验。
通过这个项目,我们不仅获得了技术和实践经验,更培养了解决问题、团队协作和项目管理等多方面的能力。这将为我们未来的学术研究和工程实践奠定坚实的基础。我们期待将所学应用于更广泛的领域,不断追求技术的创新与进步。感谢所有支持我们的人,这段经历将成为我们学术生涯中的宝贵财富。
4.3任务分配
小组成员:。
其中同学主要负责:完成项目硬件的设计和焊接,整体运行状况的筛查。
同学主要负责:软件部分的编写、调试和整体功能优化处理。
同学主要负责:完成项目整合,ppt制作和报告编写。
4.4工作过程中遇到的问题
在本次空气净化器项目的工作过程中,我们面临了一些挑战和问题,但通过团队协作和不断努力,最终成功地解决了这些问题,以下是我们在实践过程中遇到的一些问题:
- LCD显示器的兼容性问题
问题描述:
HT1621驱动的LCD段码液晶显示器在某些情况下出现显示不稳定或字符缺失的问题。
解决方案:
检查并优化了显示器的连接和驱动程序,确保信号传输的稳定性。同时,对供电电压进行了调整,确保显示器获得稳定的工作电压。
- 触摸按键的灵敏度问题
问题描述:
TTP224N-BSB触摸芯片在使用过程中,按键响应不灵敏,存在误触或无法识别的问题。
解决方案:
通过调整触摸按键的电容和敏感度参数,提高了按键的响应速度和准确性。此外,优化了触摸按键的硬件设计和布局,减少了干扰。
- 软件与硬件集成问题:
在将软件与硬件集成的过程中,出现了一些通信问题,导致主控芯片无法正常读取传感器数据。通过逐步检查软硬件连接、通信协议等方面,最终成功解决了集成问题,确保了系统的正常运行。
- 项目进度与时间管理:
在项目中,我们面临了紧张的时间压力,有时候难以保证进度的顺利推进。通过制定详细的项目计划、合理分工和高效的团队协作,我们成功地管理了项目进度,确保了项目的按时完成。
- 团队沟通与合作:
由于项目的复杂性,团队成员之间的沟通与合作显得尤为重要。我们遇到了一些沟通不畅和合作不够默契的情况,通过定期的团队会议和信息分享,最终改进了团队协作氛围,提高了工作效率。
这些问题的解决过程让我们更深刻地认识到团队协作的重要性,同时也锻炼了我们解决实际问题的能力。在面对各种挑战时,我们通过合作和努力克服了困难,最终取得了圆满的项目成果。
5总结
5.1任务收获
在家用回水器项目的开发中,我们获得了许多宝贵的任务收获,以下是我们在项目中所学到的关键经验和技能:
- 嵌入式系统开发:
通过对STM32F103C8T6微控制器的应用,我们深入掌握了嵌入式系统的设计和开发流程。这不仅包括基础的编程和系统集成,还涉及到如何高效地利用微控制器的资源,以确保系统的稳定性和高效性。我们学习了如何在资源受限的环境下优化代码,提高系统响应速度,以及如何实现实时操作系统的调度和管理。这些技能为我们未来在嵌入式系统领域的进一步研究和开发打下了坚实的基础。
- 硬件设计与调试:
使用Altium Designer进行硬件设计,我们学会了如何进行PCB布局和连接设计,以提高系统的性能和可靠性。在项目中,我们设计了一个包含多个传感器和控制模块的复杂电路板,这使我们在硬件设计方面积累了丰富的经验。通过反复的硬件调试和测试,我们提高了对传感器、电机驱动以及其他硬件组件的理解,学会了如何在设计中考虑电磁干扰、信号完整性等问题,从而提高了硬件的可靠性和稳定性。
- 嵌入式程序设计:
利用KEIL 5进行嵌入式程序的编写和调试,我们学到了如何编写高效、可靠的嵌入式软件。我们实现了多个功能模块,包括传感器数据采集、水泵控制、显示模块驱动等。在这一过程中,我们不仅掌握了如何使用嵌入式操作系统进行任务调度,还学习了如何优化代码以提高系统的性能。例如,我们通过优化传感器数据处理算法,使数据采集和处理更加高效,减少了系统的延迟。
- 团队协作与分工:
在项目团队中,我们分工合作,高效地解决了各种问题。通过与团队成员的密切合作,我们培养了良好的沟通和协作能力,提高了团队整体的执行效率。我们学会了如何在团队中进行任务分配、进度管理和问题协调,从而确保项目按时完成。团队协作还使我们能够在遇到技术难题时集思广益,共同寻找解决方案,提高了项目的整体质量。
- 实际问题解决
在项目中,我们面对了硬件和软件调试中的实际问题,从而培养了解决问题的能力。例如,在硬件调试过程中,我们遇到了信号干扰的问题,通过调整PCB布局和增加滤波电路,成功解决了这一问题。在软件开发中,我们遇到了内存不足的问题,通过优化代码和合理分配资源,最终解决了这一挑战。这些实际问题的解决经验,使我们在面对未来的工程挑战时,更加自信和从容。
- 全面项目管理:
从项目的需求分析、设计、开发到调试,我们全面参与了整个项目生命周期,了解了项目管理的各个方面,包括时间管理、资源分配和问题解决等。在项目管理方面,我们学会了如何制定项目计划、跟踪项目进度,以及如何在项目出现偏差时进行调整。我们还学会了如何与客户进行沟通,了解客户的需求并进行需求分析,从而确保项目的最终成果能够满足客户的期望。
- 跨学科知识应用:
在项目开发过程中,我们将多个学科的知识进行了综合应用。比如,利用传感器技术进行数据采集和分析,利用嵌入式系统进行数据处理和控制,利用机械设计知识进行水泵和阀门的设计与控制。通过这种跨学科的知识应用,我们不仅提高了自身的综合能力,还深刻理解了各个学科知识之间的关联和协同作用。
- 创新与实践结合:
在项目开发过程中,我们不断尝试创新,探索新的技术和方法,以提高系统的性能和功能。例如,我们尝试使用新型传感器技术,提高数据采集的精度;尝试使用高级控制算法,提高水泵控制的效率。通过这种创新与实践的结合,我们不仅提高了系统的性能,还积累了丰富的创新经验,为未来的研究和开发提供了宝贵的参考。
这些任务收获不仅让我们对嵌入式系统有了更深的了解,还培养了我们解决实际问题、团队协作和项目管理的实际能力。这对我们未来的职业发展和学术研究都具有重要的启发意义。
5.2心得体会
在家用回水器项目的开发过程中,我们经历了一个充满挑战和学习的过程。这不仅是一次技术上的突破,更是对团队合作、问题解决和项目管理能力的全面锤炼。通过这个项目,我们不仅掌握了嵌入式系统的开发技能,还培养了多方面的综合素质,为未来的发展奠定了坚实的基础。
在整个项目的开展过程中,STM32F103RCT6微控制器成为了我们系统的核心。它的多样化性能和丰富的外设接口让我们在实现各种功能时得心应手。通过配置和使用这些外设接口,我们成功实现了传感器数据采集和水泵控制等关键功能。在学习和应用这些技术的过程中,我们对嵌入式系统的整体架构和工作原理有了更加深入的理解。这些技术积累不仅让我们在项目中游刃有余,也为未来在嵌入式领域的项目开发打下了坚实的基础。
硬件设计方面的学习与实践,让我们学会了如何高效利用Altium Designer进行电路板设计,确保PCB布局合理、连接稳定。硬件设计不仅仅是简单的元器件排列,还涉及信号完整性、电源分配和散热等多个方面。我们通过多次原理图设计和PCB布局优化,最终成功设计出了一款性能稳定的电路板。硬件调试阶段的工作更是让我们深入了解了传感器、电机和其他硬件组件的工作原理,从而在设计中提供了实践基础。在调试过程中,我们解决了传感器信号不稳定、电源电路电压等问题,通过不断的调整电路和优化程序,我们最终克服了这些技术难题。
软件开发过程中,通过KEIL 5的使用,我们深入学习了嵌入式系统中数据处理和控制算法的优化。编写模块化代码,如传感器数据采集模块、水泵控制模块和LCD显示模块,提高了代码的可读性和可维护性。在优化算法方面,我们采用了一些先进的控制算法,提高了系统的响应速度和控制精度。在数据处理方面,我们使用高效的滤波算法,有效消除了传感器数据中的噪声,提升了数据的准确性。通过这些优化措施,我们显著提升了系统的整体性能和稳定性。
团队合作的重要性在这个项目中得到了充分体现。我们在项目初期进行了详细的任务分工和时间规划,明确了每个成员的职责和任务。在项目开发过程中,我们定期召开会议,分享各自的进展和遇到的问题,通过集思广益共同解决问题。团队成员之间的紧密合作和高效沟通,使我们能够在较短的时间内完成项目,并保证了项目的质量。通过这个项目,我们学会了如何在团队中进行有效的沟通和协作,如何在遇到问题时共同讨论解决方案,以及如何在项目管理中进行任务分配和进度跟踪。这种团队协作的经验为我们未来的工作提供了宝贵的借鉴。
创新是项目成功的关键之一。在项目开发过程中,我们不断尝试新的技术和方法,以提高系统的性能和功能。例如,我们尝试使用新型传感器技术,提高数据采集的精度;尝试使用高级控制算法,提高水泵控制的效率。通过这些创新与实践的结合,我们不仅提高了系统的性能,还积累了丰富的创新经验,为未来的研究和开发提供了宝贵的参考。通过项目,我们鼓励每个成员提出自己的创新想法,并通过讨论和实践进行验证。通过这些创新尝试,我们不仅解决了一些实际问题,还开拓了我们的视野,提高了我们的创新能力。
在项目开发过程中,我们面对了许多硬件和软件调试中的实际问题,从而培养了解决问题的能力。这些实际问题的解决经验,使我们在面对未来的工程挑战时更加自信和从容。在硬件调试过程中,我们遇到了信号干扰的问题,通过调整PCB布局和增加滤波电路,成功解决了这一问题。在软件开发中,我们遇到了内存不足的问题,通过优化代码和合理分配资源,最终解决了这一挑战。通过这些实际问题的解决,我们不仅提高了解决问题的能力,还学会了如何在实际项目中应对各种挑战和困难。这种经验对我们未来在工程领域的实际应用大有裨益。
通过参与整个项目生命周期的各个阶段,从需求分析、设计、开发到调试,我们全面了解了项目管理的各个方面,包括时间管理、资源分配和问题解决等。在项目管理方面,我们学会了如何制定项目计划、跟踪项目进度,以及如何在项目出现偏差时进行调整。我们还学会了如何与客户进行沟通,了解客户的需求并进行需求分析,从而确保项目的最终成果能够满足客户的期望。在项目的各个阶段,我们都进行了详细的记录和总结,通过这些记录和总结,我们对项目管理有了更全面和深入的理解。这种项目管理的经验,为我们未来的工作提供了宝贵的借鉴和参考。
在项目开发过程中,我们将多个学科的知识进行了综合应用。比如,利用传感器技术进行数据采集和分析,利用嵌入式系统进行数据处理和控制,利用机械设计知识进行水泵和阀门的设计与控制。通过这种跨学科的知识应用,我们不仅提高了自身的综合能力,还深刻理解了各个学科知识之间的关联和协同作用。这种学术与实践的结合,使我们能够在实际项目中更好地应用所学知识,解决实际问题。在项目开发过程中,我们还查阅了大量的文献和资料,通过这些学习和研究,我们对相关领域的前沿技术有了更深入的了解,为未来的研究和开发提供了理论支持。
总体而言,这个项目不仅为我们提供了宝贵的实践经验,还让我们更加深入地理解了嵌入式系统的开发流程。我们相信这样的经历将对我们未来的工作和学习产生积极的影响。通过这次项目,我们不仅掌握了嵌入式系统的开发技能,还培养了团队协作、解决问题和项目管理的能力。这些经验和技能将为我们未来的发展提供坚实的基础。我们将继续保持对嵌入式系统的热情和兴趣,不断学习和探索新的技术和方法,提高自己的专业水平和综合能力,为未来的职业发展和学术研究打下坚实的基础。
在家用回水器项目的开发过程中,我们不仅积累了丰富的技术经验,还收获了宝贵的团队合作和项目管理能力。我们相信,这些心得体会将为我们未来的工作和学习带来深远的影响,使我们能够在嵌入式系统领域取得更大的成就。通过这个项目,我们更加坚定了在嵌入式系统领域不断探索和前进的信心和决心。