#include "ozone_work.h" #define TIMINT_TIME 1800000 #define INTERVAL_TIME 300000 // #define TIMINT_TIME 10000 // #define INTERVAL_TIME 1000 extern uint32_t g_frequency; extern uint32_t g_sys_sick; extern uint32_t g_duty[4]; // PWMd的占空比 extern adc_t adc; ozone_message_t ozone_message = {0}; int interval_key_press_frequency = 0; //每按下4次进行清0 int g_ozen_gears = 1; //上电默认输出100%,按下一次档位按键输出50%的PWM int time_key_press_frequency = 0; //每按下4次进行清0 //###################### 高低档按键开始 ################// void ozone_work_mode(int mode) { if (ozone_message.ozone_work_state != 2) { ozone_message.ozone_work_state = 1; } port_fan_set(true); switch (mode) { case 0: gears_led_on(0); break; case 1: gears_led_on(1); break; case 2: gears_led_on(2); break; case 3: timing_ozone_work_over(); //结束工作 break; default: break; } } void update_interval_down_begin_sys_time(void) { ozone_message.count_interval_down_begin_sys_time = get_sys_ticket(); } void update_ozer_work_state(void) { // int gears_time_key_press_frequency = 0; if (ozone_message.ozone_interva_state == true && ozone_message.interva_flag == true) { //如果现在是间歇休息时间,直接开始工作 update_interval_down_begin_sys_time(); ozone_message.interva_flag = false; } // if (time_key_press_frequency == 0) { // gears_time_key_press_frequency = 4; // } else { // gears_time_key_press_frequency = time_key_press_frequency - 1; // } // if (ozone_work_state == 2) { // timing_led_on(gears_time_key_press_frequency); //打开led灯 // } } void set_ozen_gears(int ozen_gears) { /** * @brief Construct a new switch object * 设置pwm输出 */ update_ozer_work_state(); //如果现在定时时间未结束并且处于间歇休息时间,直接设置为间歇工作时间 switch (ozen_gears) { case 0: set_pwm_frequency_duty(g_frequency, g_duty[0]); g_ozen_gears = 1; // printf("pwm g_duty:%d", g_duty[0]); ozone_work_mode(0); break; case 1: set_pwm_frequency_duty(g_frequency, g_duty[1]); g_ozen_gears = 2; // printf("pwm g_duty:%d", g_duty[1]); ozone_work_mode(1); break; case 2: set_pwm_frequency_duty(g_frequency, g_duty[2]); // g_ozen_gears = 3; g_ozen_gears = 0; // printf("pwm g_duty:%d", g_duty[2]); ozone_work_mode(2); break; // case 3: // set_pwm_frequency_duty(g_frequency, g_duty[3]); // g_ozen_gears = 0; // printf("pwm g_duty:%d", g_duty[3]); // ozone_work_mode(3); // break; } } /** * @brief * * @param led_number 0亮红灯 1亮绿灯 2亮蓝灯 3全灭 */ void gears_led_on(uint8_t led_number) { for (int i = 0; i < 3; i++) { if (i == led_number) { s_rgb[i].set_led_state = true; s_rgb[i].port_led_set(s_rgb[i].set_led_state); } else { s_rgb[i].set_led_state = false; s_rgb[i].port_led_set(s_rgb[i].set_led_state); } } } #if 0 void gears_led_on(uint8_t led_number) { switch (led_number) { case 0: port_led_r_set(true); port_led_g_set(false); port_led_b_set(false); break; case 1: port_led_r_set(false); port_led_g_set(true); port_led_b_set(false); break; case 2: port_led_r_set(false); port_led_g_set(false); port_led_b_set(true); break; case 3: port_led_r_set(false); port_led_g_set(false); port_led_b_set(false); break; default: break; } } #endif //###################### 高低档按键结束 ################// //###################### 定时按键开始 ################//ozone_message void set_ozone_work_time(void) { if (!ozone_message.ozone_work_state) { //如果现在不是工作状态,直接开始工作 set_ozen_gears(0); } ozone_message.ozone_work_state = 2; //处于定时工作状态 //获取现在的时间,作为判断倒计时时间的基准 ozone_message.count_down_begin_sys_time = get_sys_ticket(); port_fan_set(1); //风扇开始工作 switch (time_key_press_frequency) { case 5: time_key_press_frequency = 0; case 0: // 30min time_key_press_frequency = 1; timing_led_on(0); break; case 1: // 60min time_key_press_frequency = 2; timing_led_on(1); break; case 2: // 90min time_key_press_frequency = 3; timing_led_on(2); break; case 3: // 120min time_key_press_frequency = 4; timing_led_on(3); break; case 4: timing_led_on(4); ozone_message.ozone_work_state = 1; //一直工作 time_key_press_frequency = 0; break; default: break; } ozone_message.timing_rank = time_key_press_frequency; ozone_message.ozone_work_time = time_key_press_frequency * TIMINT_TIME; //定时时间 printf("ozone_message.ozone_work_time%d\r\n", ozone_message.ozone_work_time); } void timing_ozone_work_over(void) { /** * @brief 定时结束 * */ close_ozone_work(); ozone_message.ozone_work_state = 0; ozone_message.ozone_work_time = 0; ozone_message.switch_key_state = false; time_key_press_frequency = 0; } /** * @brief 定时结束后将 * */ void is_ozone_work_time_over(void) { if (port_haspassedms(ozone_message.count_down_begin_sys_time) >= TIMINT_TIME) { ozone_message.count_down_begin_sys_time = get_sys_ticket(); if (ozone_message.timing_rank == 1) { timing_ozone_work_over(); // interval_key_press_frequency = 0; ozone_message.ozone_interva_state = false; interval_key_press_frequency = 0; printf("time over\r\n"); } else { ozone_message.timing_rank--; timing_led_on(ozone_message.timing_rank - 1); } } } /** * @brief 定时时间设定后对应指示灯亮起 * * @param led_number 0亮led0 1亮led1 2亮led2 3亮led3 4全灭并代表臭氧机结束工作 */ void timing_led_on(uint8_t led_number) { if (led_number == 4) { port_led0_set(false); port_led1_set(false); port_led2_set(false); port_led3_set(false); } else { for (int i = 0; i < 4; i++) { if (i <= led_number) { s_leds[i].set_led_state = true; s_leds[i].port_led_set(s_leds[i].set_led_state); } else { s_leds[i].set_led_state = false; s_leds[i].port_led_set(s_leds[i].set_led_state); } } } } #if 0 void timing_led_on(uint8_t led_number) { switch (led_number) { case 0: port_led0_set(true); port_led1_set(false); port_led2_set(false); port_led3_set(false); break; case 1: port_led0_set(false); port_led1_set(true); port_led2_set(false); port_led3_set(false); break; case 2: port_led0_set(false); port_led1_set(false); port_led2_set(true); port_led3_set(false); break; case 3: port_led0_set(false); port_led1_set(false); port_led2_set(false); port_led3_set(true); break; case 4: port_led0_set(false); port_led1_set(false); port_led2_set(false); port_led3_set(false); break; default: break; } } #endif //###################### 定时按键结束 ################// //###################### 开关按键开始 ################// bool get_ozone_starting_up_state(void) { return ozone_message.switch_key_state; } /** * @brief 开机后工作状态 * */ void set_ozone_starting_up(void) { int starting_up_ozen_gears = 0; if (g_ozen_gears == 0) { starting_up_ozen_gears = 2; } else { starting_up_ozen_gears = g_ozen_gears - 1; } //开启PWM输出 set_ozen_gears(starting_up_ozen_gears); } /** * @brief 关闭工作状态 * */ void set_ozone_shutdown(void) { time_key_press_frequency=0; interval_key_press_frequency = 0; ozone_message.ozone_interva_state = false; memset(&adc, 0, sizeof(adc)); close_ozone_work(); } void process_switch_key(void) { //开机以后按照上次关机前的设置进行工作 ozone_message.switch_key_state = !ozone_message.switch_key_state; if (ozone_message.switch_key_state) { //开机 set_ozone_starting_up(); } else { //关机 set_ozone_shutdown(); } } //###################### 开关按键结束 ################// //###################### 间歇按键开始 ################// void set_rgb_on(void) { int rgbx_flicker = 0; if (g_ozen_gears == 0) { rgbx_flicker = 2; } else { rgbx_flicker = g_ozen_gears - 1; } gears_led_on(rgbx_flicker); } void set_rgb_off(void) { gears_led_on(3); //关闭RGB } void set_rgb_flicker(void) { static uint32_t rgb_ticket = 0; static uint8_t rgb_ticket_count = 0; if (port_haspassedms(rgb_ticket) > 1000) { rgb_ticket = get_sys_ticket(); if (rgb_ticket_count < 3) { set_rgb_on(); } else { set_rgb_off(); rgb_ticket_count = 0; } rgb_ticket_count++; } } /** * @brief 按键控制,无间歇时间的时候,臭氧的工作状态 * */ void set_stop_interval_ozone_work(void) { set_rgb_on(); port_fan_set(true); ozone_interval_begin(); } void set_interval_time(void) { update_interval_down_begin_sys_time(); switch (interval_key_press_frequency) { case 0: // printf("begin interval\n"); ozone_message.ozone_interva_state = true; ozone_message.ozone_interval_time = INTERVAL_TIME; // 5分钟 // g_ozone_interval_time = 60000; // 5分钟 interval_key_press_frequency = 1; break; case 1: // printf("stop interval"); ozone_message.ozone_interva_state = false; interval_key_press_frequency = 0; set_stop_interval_ozone_work(); break; } } static void ozone_interval_begin(void) { int interval_ozen_gears = 0; // int interval_time_key_press_frequency = 0; if (g_ozen_gears == 0) { interval_ozen_gears = 2; } else { interval_ozen_gears = g_ozen_gears - 1; } // if (time_key_press_frequency == 0) { // interval_time_key_press_frequency = 4; // } else { // interval_time_key_press_frequency = time_key_press_frequency - 1; // } //开启PWM输出 set_ozen_gears(interval_ozen_gears); // if (ozone_work_state == 2) { // timing_led_on(interval_time_key_press_frequency); //打开led灯 // } } void ozone_interval_over(void) { set_pwm_frequency_duty(g_frequency, g_duty[3]); //关闭PWM输出 port_fan_set(false); //风扇结束工作 } void is_ozone_interva_time_over(void) { if (port_haspassedms(ozone_message.count_interval_down_begin_sys_time) >= ozone_message.ozone_interval_time) { update_interval_down_begin_sys_time(); if (ozone_message.interva_flag == false) { ozone_message.interva_flag = true; printf("work over\r\n"); ozone_interval_over(); } else if (ozone_message.interva_flag == true) { ozone_message.interva_flag = false; printf("work begin\r\n"); ozone_interval_begin(); } } } //###################### 间歇按键结束 ################// void power_on_ozone_work_state(void) { close_ozone_work(); g_ozen_gears = 1; //为了点击开关后最高档工作 time_key_press_frequency = 5; //为了点击开关后无定时时间 } static void close_ozone_work(void) { set_pwm_frequency_duty(g_frequency, g_duty[3]); //关闭PWM输出 gears_led_on(3); //关闭RGB timing_led_on(4); //关闭4个led灯 port_fan_set(false); //风扇结束工作 } /** * @brief 当电压发生异常的时候 * 关闭臭氧工作,led0闪烁 * */ void process_voltage_abnormal(void) { static uint32_t lastprocess = 0; static uint8_t led_state = 1; if (!adc.first_detection_abnormal) { adc.first_detection_abnormal = true; close_ozone_work(); } if (port_haspassedms(lastprocess) > 300) { lastprocess = get_sys_ticket(); led_state = !led_state; port_led0_set(led_state); } }