節(jié)能風(fēng)扇可實現(xiàn)的功能 (1)智能風(fēng)扇可通過溫度檢測到即時室溫,然后根據(jù)室溫的高低以及設(shè)定的溫度對扇葉的轉(zhuǎn)速進行自我調(diào)節(jié)。比如設(shè)定的溫度為20度,則室溫為21度時,風(fēng)扇轉(zhuǎn)速慢,室溫為22度時,風(fēng)扇轉(zhuǎn)速變快,室溫為23度時,風(fēng)扇轉(zhuǎn)速更快,以此類推。 (2)智能風(fēng)扇可通過紅外傳感器感受人的存在,無人時可自動關(guān)閉,節(jié)省能源。 (3)通過設(shè)定時間,定時關(guān)閉風(fēng)扇 (4)風(fēng)扇有普通模式,可以設(shè)置為快檔,中檔,慢檔,跟普通風(fēng)扇一樣,不受溫度影響。 (5)本系統(tǒng)裝配安卓客戶端,可以進行一些相關(guān)功能的控制,簡單方便。
方案框圖如下:
藍牙采用HC-06,如下圖:
溫度傳感器DS18B20與時鐘芯片DS1302如下:
智能模式下,沒人的時候,液晶顯示nobody,風(fēng)扇不轉(zhuǎn)。
智能模式下:當(dāng)count計時達到00:10:00時,風(fēng)扇停止轉(zhuǎn)動。
普通模式下:快檔,中檔,停止檔
DS18B20和DS1302說明: 工程采用STM32CubeMx軟件產(chǎn)生,引腳配置如下:其他配置默認(rèn)。
DS1302接線說明: SCLK-----------------------PC0 DATA-----------------------PC1 RST-------------------------PC2 函數(shù)使用方法說明: 1.ds1302初始化。 函數(shù)如下: 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 函數(shù)使用說明: flaot Temperature; Temperature= DS18B20_GetTemp();//獲取溫度
參考程序見附件 現(xiàn)象如下:
串口說明: 采用串口2 STM32CubeMx配置如下:
只需要將Nucleo板子通過usb插在電腦上即可,無需其他硬件。 本程序?qū)崿F(xiàn):電腦串口助手將字符串(固定長,如需改變長度,可在程序中更改)發(fā)給STM32F411板子,然后STM32F411板子將接收到的字符串發(fā)給定腦的串口助手。 測試程序如下: uint8_t Rdata[20]; while (1) { if(HAL_UART_Receive(&huart2,Rdata, 13, 1000)==HAL_OK) { HAL_UART_Transmit(&huart2,Rdata, 13, 1000); } } 函數(shù)的說明可以查看頭文件stm32f4xx_hal_uart.h中的函數(shù)聲明。
結(jié)果如下:
參考程序見附件
風(fēng)扇轉(zhuǎn)速控制采用PWM調(diào)速。 有關(guān)PWM部分示例代碼:以按鍵控制PWM占空比為例: 首先用STM32CubeMx軟件配置定時器PWM模式與按鍵輸入IO口。
定時器PWM模式配置
按鍵IO配置
然后生成Keil工程。 用Keil打開。 首先修改有關(guān)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,可以知道定時器初始化參數(shù)的含義如下:
從頭文件中可以看出,要想簡單配置PWM很簡單,只要改變PWM周期的值與脈沖值就好。 比如將改變一下兩個語句: htim10.Init.Period = 1000; sConfigOC.Pulse = 200; 便將PWM配置為周期為1000個定時器周期,高電平持續(xù)時間為200個定時器時鐘周期,占空比為200/1000=20%。 要想用按鍵控制PWM占空比,我們只需要修改一下PWM初始化函數(shù),修改如下:
修改此函數(shù)之后,前面的函數(shù)聲明也要改。改為:static void MX_TIM10_Init(int period,intpulse);
要想PWM工作,需要啟動PWM。查看頭文件stm32f4xx_hal_tim.h,可以看到如下函數(shù):
這是PWM啟動與停止的函數(shù)。 最后看看按鍵,只需要把按鍵配置為上拉模式就好。 在按鍵初始化中,將 GPIO_InitStruct.Pull= GPIO_NOPULL; 改為 GPIO_InitStruct.Pull= GPIO_PULLUP;
接下來便可以寫主函數(shù)。
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,高電平持續(xù)時間為i HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//啟動PWM while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按鍵釋放 } } /* USER CODE END 3 */
}
編譯程序,下載程序,可以看到現(xiàn)象: |