From 57b984b8395bb30b2d170369c75f19722502b104 Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期一, 21 四月 2025 16:38:37 +0800 Subject: [PATCH] 新增加速度计步数检测功能,3s发一次数据和停止30秒1分钟发一次数据 --- keil/include/main/main.c | 178 +++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 124 insertions(+), 54 deletions(-) diff --git a/keil/include/main/main.c b/keil/include/main/main.c index 0908493..35b8629 100644 --- a/keil/include/main/main.c +++ b/keil/include/main/main.c @@ -94,6 +94,10 @@ /****************************************************************引脚宏定义**************************************************/ +#define UWB_OPEN_COUNT 1 +#define UWB_MEASUREMENT_INTERVAL 3 +#define UWB_MEASUREMENT_INTERVAL_SLEEP 60 + void test_Delay_us(uint16_t time); void Lora_UploadHeartBeartPoll(void); extern uint8_t mUsartReceivePack[100]; @@ -297,42 +301,50 @@ } } - HIDO_TimerTick(); +// HIDO_TimerTick(); } +// 定义状态 +typedef enum { + STATE_NORMAL, // 正常状态,3秒测距上传一次 + STATE_SLEEP // 休眠状态,1分钟测距上传一次 +} CountState_t; +// 全局变量 +uint32_t uwb_time_count = 0; // 定时器计数值 +uint32_t step_count = 0; // 步数计数 +uint32_t last_step_count = 0; // 上一次步数 +CountState_t current_state = STATE_NORMAL; // 当前状态 +uint32_t state_start_time = 0; // 状态开始时间 + uint8_t stationary_flag; -uint8_t flag_sleeptimer,flag_secondtask,secondtask_count; -uint8_t lora_wg_up=0; extern uint8_t lora_tx_flag; +extern uint16_t sleep_time; static void sleep_timer_callback(void *dev, uint32_t time) { - - g_start_send_flag=1; -// HIDO_TimerGetTick(); +// g_start_send_flag=1; HIDO_TimerTick(); - // #ifdef DEBUG_BOXING -//// gpio_pin_clr(IO_PIN_5);//测试 - // gpio_pin_set(IO_PIN_5);//测试 - // lora_wg_up=1; - - lora_tx_flag++; -// lora_qiehuan++; -// IO_control_init(); -// UWBPoll(); -// -// -// MotorPoll(); - -// if(secondtask_count++%2==0) -// { -// flag_secondtask = 1; -// }else{ -// flag_secondtask = 0; -// } - -// flag_sleeptimer = 1; - +// lora_tx_flag++; + uwb_time_count++; + if(uwb_time_count>10000) + { + uwb_time_count=0; + } + if (current_state == STATE_NORMAL) + { + sleep_time++; + } + step_count = mir3da_get_step(); // 获取步数 +// if(yundong_bushu<mir3da_get_step()) +// { +// yundong_bushu=mir3da_get_step(); +// onemin_onesecond_flag=1; +// } +// else +// { +// yundong_bushu=mir3da_get_step(); +// onemin_onesecond_flag=0; +// } //马达震动逻辑 if(g_com_map[MOTOR_ENABLE]) { @@ -350,23 +362,37 @@ }else{ motor_power_state=1; } - - //GPS工作逻辑 - if(nomove_count++>g_com_map[STATIONARY_TIME]) - { - stationary_flag = 1; - } else - { - stationary_flag = 0; - } nomove_count++; - #ifdef DEBUG_BOXING -// gpio_pin_clr(BOXING_PIN);//测试 - gpio_pin_set(BOXING_PIN);//测试 - #endif - delay_us(1000); -} + +} +uint16_t sleep_time=0; +void check_step_and_update_state(void) +{ + if ((step_count != last_step_count)) + { + // 步数有变化,重置状态为正常状态 + if(current_state == STATE_SLEEP) + { + state_start_time = uwb_time_count; + } + current_state = STATE_NORMAL; + last_step_count = step_count; + } + else + { + // 步数没有变化,检查是否需要切换到休眠状态 + if (current_state == STATE_NORMAL) + { +// sleep_time = uwb_time_count - state_start_time; + if (sleep_time >= 30) + { // 30秒后切换到休眠状态 + current_state = STATE_SLEEP; + sleep_time = 0; + } + } + } +} //void phy_timer_callback(uint32_t time) //{ // lora_tx_flag++; @@ -489,7 +515,7 @@ uint32_t lock; trace_flush(); lock = int_lock(); - LOG_INFO(TRACE_MODULE_APP, "进入深度休眠\r\n"); + LOG_INFO(TRACE_MODULE_APP, "进入休眠\r\n"); //关闭蓝牙 灯 LORA_LED_OFF; GREEN_LED_OFF; @@ -504,11 +530,11 @@ } void IMUTask(void) { - if(nomove_count>5&&g_com_map[IMU_ENABLE]==1) + if(nomove_count>10&&g_com_map[IMU_ENABLE]==2) { -// power_wakeup_enable(WK_UP_POSITION&gpio_state, POWER_WAKEUP_LEVEL_HIGH);//配置唤醒等待进入休眠 - power_enter_power_down_mode(1); -// mcu_deep_sleep(); + power_wakeup_enable((enum POWER_WAKEUP_SOURCE_T)PCA_INPUT_DETECT, POWER_WAKEUP_LEVEL_LOW); + mcu_deep_sleep(); + } } #define TEST_SPI_MASTER 0 @@ -539,9 +565,9 @@ // io_pin_mux_set(UART0_TX, IO_FUNC4); io_pin_mux_set(UART0_RX, IO_FUNC0); - gpio_pin_set_dir(UART0_RX , GPIO_DIR_IN, 0); + gpio_pin_set_dir(UART0_RX , GPIO_DIR_OUT, 0); io_pin_mux_set(UART0_TX, IO_FUNC0); - gpio_pin_set_dir(UART0_TX , GPIO_DIR_IN, 0); + gpio_pin_set_dir(UART0_TX , GPIO_DIR_OUT, 0); // board_debug_console_open(TRACE_PORT_UART0); // uart_receive(UART_ID0,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart0_receive_callback);//开启dma @@ -649,6 +675,51 @@ PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 check_input_change(); } +extern uint32_t uwb_time_count; +void upload_apppoll() +{ + uint32_t elapsed_time_jibu; + + switch (current_state) + { + case STATE_NORMAL: + elapsed_time_jibu = uwb_time_count - state_start_time; + switch(elapsed_time_jibu) + { + case UWB_OPEN_COUNT: + UWB_LED_OFF; + CloseUWB(); + break; + + case UWB_MEASUREMENT_INTERVAL: + UWB_LED_ON; + OpenUWB(); + LoraReportPoll(); + state_start_time = uwb_time_count; + break; + } + break; + + case STATE_SLEEP: + elapsed_time_jibu = uwb_time_count - state_start_time; + switch(elapsed_time_jibu) + { + case UWB_OPEN_COUNT: + UWB_LED_OFF; + CloseUWB(); + break; + + case UWB_MEASUREMENT_INTERVAL_SLEEP: + UWB_LED_ON; + OpenUWB(); + LoraReportPoll(); + state_start_time = uwb_time_count; + break; + } + break; + } + +} uint8_t io14_state; uint16_t lora_freq=0; uint16_t lora_up_count=0; @@ -676,6 +747,7 @@ pca_input_detection_init(pca_handler); IIC2_Init(); Accelerometer_Init(); + PCA9555_init(); Lora_1268_Init(); SwitchLoraSettings(478,7,22); @@ -693,12 +765,10 @@ // OpenUWB(); while (1) { - #ifdef DEBUG_BOXING - gpio_pin_clr(BOXING_PIN);//测试 -// gpio_pin_set(BOXING_PIN);//测试 - #endif // Lora_Tx_Poll(); // uwb_app_poll(); + check_step_and_update_state(); + upload_apppoll(); IdleTask(); IMUTask(); } -- Gitblit v1.9.3