一、主要功能介绍
以STM32F103C8T6单片机为控制核心,设计一款智能远程家电控制系统,该系统能实现如下功能:
1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关;
2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开关;
3、可利用传感器检测光照强度,并根据光强控制窗帘开关;
4、可利用传感器检测是否下雨并根据是否下雨控制窗户开关;5、根据不同的气候环境显示对应的天气;
6、分自动模式、手动模式、以及app控制,自动模式下实时检测传感器数据并根据设置的阈值做出自动操作,如温度过低、室内加热;手动模式下可以手动查看每个传感器检测的数据和手动打开相关的开关,app模式下,可以通过手机远程查看数据和操控照明灯、空调等开关。
其中:空调、加热器用继电器+LED进行模拟。
二、主要模块讲解
2.1 步进电机模拟窗帘的打开和关闭
步进电机的主要特性:1、 步进电机必须加驱动才可以运转, 驱动信号必须为脉冲信号,没有脉冲的时候,步进电机静止, 如果加入适当的脉冲信号, 就会以一定的角度(称为步角)转动。转动的速度和脉冲的频率成正比。2、 28BYJ48 5V 驱动的 4 相 5 线的步进电机,而且是减速步进电机,减 速比为 1:64,步进角为 5.625/64 度。如果需要转动 1 圈,那 么需要 360/5.625*64=4096 个脉冲信号。3、 步进电机具有瞬间启动和急速停止的优越特性。4、 改变脉冲的顺序, 可以方便的改变转动的方向。28BYJ48 、步进电机、单片机三者之间连接原理图
代码演示
.c文件
#include "BUJ.h" u8 dir;//电机转动方向 u8 dis;//电机转动距离 void TIM2_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM2, ENABLE); //使能TIMx外设 } //定时器1MS //TIM2_Int_Init(19,7199);//2MS系统定时 //步进电机IO初始化 void BUJ_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//完全关闭JTAG-DP 开启SW-DP GPIO_InitStructure.GPIO_Pin = BUJ1_GPIOPin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUJ1_GPIOX, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = BUJ2_GPIOPin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUJ2_GPIOX, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = BUJ3_GPIOPin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUJ3_GPIOX, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = BUJ4_GPIOPin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUJ4_GPIOX, &GPIO_InitStructure); TIM2_Int_Init(19,7199);//2MS系统定时 } /*********************** 函数名:Stepmotor_BeatSwitch 函数功能:节拍切换函数 形参:u8 dir 电机转向 LEFT RIGHT 返回值:void 函数说明: ************************/ void Stepmotor_BeatSwitch(u8 dir) { static u8 cnt=0; if(dir == LEFT) { switch(++cnt) { case 1:BEAT1;break; case 2:BEAT2;break; case 3:BEAT3;break; case 4:BEAT4;break; } } if(dir == RIGHT) { switch(++cnt) { case 1:BEAT4;break; case 2:BEAT3;break; case 3:BEAT2;break; case 4:BEAT1;break; } } cnt %=4; } /*********************** 函数名:Stepmotor_Stop 函数功能:步进电机停转 形参:void 返回值:void 函数说明: ************************/ void Stepmotor_Stop(void) { BUJ1=0; BUJ2=0; BUJ3=0;BUJ4=0; } /*********************** 函数名:Stepmotor_Control 函数功能:步进电机控制函数 形参:s8 distance 返回值:void 函数说明: 1、distance = 0 电机停转 TIM2关闭 2、distance > 0 电机左转 TIM2开启 3、distance < 0 电机右转 TIM2开启 u8 dir;//电机转动方向 u8 dis;//电机转动距离 ************************/ u8 curtain=0;//窗帘标志位 void Stepmotor_Control(s8 distance) { if(distance == 0) { TIM_Cmd(TIM2, DISABLE);//失能定时器 Stepmotor_Stop();//停止转动 } else if(distance>0) { TIM_Cmd(TIM2, ENABLE);//使能定时器 dir=LEFT;//左转 dis=distance; curtain = 1; } else if(distance<0) { TIM_Cmd(TIM2, ENABLE);//使能定时器 dir=RIGHT;//右转转 dis=-distance; curtain = 0; } } /*中断标志必须清除,否则程序卡死*/ //2ms更新一次 //定时器2中断服务程序 void TIM2_IRQHandler(void) //TIM3中断 { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 static u16 num=0;//记录更新次数 Stepmotor_BeatSwitch(dir); num++; //计算行程 if(num >= dis*32) { num=0; TIM_Cmd(TIM2, DISABLE);//失能定时器 Stepmotor_Stop();//停止转动 } } }
.h文件
#ifndef __BUJ_H #define __BUJ_H #include "includes.h" #define BUJ1_GPIOX GPIOA #define BUJ1_GPIOPin GPIO_Pin_12 //4 #define BUJ2_GPIOX GPIOA #define BUJ2_GPIOPin GPIO_Pin_15 //3 #define BUJ3_GPIOX GPIOB #define BUJ3_GPIOPin GPIO_Pin_3 //2 #define BUJ4_GPIOX GPIOB #define BUJ4_GPIOPin GPIO_Pin_4 //1 #define BUJ1 PAout(12) #define BUJ2 PAout(15) #define BUJ3 PBout(3) #define BUJ4 PBout(4) //节拍宏定义 #define BEAT1 {BUJ1=1; BUJ2=0; BUJ3=0;BUJ4=0;} #define BEAT2 {BUJ1=0; BUJ2=1; BUJ3=0;BUJ4=0;} #define BEAT3 {BUJ1=0; BUJ2=0; BUJ3=1;BUJ4=0;} #define BEAT4 {BUJ1=0; BUJ2=0; BUJ3=0;BUJ4=1;} #define LEFT 7 //左转 #define RIGHT 8 //右转 extern u8 dir;//电机转动方向 extern u8 curtain; void BUJ_Init(void);//初始化 void TIM2_Int_Init(u16 arr,u16 psc); void Stepmotor_Control(s8 distance); #endif
2.2 光敏电阻、雨滴传感器讲解
2、1 模块特性
1. 光敏电阻模块对环境光线最敏感,一般用来检测周围环境的光线的亮度,触发单片机或继电器模块等;
2. 模块在环境光线亮度达不到设定阈值时,DO 端输出高电平,当外界环境光线亮度超过设定阈值时,DO
端输出低电平;
3. DO 输出端可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的光线亮度改变;
4. DO 输出端可以直接驱动继电器模块,由此可以组成一个光控开关。
2.2 接口说明
VCC:外接3.3V-5.0V
GND:接地
DO:开关信号输出(0和1)
AO:模拟电压输出
三、转换公式
通过adc模数转化,获取到采样值,然后通过占比,获取到我们电压值,亦可将3.3换为100,将光照强度转化为百分比。