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

相关推荐
蓝斯4979 小时前
从.到实现一个Windows上的虚拟hid键盘设备
windows·单片机·计算机外设
熙芯XiChip9 小时前
硬实时与软实时RTOS核心区别
嵌入式硬件
伟大的前程10 小时前
unsigned int 定义的变量 在 电脑的 64 位系统中 和 32 位 cortex-m0 和 8 位的 51 单片机
单片机·嵌入式硬件
小渔村的拉线工10 小时前
1.HPM6E80 解析芯片整体工作原理和存储架构
单片机·嵌入式硬件·mcu·架构·hpm6e80
熙芯XiChip11 小时前
CAN与CANopen的本质区别
单片机
lilihewo11 小时前
Altium Designer 封装库的创建(分享pcb 3D封装库)
嵌入式硬件·51单片机
神罚天下ET12 小时前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
碧海银沙音频科技研究院13 小时前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
Zevalin爱灰灰14 小时前
模拟信号链电路——基于TL431的电压基准电路
单片机·嵌入式硬件
csdn杰哥14 小时前
瑞萨单片机开发教程[二十七] DTC 外部中断触发传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5