STM32智能晾衣架(机智云)

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

PCB图

五、程序设计

[六、实验效果 ​编辑](#六、实验效果 编辑)

七、包含内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1prXnB8EdU/?spm_id_from=333.1387.homepage.video_card.click&vd_source=199aed5297a00e80e1faf7e270afe8d7

(资料分享见文末)

二、项目简介

1.功能详解

基于STM32的智能晾衣架(机智云)

功能如下:

  1. STM32F103C8T6单片机作为主控单元
  2. 环境监测:采集环境温湿度、光照强度、是否有雨/有人等等
  3. 显示功能:OLED屏幕显示当前时间、显示环境信息数据
  4. 模式切换:通过按键可切换自动模式和手动模式
  5. 自动模式:自动模式下定时时间内开启晾衣架,如果光照强度低于阈值、湿度高于阈值、有雨或者有人靠近,自动关闭晾衣架,定时时间外晾衣架始终关闭,防盗开关开启下如果有人闯入会开启蜂鸣器报警
  6. 手动模式:手动模式下通过按键可控制晾衣架和灯光的开关
  7. 阈值调节:通过按键进入系统设置界面,可修改当前时间、修改各参数阈值和定时开关晾衣架的时间、可设置防盗开关
  8. 机智云:通过WIFI模块连接APP来接收环境信息数据与控制指令下发

2.主要器件

  • STM32F103C8T6单片机
  • OLED 屏幕
  • DHT11温湿度传感器
  • 光敏传感器
  • 雨滴传感器
  • 光电红外传感器
  • ESP8266模块(WIFI)
  • 步进电机
  • 有源蜂鸣器
  • LED指示灯

三、原理图设计

四、PCB硬件设计

PCB图

五、程序设计

cpp 复制代码
#include "stm32f10x.h"         
#include "sys.h"               
#include "led.h"               
#include "beep.h"              
#include "usart.h"             
#include "delay.h"             
#include "dht11.h"             
#include "oled.h"              
#include "key.h"               
#include "Modules.h"           
#include "TIM2.h"              
#include "adcx.h"              
#include "stepmotor.h"         
#include "HW.h"                
#include "rain.h"              
#include "hhrtc.h"             
#include "usart2.h"
#include "usart3.h"
#include <stdio.h>             
#include <stdlib.h>            
#include <string.h>            
#include "TIM3.h" 
#include "gizwits_product.h"         
#include "gizwits_protocol.h"   

/****************异方辰电子工作室******************
					  STM32
											
 * 项目			:	STM32智能晾衣架(机智云版)                 
 * 版本			:   V2.0
 * 日期			:   2026.3.11
 * MCU			:	STM32F103C8T6
 * 接口			:	见代码		
 * IP账号		:	异方辰电子/辰哥单片机设计(同BILIBILI|抖音|快手|小红书|CSDN|公众号|视频号等)
 * 作者			:	辰哥 
 * 工作室		:   异方辰电子工作室
 * 授权IP	 	:	辰哥单片机设计、异方辰电子、YFC电子、异方辰系列 
 * 官方网站    	:	www.yfcdz.cn	

**********************BEGIN***********************/


#define KEY_Long1	11           // 定义KEY1长按的按键值为11
#define KEY_1	1               // 定义KEY1短按的按键值为1
#define KEY_2	2               // 定义KEY2短按的按键值为2
#define KEY_3	3               // 定义KEY3短按的按键值为3
#define KEY_4	4               // 定义KEY4短按的按键值为4
#define FLASH_START_ADDR	0x0801f000	// FLASH写入的起始地址(备用)

#define AUTO_MODE     1   // 自动模式
#define MANUAL_MODE   2   // 手动模式
#define SETTINGS_MODE 3   // 设置模式

SensorModules sensorData;								// 声明传感器数据结构体变量(存储温湿度、光照、人体、雨滴等数据)
SensorThresholdValue Sensorthreshold;		// 声明传感器阈值结构体变量(存储各参数阈值)
DriveModules driveData;									// 声明驱动器状态结构体变量(存储LED、窗帘电机等状态)

uint8_t mode = 1;	//系统模式  1=自动模式  2=手动模式  3=设置模式
u8 openFlag = 0;    // 开启标志位(备用)
u8 shuaxin  = 0;    // OLED数据刷新标志位1(1秒刷新)
u8 shuaxin1 = 0;    // OLED数据刷新标志位2(1.5秒刷新,备用)
u8 sendFlag = 0;    // 串口数据发送标志位(1秒上传一次传感器数据)
u8 dakai;           // 串口3使用的传递变量(备用)
u8 Flag_dakai;      // 串口3接收标志位(备用)
u8 setHumiLight=0;  // 湿度/光照阈值修改标志位(修改后标记上传)
uint8_t fandao = 1; // 防盗系统开关:1=开启 0=关闭
uint8_t fandaoflag = 0; // 防盗报警标志位:1=报警(蜂鸣器响)0=正常

//系统静态变量(仅当前文件使用)
static uint8_t count_a = 1;  // 自动模式下KEY2按键计数(切换子页面)
 uint8_t count_m = 1;  // 手动模式下KEY2按键计数(切换子页面)
static uint8_t count_s = 1;	 // 设置模式下KEY2按键计数(切换子页面)

uint8_t motor_flag_last = 0;    // 上一次窗帘电机状态值(初始与driveData.MOTOR_Flag一致)
uint8_t motor_rotate_done = 1;  // 电机转动执行完成标志:1=已完成 0=未完成(上电初始完成)


int main(void)
{ 

    SystemInit();
    
    delay_init(72);
    USART1_Config();   // 之后 printf 才能用
    ADCX_Init();

    NVIC_Configuration();

    MyRTC_Init();
   

    USART2_Config();

    USART3_Config();

    LED_Init();

    Key_Init();

    MOTOR_Init();

    OLED_Init();

    DHT11_Init();

    HW_Init();

    RAIN_Init();
  
    BEEP_Init();

    TIM2_Init(99,719);
  
    TIM3_Int_Init(1000-1,72-1);
   
  //  sensorData.lux = LDR_LuxData();
   
    OLED_Clear();
	
	// 阈值/定时参数初始化
	Sensorthreshold.shi = 20;    
	Sensorthreshold.fen = 0;     
	Sensorthreshold.miao = 0;    
	Sensorthreshold.shix = 21;   
	Sensorthreshold.fenx = 00;   
	Sensorthreshold.miaox = 00;  
	Sensorthreshold.tempValue = 25; 
	Sensorthreshold.humiValue = 60; 
	Sensorthreshold.luxValue =50;   

	
  #define AUTO_PAGE_MAX       2       
  #define MANUAL_PAGE_MAX     2       
  #define SETTINGS_PAGE_1_END 4       
  #define SETTINGS_PAGE_2_END 7       
  #define SETTINGS_PAGE_3_END 10      
  #define SETTINGS_PAGE_MAX   13      
  #define OLED_CLEAR_DELAY    150     


  
		
    userInit();       // 机智云用户初始化(数据点初始化等)
    gizwitsInit();    // 机智云协议初始化(WiFi配网、数据通信初始化)
	  gizwitsSetMode(WIFI_AIRLINK_MODE); //默认一键配网
	  delay_ms(200);
	
    printf("Start \n"); 
    gizwitsHandle((dataPoint_t *)&currentDataPoint);
    ScanGizwitsMode();

    delay_ms(200);
  printf("3\n"); 

while (1)
{ 
  gizwitsHandle((dataPoint_t *)&currentDataPoint);
     
    SensorScan();               // 扫描所有传感器(温湿度、光照、人体、雨滴),更新sensorData结构体数据
    MyRTC_ReadTime();     
				
    uint8_t auto_page = 0;      // 自动模式子页面编号缓存
    uint8_t manual_page = 0;    // 手动模式子页面编号缓存
    uint8_t settings_page = 0;  // 设置模式子页面编号缓存

    // 模式逻辑重构:按「按键处理→页面绘制→数据显示→逻辑控制→模式切换」分层执行
    switch(mode)                // 根据系统模式(1=自动/2=手动/3=设置)执行对应逻辑
    {  
        case AUTO_MODE: // 自动模式(值为1)
            // 1. 按键处理:调用SetAuto获取KEY2切换的子页面数,缓存到auto_page(仅调用1次)
            auto_page = SetAuto();

            // 2. 页面绘制+数据显示:仅在有效子页面范围内执行(最大2页)
            if(auto_page <= AUTO_PAGE_MAX)
            {
                OLED_autoPage1();          // 绘制自动模式页面1的固定文字(时间/温度/湿度等标题)
                SensorDataDisplay1();      // 显示自动模式页面1的传感器实时数据(时间、温湿度、人体/雨滴状态)
            }

            // 3. 核心控制逻辑:自动模式下的硬件控制
            AutoControl();                // 执行自动模式控制逻辑(窗帘自动开关、防盗报警)
            Control_Manager();            // 硬件输出控制(LED、蜂鸣器、窗帘电机执行)

            // 4. 模式切换按键处理:检测KEY1短按/长按,切换模式
            // 短按KEY1:从自动模式切换到手动模式
            if (KeyNum == KEY_1)
            {
                KeyNum = 0;               // 清空按键值,避免重复触发
                mode = MANUAL_MODE;       // 切换系统模式为手动模式
                count_m = 1;              // 重置手动模式子页面计数为1
                OLED_Clear();             // 清空OLED屏幕,准备显示手动模式界面
                delay_ms(OLED_CLEAR_DELAY); // 清屏后延时150ms,避免OLED闪屏
            }
            // 长按KEY1:从自动模式切换到设置模式
            else if (KeyNum == KEY_Long1)
            {
                KeyNum = 0;               // 清空按键值,避免重复触发
                mode = SETTINGS_MODE;     // 切换系统模式为设置模式
                count_s = 1;              // 重置设置模式子页面计数为1
                OLED_Clear();             // 清空OLED屏幕,准备显示设置模式界面
                delay_ms(OLED_CLEAR_DELAY); // 清屏后延时150ms,避免OLED闪屏
            }
            break; // 自动模式逻辑结束,跳出switch

        case MANUAL_MODE: // 手动模式(值为2)
            // 1. 按键处理:调用SetManual获取KEY2切换的子页面数,缓存到manual_page(仅调用1次)
            manual_page = SetManual();

            // 2. 页面绘制+数据显示:先显示选择符号,再绘制页面内容
            OLED_manualOption(manual_page);  // 显示手动模式当前选中项的>符号(灯光/窗帘)
            if(manual_page <= MANUAL_PAGE_MAX) // 仅处理有效页面(原代码<=4为冗余,实际只有2页)
            {
                OLED_manualPage1();          // 绘制手动模式页面1的固定文字(灯光/窗帘标题)
                ManualSettingsDisplay1();    // 显示手动模式页面1的参数(灯光/窗帘的开/关状态)
            }

            // 3. 核心控制逻辑:手动模式下的硬件控制
            ManualControl(manual_page);     // 执行手动模式控制逻辑(KEY3/KEY4控制灯光/窗帘开关)
            Control_Manager();              // 硬件输出控制(LED、蜂鸣器、窗帘电机执行)

            // 4. 模式切换按键处理:短按KEY1切回自动模式
            if (KeyNum == KEY_1)
            {
                KeyNum = 0;               // 清空按键值,避免重复触发
                mode = AUTO_MODE;         // 切换系统模式为自动模式
                count_a = 1;              // 重置自动模式子页面计数为1
                OLED_Clear();             // 清空OLED屏幕,准备显示自动模式界面
                delay_ms(OLED_CLEAR_DELAY); // 清屏后延时150ms,避免OLED闪屏
            }
            break; // 手动模式逻辑结束,跳出switch

        case SETTINGS_MODE: // 设置模式(值为3)
            // 1. 按键处理:调用SetSelection获取KEY2切换的子页面数,缓存到settings_page(仅调用1次)
            settings_page = SetSelection();

            // 2. 页面绘制+数据显示(按页面分段处理,逻辑更清晰)
            OLED_settingsOption(settings_page); // 显示设置模式当前选中项的>符号/时间选择标记
            ThresholdSettings(settings_page);   // 执行阈值调节逻辑(KEY3/KEY4修改选中项的数值)

            // 页面1:基础阈值设置(温度/湿度/光照/防盗系统)
            if(settings_page <= SETTINGS_PAGE_1_END)
            {
                OLED_settingsPage1();          // 绘制设置页面1的固定文字(温度/湿度/光照/防盗阈值标题)
                SettingsThresholdDisplay1();   // 显示设置页面1的参数(各阈值数值、防盗开关状态)
            }
            // 页面2:系统当前时间设置
            else if(settings_page <= SETTINGS_PAGE_2_END)
            {
                OLED_settingsPage2();          // 绘制设置页面2的固定文字(当前时间标题、分隔符)
                SettingsThresholdDisplay2();   // 显示设置页面2的参数(当前时/分/秒数值)
            }
            // 页面3:定时开启时间设置
            else if(settings_page <= SETTINGS_PAGE_3_END)
            {
                OLED_settingsPage3();          // 绘制设置页面3的固定文字(开启时间标题、分隔符)
                SettingsThresholdDisplay3();   // 显示设置页面3的参数(开启时/分/秒数值)
            }
            // 页面4:定时关闭时间设置
            else if(settings_page <= SETTINGS_PAGE_MAX)
            {
                OLED_settingsPage4();          // 绘制设置页面4的固定文字(关闭时间标题、分隔符)
                SettingsThresholdDisplay4();   // 显示设置页面4的参数(关闭时/分/秒数值)
            }

            // 3. 核心控制逻辑(设置模式无硬件输出,仅修改参数,无执行代码)

            // 4. 模式切换按键处理:短按KEY1切回自动模式
            if (KeyNum == KEY_1)
            {
                KeyNum = 0;               // 清空按键值,避免重复触发
                mode = AUTO_MODE;         // 切换系统模式为自动模式
                count_a = 1;              // 重置自动模式子页面计数为1
                OLED_Clear();             // 清空OLED屏幕,准备显示自动模式界面
                delay_ms(OLED_CLEAR_DELAY); // 清屏后延时150ms,避免OLED闪屏
               // UsartSendReceiveData(); // 模式切换时补1次串口调用,确保数据同步上传
            }
            break; // 设置模式逻辑结束,跳出switch

        default: // 异常模式保护:防止模式值错误导致程序异常
            mode = AUTO_MODE;             // 默认切回自动模式
            count_a = 1;                  // 重置自动模式子页面计数为1
            OLED_Clear();                 // 清空OLED屏幕,恢复正常显示
            delay_ms(OLED_CLEAR_DELAY);   // 清屏后延时150ms,避免OLED闪屏
            break; // 异常模式处理结束,跳出switch
    }
			userHandle();

  }
}

六、实验效果

七、包含内容

项目分享

https://pan.baidu.com/s/1k6DdYeGCRFcRC7VUnme9Zw?pwd=kwar

提取码: kwar

相关推荐
v先v关v住v获v取3 小时前
电脑显示器后壳注塑模具设计6张cad+设计说明书+三位图
科技·单片机·51单片机
llilian_163 小时前
gPTP时钟模块 gPTP时钟同步模块核心优势与全场景应用解析 PTP主时钟 ptp授时卡
功能测试·单片机·测试工具
桌面运维家3 小时前
Windows 10 USB安全:恶意设备识别与访问控制详解
windows·单片机·安全
weixin_669545203 小时前
JZ55182升压型2节锂电池充电芯片,替代SY6982
人工智能·嵌入式硬件·硬件工程·信息与通信
三佛科技-187366133973 小时前
FT8493PA/FT8493KA系列芯片如何选型?两者之间共同点和差异分析
单片机·物联网
九鼎创展科技3 小时前
发科MT8791(Genio 520)处理器技术详解 及同平台芯片横向对比与最优选型
人工智能·科技·嵌入式硬件·架构·边缘计算
2201_756206344 小时前
STM32F407 + ML307 阿里云接入
stm32·嵌入式硬件·阿里云
FreakStudio12 小时前
0 元学嵌入式 GUI!保姆级 LVGL+MicroPython 教程开更,从理论到实战全搞定
python·单片机·嵌入式·面向对象·电子diy
yongui4783414 小时前
基于STM32的Lora SX1278程序设计与实现
stm32·单片机·嵌入式硬件