|
|
@ -1,14 +1,15 @@ |
|
|
|
#include "user_main.h" |
|
|
|
#define MAX_RTC_TIME 24 * 60 * 60 + 60 * 60 + 60 |
|
|
|
//############################################################################# |
|
|
|
//全局变量 |
|
|
|
|
|
|
|
/******************************************************************************* |
|
|
|
* =================================全局变量================================== * |
|
|
|
*******************************************************************************/ |
|
|
|
uint8_t g_switch_gears = 1; // 0低 1高 |
|
|
|
static bool interval_state = false; |
|
|
|
RTC_TimeTypeDef interval_time = {0}; |
|
|
|
static bool rtc_time_init_state = false; |
|
|
|
|
|
|
|
static uint32_t s_timing_ticket = 0; |
|
|
|
static uint32_t s_interval_ticket = 0; |
|
|
|
later_interval_time_even later_interval_time; |
|
|
|
pwm_running_even pwm_running_state; |
|
|
|
running_time_even running_time; |
|
|
|
//############################################################################# |
|
|
|
// usart start |
|
|
|
uint8_t usart_data = 0; |
|
|
@ -28,8 +29,8 @@ void tim2_init(void) { |
|
|
|
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); |
|
|
|
} |
|
|
|
//############################################################################# |
|
|
|
void set_pwm_duty_cycle(void) { |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, !g_switch_gears * 250 + 250); |
|
|
|
void set_pwm_duty_cycle(uint16_t pwm_duty_cycle) { |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwm_duty_cycle); |
|
|
|
} |
|
|
|
//############################################################################# |
|
|
|
// time end |
|
|
@ -69,7 +70,7 @@ void interval_led_flicker(uint8_t led_number) { |
|
|
|
} |
|
|
|
} |
|
|
|
//############################################################################# |
|
|
|
// pwm一直工作时的一些状态设置 |
|
|
|
// pwm一直工作时的状态设置 |
|
|
|
void pwm_all_time_work_set(void) { |
|
|
|
pwm_running_state.interval_working = false; |
|
|
|
pwm_running_state.timing_running = false; |
|
|
@ -83,11 +84,13 @@ void pwm_all_time_work_set(void) { |
|
|
|
* @brief 间歇时间的设置 5min 10min 15min |
|
|
|
* |
|
|
|
* @param interval_time 定时时间标志 |
|
|
|
* s_interval_ticket = |
|
|
|
* HAL_GetTick();每次进行间歇时间设定的时候,获取一下现在的时间,作为间歇时间的判断的基准 |
|
|
|
*/ |
|
|
|
void set_interval_time(uint32_t interval_time) { |
|
|
|
pwm_running_state.interval_working = true; |
|
|
|
pwm_running_state.all_the_time_running = false; |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, !g_switch_gears * 250 + 250); |
|
|
|
set_pwm_duty_cycle(!g_switch_gears * 250 + 250); |
|
|
|
port_fan_on_set(true); |
|
|
|
interval_state = false; |
|
|
|
s_interval_ticket = HAL_GetTick(); |
|
|
@ -118,9 +121,9 @@ void set_interval_time(uint32_t interval_time) { |
|
|
|
if (interval_time != 3) { |
|
|
|
printf("设置间歇时间%dms\r\n", running_time.interval_time); |
|
|
|
} |
|
|
|
get_now_time(); |
|
|
|
} |
|
|
|
//############################################################################# |
|
|
|
|
|
|
|
void timing_led_all_off(void) { |
|
|
|
port_led0_set(false); |
|
|
|
port_led1_set(false); |
|
|
@ -128,6 +131,7 @@ void timing_led_all_off(void) { |
|
|
|
port_led3_set(false); |
|
|
|
} |
|
|
|
//############################################################################# |
|
|
|
|
|
|
|
static void timing_led_on(uint8_t led_number) { |
|
|
|
/** |
|
|
|
* @brief 定时时间设定后对应指示灯亮起 |
|
|
@ -169,10 +173,9 @@ void key_control_switch_gears(uint8_t gears) { |
|
|
|
printf("低档位\r\n"); |
|
|
|
if ((pwm_running_state.timing_running && interval_state == false) || |
|
|
|
(pwm_running_state.interval_working && interval_state == false) || |
|
|
|
(pwm_running_state |
|
|
|
.all_the_time_running)) //在工作时间高低档切换,立即起作用 |
|
|
|
(pwm_running_state.all_the_time_running)) //判断现在是否在工作状态 |
|
|
|
{ |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 250); |
|
|
|
set_pwm_duty_cycle(250); |
|
|
|
} |
|
|
|
port_led_r_set(false); |
|
|
|
port_led_g_set(true); |
|
|
@ -184,10 +187,9 @@ void key_control_switch_gears(uint8_t gears) { |
|
|
|
printf("高档位\r\n"); |
|
|
|
if ((pwm_running_state.timing_running && interval_state == false) || |
|
|
|
(pwm_running_state.interval_working && interval_state == false) || |
|
|
|
(pwm_running_state |
|
|
|
.all_the_time_running)) //在工作时间高低档切换,立即起作用 |
|
|
|
(pwm_running_state.all_the_time_running)) //判断现在是否在工作状态 |
|
|
|
{ |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 500); |
|
|
|
set_pwm_duty_cycle(500); |
|
|
|
} |
|
|
|
port_led_r_set(false); |
|
|
|
port_led_g_set(false); |
|
|
@ -201,37 +203,34 @@ void key_control_switch_gears(uint8_t gears) { |
|
|
|
//############################################################################# |
|
|
|
void set_timing_time(uint8_t timing_time) { |
|
|
|
/** |
|
|
|
* @brief 定时时间的设定,对应灯亮起 |
|
|
|
* |
|
|
|
* @brief 定时时间的设定,对应灯亮起,定时时间为30min,60min,90min,120min |
|
|
|
*s_timing_ticket = |
|
|
|
*HAL_GetTick();每次进行定时的时候,获取一下现在的时间,作为定时时间的判断的基准 |
|
|
|
*/ |
|
|
|
pwm_running_state.timing_running = true; |
|
|
|
pwm_running_state.all_the_time_running = false; |
|
|
|
interval_state = false; |
|
|
|
rtc_time_init(0, 0, 0); |
|
|
|
get_now_time(); |
|
|
|
s_timing_ticket = HAL_GetTick(); |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, |
|
|
|
!g_switch_gears * 250 + 250); //启动PWM工作 |
|
|
|
set_pwm_duty_cycle(!g_switch_gears * 250 + 250); |
|
|
|
port_fan_on_set(true); |
|
|
|
timing_led_on(timing_time); |
|
|
|
switch (timing_time) { |
|
|
|
case 0: //定时30分钟 |
|
|
|
case 0: |
|
|
|
running_time.timing_time_state = 1; |
|
|
|
// running_time.timing_time = 1800000; |
|
|
|
running_time.timing_time = 10000; // 10s |
|
|
|
break; |
|
|
|
case 1: //定时60分钟 |
|
|
|
case 1: |
|
|
|
running_time.timing_time_state = 2; |
|
|
|
// running_time.timing_time = 3600000; |
|
|
|
running_time.timing_time = 20000; // 20s |
|
|
|
break; |
|
|
|
|
|
|
|
case 2: //定时90分钟 |
|
|
|
case 2: |
|
|
|
running_time.timing_time_state = 3; |
|
|
|
// running_time.timing_time = 5400000; |
|
|
|
running_time.timing_time = 30000; // 30s |
|
|
|
break; |
|
|
|
case 3: //定时120分钟 |
|
|
|
case 3: |
|
|
|
running_time.timing_time_state = 0; |
|
|
|
// running_time.timing_time = 7200000; |
|
|
|
running_time.timing_time = 60000; // 1min |
|
|
@ -249,7 +248,7 @@ void stop_ozone_work(void) { |
|
|
|
pwm_running_state.timing_running = false; |
|
|
|
pwm_running_state.interval_working = false; |
|
|
|
pwm_running_state.all_the_time_running = false; |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 0); |
|
|
|
set_pwm_duty_cycle(0); |
|
|
|
port_fan_on_set(false); |
|
|
|
} |
|
|
|
//############################################################################# |
|
|
@ -302,68 +301,6 @@ static void onkey(zkey_t *key, zkey_state_t key_state) { |
|
|
|
//############################################################################# |
|
|
|
// key end |
|
|
|
//############################################################################# |
|
|
|
// rtc start |
|
|
|
void rtc_time_init(int hour, int min, int sec) { |
|
|
|
HAL_RTC_Init(&hrtc); |
|
|
|
RTC_TimeTypeDef stimestructure = {0}; |
|
|
|
stimestructure.Hours = hour; |
|
|
|
stimestructure.Minutes = min; |
|
|
|
stimestructure.Seconds = sec; |
|
|
|
HAL_RTC_SetTime(&hrtc, &stimestructure, RTC_FORMAT_BIN); |
|
|
|
} |
|
|
|
//############################################################################# |
|
|
|
void is_now_time_set_work_time(int hour, int min, int sec) { |
|
|
|
/** |
|
|
|
* @brief 定时时间的判断 |
|
|
|
* |
|
|
|
*/ |
|
|
|
RTC_TimeTypeDef stimestructure = {0}; |
|
|
|
HAL_RTC_GetTime(&hrtc, &stimestructure, RTC_FORMAT_BIN); |
|
|
|
if (stimestructure.Hours == hour && stimestructure.Minutes == min && |
|
|
|
stimestructure.Seconds == sec) { |
|
|
|
printf("时间到\r\n"); |
|
|
|
HAL_RTC_DeInit(&hrtc); |
|
|
|
memset(&pwm_running_state, false, sizeof(pwm_running_state)); |
|
|
|
memset(&running_time, 0, sizeof(running_time)); |
|
|
|
rtc_time_init_state = false; |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 0); |
|
|
|
timing_led_all_off(); |
|
|
|
port_fan_on_set(false); |
|
|
|
} |
|
|
|
} |
|
|
|
//############################################################################# |
|
|
|
void get_now_time(void) { |
|
|
|
HAL_RTC_GetTime(&hrtc, &interval_time, RTC_FORMAT_BIN); |
|
|
|
} |
|
|
|
//############################################################################# |
|
|
|
static bool s_now_time_less_than_get_time = false; |
|
|
|
RTC_TimeTypeDef stimestructure = {0}; //存储现在的时间 |
|
|
|
void is_now_interval_time(const int hour, const int min, const int sec) { |
|
|
|
HAL_RTC_GetTime(&hrtc, &stimestructure, RTC_FORMAT_BIN); |
|
|
|
if ((uint32_t)(stimestructure.Hours * 60 * 60 + stimestructure.Minutes * 60 + |
|
|
|
stimestructure.Seconds) - |
|
|
|
(uint32_t)(interval_time.Hours * 60 * 60 + |
|
|
|
interval_time.Minutes * 60 + interval_time.Seconds) == |
|
|
|
(uint32_t)(hour * 60 * 60 + min * 60 + sec)) { |
|
|
|
if (interval_state) { |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, !g_switch_gears * 250 + 250); |
|
|
|
port_fan_on_set(true); |
|
|
|
printf("工作时间到\r\n"); |
|
|
|
printf("现在的时间%d时%d分%d秒\r\n", stimestructure.Hours, |
|
|
|
stimestructure.Minutes, stimestructure.Seconds); |
|
|
|
s_now_time_less_than_get_time = false; |
|
|
|
} else { |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 0); |
|
|
|
port_fan_on_set(false); |
|
|
|
printf("午休时间到\r\n"); |
|
|
|
printf("现在的时间%d时%d分%d秒\r\n", stimestructure.Hours, |
|
|
|
stimestructure.Minutes, stimestructure.Seconds); |
|
|
|
s_now_time_less_than_get_time = false; |
|
|
|
} |
|
|
|
interval_state = !interval_state; |
|
|
|
HAL_RTC_GetTime(&hrtc, &interval_time, RTC_FORMAT_BIN); |
|
|
|
} |
|
|
|
} |
|
|
|
void test(void) { |
|
|
|
#if 0 |
|
|
|
rtc_time_init(23, 59, 48); |
|
|
@ -386,14 +323,16 @@ void test(void) { |
|
|
|
{ |
|
|
|
port_do_debug_light_state(); |
|
|
|
pwm_value++; |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwm_value); |
|
|
|
// __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwm_value); |
|
|
|
set_pwm_duty_cycle(); |
|
|
|
HAL_Delay(2); |
|
|
|
} |
|
|
|
while (pwm_value) |
|
|
|
{ |
|
|
|
port_do_debug_light_state(); |
|
|
|
pwm_value--; |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwm_value); |
|
|
|
// __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwm_value); |
|
|
|
set_pwm_duty_cycle(); |
|
|
|
HAL_Delay(2); |
|
|
|
} |
|
|
|
#endif |
|
|
@ -411,7 +350,7 @@ void is_timing_time_over(uint32_t timing_time) { |
|
|
|
printf("定时时间到\r\n"); |
|
|
|
memset(&pwm_running_state, false, sizeof(pwm_running_state)); |
|
|
|
memset(&running_time, 0, sizeof(running_time)); |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 0); |
|
|
|
set_pwm_duty_cycle(0); |
|
|
|
timing_led_all_off(); |
|
|
|
port_fan_on_set(false); |
|
|
|
} |
|
|
@ -427,15 +366,16 @@ void is_interval_time_over(uint32_t interval_time) { |
|
|
|
static bool work_state = false; |
|
|
|
if (port_haspassedms(s_interval_ticket) >= interval_time) { |
|
|
|
if (work_state) { |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, !g_switch_gears * 250 + 250); |
|
|
|
set_pwm_duty_cycle(!g_switch_gears * 250 + 250); |
|
|
|
port_fan_on_set(true); |
|
|
|
printf("工作时间\r\n"); |
|
|
|
} else { |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 0); |
|
|
|
set_pwm_duty_cycle(0); |
|
|
|
port_fan_on_set(false); |
|
|
|
printf("休息时间\r\n"); |
|
|
|
} |
|
|
|
work_state = !work_state; |
|
|
|
interval_state = !interval_state; |
|
|
|
s_interval_ticket = HAL_GetTick(); |
|
|
|
} |
|
|
|
} |
|
|
@ -445,8 +385,7 @@ void user_mian(void) { |
|
|
|
static uint32_t lastprocess_key_ticket = 0; |
|
|
|
HAL_UART_Receive_IT(&huart1, &usart_data, 1); |
|
|
|
tim2_init(); |
|
|
|
HAL_RTC_DeInit(&hrtc); |
|
|
|
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, 250); |
|
|
|
set_pwm_duty_cycle(250); |
|
|
|
pwm_running_state.all_the_time_running = true; |
|
|
|
port_fan_on_set(true); |
|
|
|
key_control_switch_gears(0); |
|
|
@ -455,6 +394,7 @@ void user_mian(void) { |
|
|
|
test(); |
|
|
|
while (1) { |
|
|
|
port_do_debug_light_state(); |
|
|
|
//按键的扫描 |
|
|
|
if (port_haspassedms(lastprocess_key_ticket) >= KEY_SCAN_PERIOD) { |
|
|
|
lastprocess_key_ticket = HAL_GetTick(); |
|
|
|
zkey_do_loop_in_each_period(NULL); |
|
|
|