节能风扇可实现的功能 (1)智能风扇可通过温度检测到即时室温,然后根据室温的高低以及设定的温度对扇叶的转速进行自我调节。比如设定的温度为20度,则室温为21度时,风扇转速慢,室温为22度时,风扇转速变快,室温为23度时,风扇转速更快,以此类推。 (2)智能风扇可通过红外传感器感受人的存在,无人时可自动关闭,节省能源。 (3)通过设定时间,定时关闭风扇 (4)风扇有普通模式,可以设置为快档,中档,慢档,跟普通风扇一样,不受温度影响。 (5)本系统装配安卓客户端,可以进行一些相关功能的控制,简单方便。
方案框图如下:
蓝牙采用HC-06,如下图:
温度传感器DS18B20与时钟芯片DS1302如下:
智能模式下,没人的时候,液晶显示nobody,风扇不转。
智能模式下:当count计时达到00:10:00时,风扇停止转动。
普通模式下:快档,中档,停止档
DS18B20和DS1302说明: 工程采用STM32CubeMx软件产生,引脚配置如下:其他配置默认。
DS1302接线说明: SCLK-----------------------PC0 DATA-----------------------PC1 RST-------------------------PC2 函数使用方法说明: 1.ds1302初始化。 函数如下: void Init_DS1302(char year,char month,charday,char hour,char minute,char second,char flag); 注意:年year输入后两位;最后一个flag指的是:如果ds1302没有外接锂电池,程序每次都初始化,那么flag=0;如果有外接锂电池,程序只需第一次上电初始化,那么flag=1; 比如Init_DS1302(15,2,12,17,4,34,0); 则表示初始化时间为:15年2月12日17点4分34秒,程序每次上电都将ds1302时间初始化。 2.获取时间 char year, month, day, hour, minute, second; year= getDS1302_year();//获取年的后两位 month = getDS1302_ month ();//获取月 day = getDS1302_ day ();//获取日 hour = getDS1302_ hour ();//获取小时 minute = getDS1302_ minute ();//获取分钟 second = getDS1302_ second ();//获取秒 DS18B20说明: DATA---------------------PC3 函数使用说明: flaot Temperature; Temperature= DS18B20_GetTemp();//获取温度
参考程序见附件 现象如下:
串口说明: 采用串口2 STM32CubeMx配置如下:
只需要将Nucleo板子通过usb插在电脑上即可,无需其他硬件。 本程序实现:电脑串口助手将字符串(固定长,如需改变长度,可在程序中更改)发给STM32F411板子,然后STM32F411板子将接收到的字符串发给定脑的串口助手。 测试程序如下: uint8_t Rdata[20]; while (1) { if(HAL_UART_Receive(&huart2,Rdata, 13, 1000)==HAL_OK) { HAL_UART_Transmit(&huart2,Rdata, 13, 1000); } } 函数的说明可以查看头文件stm32f4xx_hal_uart.h中的函数声明。
结果如下:
参考程序见附件
风扇转速控制采用PWM调速。 有关PWM部分示例代码:以按键控制PWM占空比为例: 首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。
定时器PWM模式配置
按键IO配置
然后生成Keil工程。 用Keil打开。 首先修改有关PWM方面的代码。 PWM初始化代码如下: /* TIM10 init function */ void MX_TIM10_Init(void) { TIM_OC_InitTypeDef sConfigOC;
htim10.Instance = TIM10; htim10.Init.Prescaler = 0; htim10.Init.CounterMode = TIM_COUNTERMODE_UP; htim10.Init.Period = 0; htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim10);
HAL_TIM_PWM_Init(&htim10);
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1); }
查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下:
从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。 比如将改变一下两个语句: htim10.Init.Period = 1000; sConfigOC.Pulse = 200; 便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%。 要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:
修改此函数之后,前面的函数声明也要改。改为:static void MX_TIM10_Init(int period,intpulse);
要想PWM工作,需要启动PWM。查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:
这是PWM启动与停止的函数。 最后看看按键,只需要把按键配置为上拉模式就好。 在按键初始化中,将 GPIO_InitStruct.Pull= GPIO_NOPULL; 改为 GPIO_InitStruct.Pull= GPIO_PULLUP;
接下来便可以写主函数。
int main(void) {
/* USER CODE BEGIN 1 */ int i=100; /* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init();
/* Configure the system clock */ SystemClock_Config();
/* System interrupt init*/ /* Sets the priority grouping field */ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
/* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM10_Init(1000,100);//PWM初始化
/* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM /* USER CODE END 2 */
/* USER CODE BEGIN 3 */ /* Infinite loop */ while (1) { if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下 { i=i+100; if(i==1000) i=100; HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放 } } /* USER CODE END 3 */
}
编译程序,下载程序,可以看到现象: |