【单片机毕业设计】【mcuclub-jj-008】智能窗户 | 多功能窗户 | 自动窗户

本文详细介绍了设计的基于单片机的智能窗户控制系统,包括功能模块、51系列和STM32F103C8T6单片机应用、传感器数据采集、人机交互、自动化控制及软件设计过程,展示了如何通过单片机实现窗户的自动开关和数据监测显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近设计了一个项目基于单片机的智能窗户 | 多功能窗户 | 自动窗户控制系统,与大家分享一下:
一、基本介绍
项目名:基于单片机的智能窗户控制系统设计

             基于单片机的多功能窗户控制系统设计

             基于单片机的自动窗户控制系统设计

项目编号:mcuclub-jj-008

单片机类型:STC89C52、STM32F103C8T6

具体功能:

1、通过DS18B20获取温度值,当温度小于设置的最小值,自动关窗
2、通过风速传感器获取风速值,当风速大于设置的最大值,自动关窗
3、通过雨量传感器获取雨量值,当雨量大于设置的最大值,自动关窗
4、通过光敏电阻获取光照值,当光照值小于设置的最小值,自动关窗
5、通过人体热释电感应模块检测窗外是否有人,有人,则自动关窗
6、通过四相步进电机模拟开关窗
7、通过按键设置各阈值、手动开关窗、切换模式
8、通过OLED显示测量值、模式、窗户状态

二、51实物图
单片机型号:STC89C52

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C

三、51仿真图
仿真软件版本:proteus8.9

电路连线方式:网络标号连线方式

注意:部分实物元器件仿真中没有,仿真中会用其他工作原理相似的元件代替,这样可能导致实物程序和仿真程序不一样

四、32实物图
单片机型号:STM32F103C8T6

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C

 五、原理图
软件版本:AD2013

电路连线方式:网络标号连线方式

注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图

 六、PCB图
由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,
隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。

七、系统框图

本设计以单片机为核心控制器,加上其他模块一起组成此次设计的整个系统,其中包括中控部分、输入部分和输出部分。中控部分采用了单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。输入由七部分组成,第一部分是温度检测模块,通过该模块检测当前环境的温度;第二部分是风速检测模块,通过该模块检测当前环境的风速;第三部分是雨量检测模块,通过该模块检测当前环境的雨量;第四部分是光照强度检测模块,通过该模块检测当前环境的光照;第五部分是人体热释电感应检测模块,通过该模块检测是否有人靠近;第六部分是按键模块,通过该模块可以切换界面、设置阈值、切换模式等;第七部分是供电模块,通过该模块可给整个系统进行供电。输出由两部分组成,第一部分是显示模块,通过该模块可以显示监测的数据以及设置的阈值;第二部分是步进电机,通过步进电机模拟开关窗。除此之外,蓝牙模块既作为输入又作为输出,蓝牙模块和手机进行连接,可以将监测的数据传输到用户手机端,用户也可以通过手机端发送指令控制继电器的工作及其模式的切换。

 八、软件设计流程

 九、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件

/****
*******监测函数
*****/
void Monitor_function(void)
{
    char fasong[32];
    if(flag_display == 0)                                                                                            //测量界面
    {
        if(time_num % 2 == 0)                                                                                        //约400ms检测一次
        {
            temp_value = DS18B20_Get_Temp();                                                            //获取温度
            
            fengsu_value = 27*((Get_Adc_Average(0,3)/4096.0)*3.3);                //获取风速
            if(fengsu_value >= 1)
                fengsu_value -= 1;
            
            yuliang_value = 60*3.3-60*((Get_Adc_Average(1,3)/4096.0)*3.3);//获取雨量
            
            light_value = 30*((Get_Adc_Average(2,3)/4096.0)*3.3);                    //获取光照
        }
    }
    if(time_num % 20 == 0)                                                                                        //约4s发送一次
    {
        sprintf(fasong,"温度:%d.%d℃",temp_value/10,temp_value%10);
        UsartPrintf(USART1,fasong);
        sprintf(fasong,"风速:%dm/s",fengsu_value);
        UsartPrintf(USART1,fasong);        
        sprintf(fasong,"雨量:%dmm",yuliang_value);
        UsartPrintf(USART1,fasong);        
        sprintf(fasong,"光照:%dLx",light_value);
        UsartPrintf(USART1,fasong);        
        
    }    
    if(USART1_WaitRecive() == 0)
    {
        if(strstr((char*)usart1_buf,"A") != NULL)            //切换自动模式
        {
            flag_mode = 0;            
        }
        else if(strstr((char*)usart1_buf,"B") != NULL)//开关窗    
        {        
            flag_window = !flag_window;    
            flag_mode = 1;        
        }    
        USART1_Clear();
    }    
}

