基于STM32单片机智能多功能衣柜除湿消毒控制系统设计(代码+仿真)
使用智能控制系统,许多现代洗衣机能自动调整程序 #生活技巧# #居家生活技巧# #电器使用技巧# #洗衣机使用省电法#
基于STM32单片机智能多功能衣柜除湿消毒控制系统设计
摘要:
本文设计了一种基于STM32单片机的智能多功能衣柜除湿消毒控制系统。该系统集成了温湿度监测、柜门状态检测、实时时钟显示以及定时控制等功能,通过Proteus仿真软件进行系统仿真验证。系统采用STM32单片机作为核心控制器,结合LCD1602显示屏、DHT11温湿度传感器、光敏传感器、DS1302实时时钟模块及按键等硬件模块,实现了衣柜内环境的智能监控和自动控制。
一、引言
随着科技的进步和人们生活水平的提高,智能家居产品越来越受到人们的青睐。衣柜作为家居生活中不可或缺的一部分,其内部环境的湿度和卫生状况直接影响着衣物的保存质量。传统的衣柜往往缺乏有效的除湿和消毒手段,容易导致衣物发霉、滋生细菌等问题。因此,设计一种智能多功能衣柜除湿消毒控制系统具有重要意义。
本系统旨在通过集成温湿度监测、柜门状态检测、实时时钟显示以及定时控制等功能,实现对衣柜内部环境的智能监控和自动控制。当衣柜内湿度过高时,系统自动开启除湿电机进行除湿;当柜门关闭时,系统自动开启消毒灯进行消毒;同时,系统还支持通过按键设置定时关闭消毒灯的功能,以满足用户的不同需求。
二、系统总体设计
系统硬件组成本系统硬件部分主要由STM32单片机、LCD1602显示屏、DHT11温湿度传感器、光敏传感器、DS1302实时时钟模块、按键、除湿电机及消毒灯等组成。各模块功能如下:
STM32单片机:作为系统的核心控制器,负责处理各传感器采集的数据,并根据预设逻辑控制除湿电机和消毒灯的开关。LCD1602显示屏:用于显示当前的温湿度、光照强度、实时时间以及定时关闭时间等信息。DHT11温湿度传感器:用于采集衣柜内的温度和湿度数据。光敏传感器:用于采集衣柜内的光照强度数据,以判断柜门是否关闭。DS1302实时时钟模块:用于提供准确的实时时间信息。按键:用于设置定时关闭消毒灯的时间。除湿电机:当湿度过高时,由单片机控制开启进行除湿。消毒灯:当柜门关闭时,由单片机控制开启进行消毒。 系统软件设计系统软件部分主要包括初始化程序、数据采集程序、逻辑控制程序及显示程序等。系统上电后,首先进行各模块的初始化设置;然后循环采集温湿度、光照强度及实时时间等数据,并根据预设逻辑控制除湿电机和消毒灯的开关;最后将相关信息显示在LCD1602显示屏上。
三、系统硬件设计
STM32单片机STM32系列单片机是ST公司推出的一款基于ARM Cortex-M内核的32位微控制器,具有高性能、低功耗、易于开发等优点。本系统选用STM32F103C8T6型号单片机作为核心控制器,其丰富的I/O口资源、强大的处理能力以及完善的外设接口完全满足系统的设计需求。
LCD1602显示屏LCD1602是一种字符型液晶显示模块,能够显示16×2个字符。本系统通过STM32单片机的I/O口与LCD1602相连,实现温湿度、光照强度、实时时间等信息的显示。
DHT11温湿度传感器DHT11是一款含有已校准数字信号输出的温湿度传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。本系统通过STM32单片机的单总线接口与DHT11相连,实现温湿度数据的采集。
光敏传感器光敏传感器是一种根据光照强度的变化而改变电阻值的传感器。本系统选用光敏电阻作为光敏传感器,通过STM32单片机的ADC接口采集光敏电阻的电压值,进而判断衣柜内的光照强度,以判断柜门是否关闭。
DS1302实时时钟模块DS1302是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿功能。本系统通过STM32单片机的SPI接口与DS1302相连,实现实时时间的采集和显示。
按键本系统设置按键用于设置定时关闭消毒灯的时间。按键通过STM32单片机的I/O口与单片机相连,当按下按键时,单片机进入定时设置模式,用户可以通过按键调整定时时间。
除湿电机和消毒灯除湿电机和消毒灯分别通过STM32单片机的I/O口与单片机相连,由单片机控制其开关。当湿度过高或柜门关闭时,单片机分别控制除湿电机和消毒灯开启;当定时时间到达或柜门打开时,单片机控制消毒灯关闭。
四、系统软件设计
初始化程序系统上电后,首先进行各模块的初始化设置。包括STM32单片机的时钟设置、I/O口设置、ADC设置、SPI设置等;LCD1602显示屏的初始化设置;DHT11温湿度传感器的初始化设置;DS1302实时时钟模块的初始化设置等。
数据采集程序数据采集程序负责循环采集温湿度、光照强度及实时时间等数据。具体实现如下:
温湿度采集:通过单片机与DHT11传感器的单总线接口通信,获取当前的温度和湿度数据。光照强度采集:通过单片机的ADC接口采集光敏电阻的电压值,进而计算得到光照强度数据。实时时间采集:通过单片机与DS1302模块的SPI接口通信,获取当前的实时时间数据。 逻辑控制程序逻辑控制程序根据采集到的数据,按照预设逻辑控制除湿电机和消毒灯的开关。具体实现如下:
除湿控制:当采集到的湿度数据大于预设阈值(如70%)时,控制除湿电机开启进行除湿;当湿度数据降低到预设阈值以下时,控制除湿电机关闭。消毒控制:当采集到的光照强度数据低于预设阈值(表示柜门关闭)时,控制消毒灯开启进行消毒;当光照强度数据高于预设阈值(表示柜门打开)时,控制消毒灯关闭。同时,支持通过按键设置定时关闭消毒灯的时间,当定时时间到达时,也控制消毒灯关闭。 显示程序显示程序负责将采集到的温湿度、光照强度、实时时间以及定时关闭时间等信息显示在LCD1602显示屏上。具体实现如下:
温湿度显示:将采集到的温度和湿度数据转换为字符串形式,并显示在LCD1602的第一行。光照强度显示:将采集到的光照强度数据转换为字符串形式,并显示在LCD1602的第二行。实时时间显示:将采集到的实时时间数据转换为字符串形式,并显示在LCD1602的指定位置。定时关闭时间显示:当设置定时关闭消毒灯的时间时,将定时时间显示在LCD1602的指定位置。五、系统仿真与测试
Proteus仿真环境搭建Proteus是一款著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。本系统使用Proteus仿真软件进行系统仿真验证。
在Proteus中,首先需要搭建系统的硬件电路图,包括STM32单片机、LCD1602显示屏、DHT11温湿度传感器、光敏传感器、DS1302实时时钟模块、按键、除湿电机及消毒灯等模块的仿真模型。然后,将编写好的系统程序下载到STM32单片机的仿真模型中,进行系统仿真。
系统功能仿真测试(1)温湿度采集与显示测试
在Proteus仿真环境中,通过模拟DHT11传感器输出不同的温湿度值,观察LCD1602显示屏上显示的温湿度数据是否正确。测试结果表明,系统能够准确采集并显示温湿度数据。
(2)除湿控制测试
在Proteus仿真环境中,通过模拟DHT11传感器输出高于预设阈值的湿度值,观察除湿电机是否开启;然后模拟输出低于预设阈值的湿度值,观察除湿电机是否关闭。测试结果表明,系统能够根据湿度数据准确控制除湿电机的开关。
(3)柜门状态检测与消毒控制测试
在Proteus仿真环境中,通过模拟光敏传感器输出不同的光照强度值,观察消毒灯的开关状态及LCD1602显示屏上显示的光照强度数据是否正确。同时,通过按键设置定时关闭消毒灯的时间,观察定时时间到达时消毒灯是否关闭。测试结果表明,系统能够根据光照强度数据准确判断柜门状态,并控制消毒灯的开关;同时,定时关闭功能也正常。
(4)实时时间显示测试
在Proteus仿真环境中,通过模拟DS1302模块输出不同的实时时间值,观察LCD1602显示屏上显示的实时时间数据是否正确。测试结果表明,系统能够准确采集并显示实时时间数据。
(五、系统仿真与测试 续)
系统综合测试在完成各模块单独测试后,进行了系统综合测试。将所有模块连接在一起,模拟实际使用场景,对系统的整体功能进行了全面验证。
温湿度与除湿功能综合测试:设置不同的温湿度环境,观察系统是否能准确采集并显示温湿度数据。验证当湿度超过预设阈值时,除湿电机是否能自动开启,并在湿度降低到阈值以下时自动关闭。测试结果表明,系统能够准确响应温湿度变化,并控制除湿电机正常工作。柜门状态与消毒功能综合测试:模拟柜门开关动作,观察消毒灯的开关状态及光照强度数据的显示。设置定时关闭时间,验证消毒灯是否能在定时时间到达时自动关闭。测试结果表明,系统能够准确判断柜门状态,并控制消毒灯的开关,定时关闭功能也正常。实时时间显示功能测试:在系统运行过程中,持续观察实时时间的显示情况。验证实时时间是否能够准确更新,并与实际时间保持一致。测试结果表明,系统能够准确显示实时时间,且时间更新正常。 系统稳定性与可靠性测试 长时间运行测试:将系统置于模拟环境中,长时间运行,观察系统是否稳定可靠。记录系统运行过程中的异常情况和故障率,评估系统的稳定性。测试结果表明,系统在长时间运行过程中表现稳定,故障率较低。极端环境测试:模拟极端温湿度环境,观察系统是否能正常工作。验证系统在极端环境下的适应性和可靠性。测试结果表明,系统在极端环境下仍能保持正常工作,具有较高的可靠性。六、系统优化与改进
硬件优化 传感器选型优化:根据实际测试效果,选择性能更稳定、精度更高的传感器。考虑传感器的功耗、响应速度等因素,进行选型优化。电路设计优化:对电路布局进行合理规划,减少电磁干扰和信号衰减。优化电源电路,提高系统供电的稳定性和可靠性。 软件优化 算法优化:对温湿度采集、光照强度计算等算法进行优化,提高数据处理的准确性和效率。优化控制逻辑,使系统响应更加迅速、准确。代码优化:对系统代码进行梳理和优化,减少冗余代码,提高代码的可读性和可维护性。采用模块化设计思想,将系统功能划分为多个模块,便于后续扩展和升级。 用户体验优化 界面优化:对LCD1602显示屏的显示内容进行合理规划,使信息展示更加清晰、直观。考虑增加背光调节功能,提高在不同光照环境下的可读性。操作优化:简化按键操作流程,提高用户使用的便捷性。考虑增加语音提示或报警功能,增强系统的交互性。七、结论与展望
本文设计了一种基于STM32单片机的智能多功能衣柜除湿消毒控制系统,通过集成温湿度监测、柜门状态检测、实时时钟显示以及定时控制等功能,实现了对衣柜内部环境的智能监控和自动控制。系统经过Proteus仿真验证和实际测试,表现出良好的稳定性和可靠性。
未来,可以进一步考虑将系统与现代智能家居系统相结合,实现远程控制和智能化管理。同时,可以探索更多传感器和技术的应用,如加入空气质量监测、智能衣物分类等功能,进一步提升衣柜的智能化水平。此外,还可以对系统的硬件和软件进行持续优化和改进,提高系统的性能和用户体验。
#include "main.h"
uint8_t lcd_dat1[20];
uint8_t lcd_dat2[20];
uint16_t temp_dat;
uint16_t hum_dat;
uint16_t light_dat;
uint16_t set_temp_dat=30;
uint16_t set_hum_dat=60;
uint16_t set_light_dat=100;
uint8_t set_num;
uint16_t light_intensity(uint32_t dat)
{
uint16_t Lux_dat;
if(dat<108)Lux_dat=0;
else if(dat<300)Lux_dat=10;
else if(dat<450)Lux_dat=20;
else if(dat<581)Lux_dat=30;
else if(dat<697)Lux_dat=40;
else if(dat<803)Lux_dat=50;
else if(dat<900)Lux_dat=60;
else if(dat<990)Lux_dat=70;
else if(dat<1073)Lux_dat=80;
else if(dat<1150)Lux_dat=90;
else if(dat<1223)Lux_dat=100;
else if(dat<1291)Lux_dat=110;
else if(dat<1355)Lux_dat=120;
else if(dat<1415)Lux_dat=130;
else if(dat<1473)Lux_dat=140;
else if(dat<1527)Lux_dat=150;
else if(dat<1579)Lux_dat=160;
else if(dat<1628)Lux_dat=170;
else if(dat<1675)Lux_dat=180;
else if(dat<1720)Lux_dat=190;
else if(dat<1763)Lux_dat=200;
else if(dat<1804)Lux_dat=210;
else if(dat<1843)Lux_dat=220;
else if(dat<1881)Lux_dat=230;
else if(dat<1918)Lux_dat=240;
else if(dat<1953)Lux_dat=250;
else if(dat<1986)Lux_dat=260;
else if(dat<2019)Lux_dat=270;
else if(dat<2050)Lux_dat=280;
else if(dat<2081)Lux_dat=290;
else if(dat<2060)Lux_dat=300;
else if(dat<2089)Lux_dat=310;
else if(dat<2166)Lux_dat=320;
else if(dat<2193)Lux_dat=330;
else if(dat<2218)Lux_dat=340;
else if(dat<2243)Lux_dat=350;
else if(dat<2267)Lux_dat=360;
else if(dat<2290)Lux_dat=370;
else if(dat<2313)Lux_dat=380;
else if(dat<2336)Lux_dat=390;
else if(dat<2357)Lux_dat=400;
else if(dat<2378)Lux_dat=410;
else if(dat<2398)Lux_dat=420;
else if(dat<2418)Lux_dat=430;
else if(dat<2437)Lux_dat=440;
else if(dat<2456)Lux_dat=450;
else if(dat<2475)Lux_dat=460;
else if(dat<2492)Lux_dat=470;
else if(dat<2509)Lux_dat=480;
else if(dat<2526)Lux_dat=490;
else if(dat<2543)Lux_dat=500;
else if(dat<2560)Lux_dat=510;
else if(dat<2575)Lux_dat=520;
else if(dat<2590)Lux_dat=530;
else if(dat<2605)Lux_dat=540;
else if(dat<2620)Lux_dat=550;
else if(dat<2635)Lux_dat=560;
else if(dat<2649)Lux_dat=570;
else if(dat<2663)Lux_dat=580;
else if(dat<2676)Lux_dat=590;
else if(dat<2689)Lux_dat=600;
else if(dat<2702)Lux_dat=610;
else if(dat<2715)Lux_dat=620;
else if(dat<2728)Lux_dat=630;
else if(dat<2749)Lux_dat=640;
else if(dat<2761)Lux_dat=650;
else if(dat<2763)Lux_dat=660;
else if(dat<2775)Lux_dat=670;
else if(dat<2786)Lux_dat=680;
else if(dat<2797)Lux_dat=690;
else if(dat<2808)Lux_dat=700;
else if(dat<2819)Lux_dat=710;
else if(dat<2829)Lux_dat=720;
else if(dat<2840)Lux_dat=730;
else if(dat<2850)Lux_dat=740;
else if(dat<2860)Lux_dat=750;
else if(dat<2869)Lux_dat=760;
else if(dat<2879)Lux_dat=770;
else if(dat<2888)Lux_dat=780;
else if(dat<2897)Lux_dat=790;
else if(dat<2906)Lux_dat=800;
else if(dat<2915)Lux_dat=810;
else if(dat<2924)Lux_dat=820;
else if(dat<2933)Lux_dat=830;
else if(dat<2941)Lux_dat=840;
else if(dat<2950)Lux_dat=850;
else if(dat<2958)Lux_dat=860;
else if(dat<2966)Lux_dat=870;
else if(dat<2974)Lux_dat=880;
else if(dat<2982)Lux_dat=890;
else if(dat<2989)Lux_dat=900;
else if(dat<2997)Lux_dat=910;
else if(dat<3004)Lux_dat=920;
else if(dat<3012)Lux_dat=930;
else if(dat<3019)Lux_dat=940;
else if(dat<3026)Lux_dat=950;
else if(dat<3033)Lux_dat=960;
else if(dat<3040)Lux_dat=970;
else if(dat<3047)Lux_dat=980;
else if(dat<3054)Lux_dat=990;
else
Lux_dat=1000;
return Lux_dat;
}
void KEY_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void EXTIx_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void)
{
set_num++;
if(set_num> 3)
{
set_num=0;
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
void EXTI1_IRQHandler(void)
{
if(set_num== 1)
{
if(set_temp_dat<100)
set_temp_dat++;
}
if(set_num== 2)
{
if(set_hum_dat<100)
set_hum_dat++;
}
if(set_num== 3)
{
if(set_light_dat<1000)
set_light_dat=set_light_dat+10;
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
void EXTI2_IRQHandler(void)
{
if(set_num== 1)
{
if(set_temp_dat>0)
set_temp_dat--;
}
if(set_num== 2)
{
if(set_hum_dat>0)
set_hum_dat--;
}
if(set_num== 3)
{
if(set_light_dat>10)
set_light_dat=set_light_dat-10;
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
void Relay_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);
}
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1,&ADC_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
uint16_t Read_Adc1(uint8_t ch)
{
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC1);
}
int main(void){
uint8_t count_i;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
KEY_IO_Init();
Relay_IO_Init();
EXTIx_Init();
LCD_init();
LCD_clr();
DHT11_Init();
ADC1_Init();
while(1){
count_i++;
{
if(DHT11_ReadData())
{
temp_dat=DHT11_GetTem();
temp_dat=temp_dat/256;
delay_ms(10);
hum_dat=DHT11_GetHum();
hum_dat=hum_dat/256;
}
light_dat=Read_Adc1(2); light_dat=Read_Adc1(2);
light_dat=light_intensity(light_dat);
sprintf(lcd_dat1,"T:%d H:%d L:%d\n",temp_dat,hum_dat,light_dat);
LCD_prints(0,1,lcd_dat1);
if(set_num==0)
{
sprintf(lcd_dat2,"%d %d %d \n",set_temp_dat,set_hum_dat,set_light_dat);
LCD_prints(0,0,lcd_dat2);
}
if(set_num== 1)
{
sprintf(lcd_dat2,"%d* %d %d \n",set_temp_dat,set_hum_dat,set_light_dat);
LCD_prints(0,0,lcd_dat2);
}
if(set_num== 2)
{
sprintf(lcd_dat2,"%d %d* %d \n",set_temp_dat,set_hum_dat,set_light_dat);
LCD_prints(0,0,lcd_dat2);
}
if(set_num== 3)
{
sprintf(lcd_dat2,"%d %d %d* \n",set_temp_dat,set_hum_dat,set_light_dat);
LCD_prints(0,0,lcd_dat2);
}
}
if(temp_dat>set_temp_dat)
Relay1=1;
else
Relay1=0;
if(hum_dat<set_hum_dat)
Relay2=1;
else
Relay2=0;
if(set_light_dat>light_dat)
{
buzzer =1;
}
else
buzzer =0;
}
return 0;
}
cpp
运行
网址:基于STM32单片机智能多功能衣柜除湿消毒控制系统设计(代码+仿真) https://www.yuejiaxmz.com/news/view/1335221
相关内容
基于stm32单片机多功能智能鞋柜基于STM32单片机的家庭温湿度防漏水系统设计(代码+仿真)
基于stm32单片机智能衣柜 杀菌消毒除湿通风蓝牙换气红外感应系统
基于STM32的智能衣柜系统设计
基于stm32单片机智能衣物护理系统设计
基于STM32单片机的多功能智能家居控制系统
基于STM32单片机智能消毒柜控制系统 紫外线杀菌 温湿度采集 蓝牙无线传输 物联网设计 柜门控制 定时 电机控制成品套件 DIY设计 实物+源程序+原理图+仿真+其它资料(847
基于单片机的智能消毒柜系统设计
基于STM32单片机的智能家居环境监测与控制系统设计
基于单片机智能家居收纳柜控制系统设计