[STM32F4] 【Nucleo设计分享】智能节能风扇

[复制链接]
3111|9
 楼主| hjl240 发表于 2015-2-12 21:29 | 显示全部楼层 |阅读模式
本帖最后由 hjl240 于 2015-5-7 19:02 编辑

方案框图如下:
方框图.png

节能风扇可实现的功能
(1)智能风扇可通过温度检测到即时室温,然后根据室温的高低以及设定的温度对扇叶的转速进行自我调节。比如设定的温度为20度,则室温为21度时,风扇转速慢,室温为22度时,风扇转速变快,室温为23度时,风扇转速更快,以此类推。
(2)智能风扇可通过红外传感器感受人的存在,无人时可自动关闭,节省能源。
(3)通过设定时间,定时关闭风扇
(4)风扇有普通模式,可以设置为快档,中档,慢档,跟普通风扇一样,不受温度影响。
(5)本系统装配安卓客户端,可以进行一些相关功能的控制,简单方便。

实物图如下:
20150212.jpg

蓝牙采用HC-06,如下图:
bluetooth.jpg

温度传感器DS18B20与时钟芯片DS1302如下:

ds18b20.jpg

安卓客户端(自己写的,界面有点粗糙)如下:
andriod1.png Screenshot_2015-02-12-21-02-18_副本.png

智能模式下,没人的时候,液晶显示nobody,风扇不转。

nobody.jpg

智能模式下:当count计时达到00:10:00时,风扇停止转动。

计时.jpg



普通模式下:快档,中档,停止档

fast.jpg middle.jpg stop.jpg





 楼主| hjl240 发表于 2015-2-12 21:43 | 显示全部楼层
本帖最后由 hjl240 于 2015-2-12 21:53 编辑

12864液晶说明:
采用STM32CubeMX生成工程,引脚分配如下:
12864.png

采用串行方式驱动
接线说明:
12364
电源-VSS---------------------------GND
电源+VDD---------------------------+5V
片选信号:CS(RS)--------------------PB13
数据信号:SID(RW)------------------PB14
时钟信号:SCLK(E)--------------------PB15
复位信号:RST-------------------------PB1
串并行选择:PSB----------------------GND
背光LEDA(-),LEDK(+)可接可不接。
函数使用方法:
1.      液晶初始化:
lcd12864_init();
2.      设置要显示的位置
pos(0,0);//此处为现在是第0(1)行,第0(1)列。
3.      显示字母
write_data(‘i’);//此处为显示字母‘i’
4.      显示汉字
int i;
unsigned char str[]={“一二三四”};
for(i=0;i<4;i++)
           write_data(str);
此处为显示“一二三四

参考程序如下: LCD12864.part1.rar (4.5 MB, 下载次数: 39) LCD12864.part2.rar (2 MB, 下载次数: 31)

参考程序现象如下:(写成441了,应该是411的)

IMG_20150212_144240_副本.jpg



 楼主| hjl240 发表于 2015-2-12 21:44 | 显示全部楼层
本帖最后由 hjl240 于 2015-2-12 22:01 编辑

DS18B20DS1302说明:
工程采用STM32CubeMx软件产生,引脚配置如下:其他配置默认。

ds18b20_ds1302.png

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);
则表示初始化时间为:1521217434秒,程序每次上电都将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();//获取温度

参考程序如下: F411_DS1302_DS18B20.part1.rar (4.5 MB, 下载次数: 20) F411_DS1302_DS18B20.part2.rar (2.03 MB, 下载次数: 17)

现象如下:
IMG_20150212_165015_副本.jpg


 楼主| hjl240 发表于 2015-2-12 21:59 | 显示全部楼层
串口说明:

采用串口2
STM32CubeMx配置如下:
串口配置.png

只需要将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中的函数声明。

结果如下:

串口.png

参考程序如下:
Uart2Test.part1.rar (4.5 MB, 下载次数: 17) Uart2Test.part2.rar (2.33 MB, 下载次数: 16)


 楼主| hjl240 发表于 2015-2-12 22:13 | 显示全部楼层
风扇转速控制采用PWM调速。
有关PWM部分示例代码:以按键控制PWM占空比为例:
首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。

pwm.png

定时器PWM模式配置


anjian.png

按键IO配置



然后生成Keil工程。
用Keil打开。
         首先修改有关PWM方面的代码。
PWM初始化代码如下:
  1. /* TIM10 init function */
  2. void MX_TIM10_Init(void)
  3. {
  4.   TIM_OC_InitTypeDef sConfigOC;

  5.   htim10.Instance = TIM10;
  6.   htim10.Init.Prescaler = 0;
  7.   htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
  8.   htim10.Init.Period = 0;
  9.   htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  10.   HAL_TIM_Base_Init(&htim10);

  11.   HAL_TIM_PWM_Init(&htim10);

  12.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  13.   sConfigOC.Pulse = 0;
  14.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  15.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  16.   HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1);
  17. }

查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下:

pwm1.png
pwm2.png

从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。
比如将改变一下两个语句:
htim10.Init.Period = 1000;
sConfigOC.Pulse = 200;
便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%
要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:

5.png

修改此函数之后,前面的函数声明也要改。改为:static void MX_TIM10_Init(int period,intpulse);

要想PWM工作,需要启动PWM查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:
6.png

这是PWM启动与停止的函数。
最后看看按键,只需要把按键配置为上拉模式就好。
在按键初始化中,将
GPIO_InitStruct.Pull= GPIO_NOPULL;
改为
GPIO_InitStruct.Pull= GPIO_PULLUP;

接下来便可以写主函数。

  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */
  4.         int i=100;
  5.   /* USER CODE END 1 */

  6.   /* MCU Configuration----------------------------------------------------------*/

  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8.   HAL_Init();

  9.   /* Configure the system clock */
  10.   SystemClock_Config();

  11.   /* System interrupt init*/
  12.   /* Sets the priority grouping field */
  13.   HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
  14.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

  15.   /* Initialize all configured peripherals */
  16.   MX_GPIO_Init();
  17.   MX_TIM10_Init(1000,100);//PWM初始化

  18.   /* USER CODE BEGIN 2 */
  19.         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
  20.   /* USER CODE END 2 */

  21.   /* USER CODE BEGIN 3 */
  22.   /* Infinite loop */
  23.   while (1)
  24.   {
  25.                 if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下
  26.                 {
  27.                         i=i+100;
  28.                         if(i==1000) i=100;
  29.                         HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM
  30.                         MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i
  31.                         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
  32.                         while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放
  33.                 }
  34.   }
  35.   /* USER CODE END 3 */

  36. }

编译程序,下载程序,可以看到现象:

7.jpg


参考程序如下:

PWMChangeTest.rar (3.56 MB, 下载次数: 17)



小班儿 发表于 2015-2-13 16:22 | 显示全部楼层
赞一个!
zh113214 发表于 2015-2-14 18:47 | 显示全部楼层
这种例子还挺多的,不过资料大多不全:lol顶!!!!!
hello海龟 发表于 2015-4-9 10:43 | 显示全部楼层
资料很不错,顶
ljl342301 发表于 2015-5-6 16:53 | 显示全部楼层
非常好的分享,获益匪浅
ljl342301 发表于 2015-5-6 16:57 | 显示全部楼层
ljl342301 发表于 2015-5-6 16:53
非常好的分享,获益匪浅

忘记说了,楼主能不能把手记的上位机程序分享一下呢,这样就更完美了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

56

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部