/****
*******显示函数
*****/
void Display_function(void)
{
    switch(flag_display)                                                                    //根据不同的显示模式标志位,显示不同的界面
    {
        case 0:                                                                                            //界面0:测量界面,显示各测量值、模式
            Oled_ShowCHinese(1, 0, "温度");
            sprintf(display_buf,":%d.%dC  ",temp_value/10,temp_value%10);
            Oled_ShowString(1, 4, display_buf);
            Oled_ShowCHinese(2, 0, "风速");
            sprintf(display_buf,":%dm/s  ",fengsu_value);
            Oled_ShowString(2, 4, display_buf);    
            Oled_ShowCHinese(3, 0, "雨量");
            sprintf(display_buf,":%dmm  ",yuliang_value);
            Oled_ShowString(3, 4, display_buf);    
            Oled_ShowCHinese(4, 0, "光照");
            sprintf(display_buf,":%dLx  ",light_value);
            Oled_ShowString(4, 4, display_buf);    
        
            if(MAN == 0)
                Oled_ShowCHinese(2,6,"有人");
            else
                Oled_ShowCHinese(2,6,"无人");        
            
//            Oled_ShowCHinese(4, 0, "模式:");
            if(flag_mode == 0)
                Oled_ShowCHinese(3,6,"自动");
            else
                Oled_ShowCHinese(3,6,"手动");

            if(flag_window == 0)        //窗户状态
                Oled_ShowCHinese(4,6,"打开");
            else
                Oled_ShowCHinese(4,6,"关闭");    
            
        break;

        case 1:                                                                                                //界面1:显示设置温度最小值
            Oled_ShowCHinese(1,0,"设置温度最小值");
            if(time_num % 5 == 0)
            {
                sprintf(display_buf,"%d  ",temp_min);
                Oled_ShowString(2, 6, display_buf);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(2, 6, "    ");
            }
        break;
            
        case 2:                                                                                                //界面2:显示设置风速最大值
            Oled_ShowCHinese(1,0,"设置风速最大值");
            if(time_num % 5 == 0)
            {
                sprintf(display_buf,"%d  ",fengsu_max);
                Oled_ShowString(2, 6, display_buf);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(2, 6, "    ");
            }
        break;

        case 3:                                                                                                //界面3:显示设置雨量最大值
            Oled_ShowCHinese(1,0,"设置雨量最大值");
            if(time_num % 5 == 0)
            {
                sprintf(display_buf,"%d  ",yuliang_max);
                Oled_ShowString(2, 6, display_buf);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(2, 6, "    ");
            }
        break;

        case 4:                                                                                                //界面4:显示设置光照最小值
            Oled_ShowCHinese(1,0,"设置光照最小值");
            if(time_num % 5 == 0)
            {
                sprintf(display_buf,"%d  ",light_min);
                Oled_ShowString(2, 6, display_buf);
            }
            if(time_num % 10 == 0)
            {
                Oled_ShowString(2, 6, "    ");
            }
        break;            
        default:
        break;
    }
}

/****
*******处理函数
*****/
void Manage_function(void)
{
    if(flag_display == 0)                                    //测量界面
    {
        if(flag_mode == 0)                                    //如果处于自动模式
        {
            if( temp_value < temp_min*10||         //温度/光照小于最小值或风速/雨量大于最大值,关闭窗户
                fengsu_value > fengsu_max ||
            yuliang_value > yuliang_max ||
                    light_value < light_min    || MAN == 0 )    
            {
                if(flag_window_status == 0)
                {
                    Motor_Reversal();
                    flag_window_status = 1;
                    flag_window = 1;
                }
            }
            else
            {
                if(flag_window_status == 1)            //否则,开窗
                {
                    flag_window_status = 0;
                    flag_window = 0;
                    Motor_Foreward();
                }
            }
        }
    else                                                                //手动模式根据按键按下控制电机
        {    
            switch(flag_window)
            {            
                case 0:                                                    //0:电机正转,开窗
                    if(flag_window_status == 1)
                        Motor_Foreward();
                    flag_window_status = 0;
                break;
                
                case 1:                                                    //1:电机反转,关窗
                    if(flag_window_status == 0)
                        Motor_Reversal();
                    flag_window_status = 1;
                break;
                        
                default:
                break;
            }                
        }
    }
}

 

http://资料点击该链接到官网下载:www.mcubee.comicon-default.png?t=N7T8http://资料点击该链接到官网下载:www.mcubee.com 

智能窗户 AT89S52 1602显示 步进电机转动模拟开窗关窗 (1)手动控制:该功能是根据用户的需求通过按键进行窗帘的开关,此功能可以使窗帘的开闭处于任何一种状态; (2)光照自动控制:系统可以根据用户设定的光照强度值通过感光器采集光照自动开关窗帘; (3)时间控制:此功能是根据用户设定的时间一次性开关窗帘,并显示当前温度。 (4)温度报警系统:可以自行设置温度报警温度。 (5)时间显示及闹钟系统:可以自行设置闹钟时间。 (6)手动自动控制按键随时切换 所有资料,按照制作即可完成 目录构成: Altium Designer Sunner画图学习视频 AltiumDesignerSummer9 画图安装包 keil 软件安装视频 keil4软件安装包 LIST.TXT Protel 99 软件安装包 Protel 99画图软件学习视频 Proteus7.5软件安装包 PROTEUS仿真软件的安装方法 proteus入门到精通学习视频 STC开发工具程序下载软件 制作过程 单片机工程项目的建立视频 原理图 打开方式.txt 外文文献翻译.doc 开题报告.doc 智能窗帘原理图讲解视频 智能窗帘源程序讲解视频 智能窗户下载文件 智能窗户系统仿真图 智能窗户设计使用必读 智能窗户设计焊接介绍 智能窗户设计系统.txt 智能窗户设计系统元器件清单 智能窗户设计系统原理图 智能窗户设计系统参考论文 智能窗户设计系统开题报告 智能窗户设计系统源程序 智能窗户设计系统芯片资料 智能窗户设计高清照片 毕业论文查重不达标-修改过关技巧.doc 毕设答辩技巧 程序打开方法.txt 答辩常见问题解答 郝斌老师C语言学习视频 郭天祥单片机学习视频 雨滴传感器模块电路图.pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机俱乐部宣传账号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值