#include // 标准输入输出 #include // POSIX标准接口 #include // 字符串处理(操作字符数组) #include "ohos_init.h" // 用于初始化服务(services)和功能(features) #include "cmsis_os2.h" // CMSIS-RTOS API V2 #include "wifi_connecter.h" // easy wifi (station模式) #include "oled_ssd1306.h" // OLED驱动接口 #include "json_parser.h" #include "display_helper.h" // 显示辅助函数 #include "robot_sg90.h" // 舵机控制接口 #include "iot_gpio.h" #include "hi_io.h" #include "hi_time.h" #include "iot_gpio.h" #include "hi_adc.h" #include "iot_errno.h" #if 1 // 定义一个宏,用于标识SSID。请根据实际情况修改 #define PARAM_HOTSPOT_SSID "tarikPura" // 定义一个宏,用于标识密码。请根据实际情况修改 #define PARAM_HOTSPOT_PSK "66668888" #elif #define PARAM_HOTSPOT_SSID "DYJY" // 定义一个宏,用于标识密码。请根据实际情况修改 #define PARAM_HOTSPOT_PSK "12345678" #endif // 定义一个宏,用于标识加密方式 #define PARAM_HOTSPOT_TYPE WIFI_SEC_TYPE_PSK // 定义一个宏,用于标识UDP服务器IP地址。请根据实际情况修改 #define PARAM_SERVER_ADDR "192.168.43.137" #define GPIO5 5 #define ADC_TEST_LENGTH (20) #define VLT_MIN (100) #define KEY_INTERRUPT_PROTECT_TIME (30) unsigned short g_adc_buf[ADC_TEST_LENGTH] = { 0 }; unsigned short g_gpio5_adc_buf[ADC_TEST_LENGTH] = { 0 }; unsigned int g_gpio5_tick = 0; int control_flag = 0; extern char response[128]; extern JsonCommand g_current_command; // 外部声明JSON命令变量 // 舵机控制函数声明 extern void servo_rotate_clockwise_90(void); extern void servo_rotate_counter_clockwise_90(void); extern void regress_middle(void); uint8_t fonts3[] = { /*-- ID:0,字符:"京",ASCII编码:BEA9,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x08,0x08,0x08,0xe8,0x28,0x28,0x29,0x2e,0x28,0x28,0x28,0xf8,0x28,0x0c,0x08,0x00, 0x00,0x00,0x40,0x23,0x1a,0x42,0x82,0x7e,0x02,0x0a,0x12,0x33,0x60,0x00,0x00,0x00, /*-- ID:1,字符:"沪",ASCII编码:BBA6,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x10,0x22,0x64,0x0c,0x80,0x00,0xf8,0x88,0x89,0x8a,0x8e,0x88,0x88,0xfc,0x08,0x00, 0x04,0x04,0xfc,0x03,0x80,0x60,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /*-- ID:2,字符:"津",ASCII编码:BDF2,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x20,0x42,0xc4,0x0c,0x10,0x54,0x54,0x54,0xff,0x54,0x54,0x54,0x7e,0x14,0x10,0x00, 0x04,0x04,0xfc,0x02,0x11,0x12,0x12,0x12,0xff,0x12,0x12,0x13,0x1a,0x10,0x00,0x00, /*-- ID:3,字符:"渝",ASCII编码:D3E5,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x10,0x22,0x64,0x0c,0xa0,0xd0,0x48,0x54,0xd2,0x13,0x94,0x08,0xd0,0x30,0x10,0x00, 0x04,0x04,0xfe,0x01,0x00,0xff,0x12,0x92,0xff,0x00,0x5f,0x80,0x7f,0x00,0x00,0x00, /*-- ID:4,字符:"冀",ASCII编码:BCBD,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x08,0x0a,0xea,0xaa,0xaa,0xaa,0xaf,0xe0,0xaf,0xaa,0xaa,0xaa,0xfa,0x28,0x0c,0x00, 0x20,0xa0,0xab,0x6a,0x2a,0x3e,0x2a,0x2b,0x2a,0x3e,0x2a,0x6a,0xab,0xa0,0x20,0x00, /*-- ID:5,字符:"晋",ASCII编码:BDFA,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x40,0x42,0x4a,0x52,0x42,0x7e,0x42,0x42,0x42,0x7e,0x42,0xd2,0x4b,0x62,0x40,0x00, 0x00,0x00,0x00,0xff,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xff,0x01,0x00,0x00,0x00, /*-- ID:6,字符:"蒙",ASCII编码:C3C9,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x20,0x9a,0x8a,0x8a,0xaa,0xaf,0xaa,0xaa,0xaa,0xaf,0xaa,0x8a,0x8b,0xaa,0x18,0x00, 0x00,0x50,0x52,0x2a,0x2a,0x15,0x4b,0x86,0x7c,0x04,0x0a,0x13,0x20,0x60,0x20,0x00, /*-- ID:7,字符:"辽",ASCII编码:C1C9,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x00,0x21,0x22,0xe6,0x00,0x02,0x02,0x02,0x02,0xf2,0x12,0x0a,0x06,0x02,0x00,0x00, 0x00,0x40,0x20,0x1f,0x20,0x40,0x40,0x48,0x50,0x4f,0x40,0x40,0x40,0x60,0x20,0x00, /*-- ID:8,字符:"吉",ASCII编码:BCAA,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x08,0x08,0x88,0x88,0x88,0x88,0x88,0xff,0x88,0x88,0x88,0xc8,0x88,0x0c,0x08,0x00, 0x00,0x00,0x00,0xfc,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xfe,0x04,0x00,0x00,0x00, /*-- ID:9,字符:"黑",ASCII编码:BADA,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x00,0x00,0xfe,0x8a,0x92,0xb2,0x82,0xfe,0x82,0xa2,0x9a,0x92,0xff,0x02,0x00,0x00, 0x08,0x8a,0x6a,0x0a,0x2a,0xca,0x0a,0x0f,0x2a,0xca,0x0a,0x2a,0x4a,0xca,0x08,0x00, /*-- ID:10,字符:"苏",ASCII编码:CBD5,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x04,0x04,0x44,0x44,0x5f,0x44,0xf4,0x44,0x44,0x44,0x5f,0xe4,0x44,0x06,0x04,0x00, 0x00,0x88,0x46,0x20,0x10,0x0c,0x03,0x00,0x00,0x40,0x80,0x7f,0x02,0x04,0x0c,0x00, /*-- ID:11,字符:"浙",ASCII编码:D5E3,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x10,0x22,0x64,0x0c,0x90,0x10,0xff,0x10,0x90,0xfc,0x44,0x44,0xc2,0x62,0x40,0x00, 0x04,0x04,0xfe,0x01,0x42,0x82,0x7f,0x41,0x20,0x1f,0x00,0x00,0xff,0x00,0x00,0x00, /*-- ID:12,字符:"皖",ASCII编码:CDEE,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x00,0xf8,0x8c,0x8b,0x88,0xf8,0x10,0x0c,0x24,0x25,0x26,0x34,0x24,0x94,0x0c,0x00, 0x00,0x3f,0x10,0x10,0x10,0xbf,0x41,0x31,0x0f,0x01,0x01,0x3f,0x41,0x41,0x71,0x00, /*-- ID:13,字符:"闽",ASCII编码:C3F6,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x00,0xfc,0x01,0x02,0xe6,0x20,0x22,0xfa,0x22,0x22,0xf2,0x22,0x02,0xff,0x02,0x00, 0x00,0xff,0x00,0x20,0x27,0x22,0x22,0x3f,0x12,0x12,0x1b,0x70,0x80,0x7f,0x00,0x00, /*-- ID:14,字符:"赣",ASCII编码:B8D3,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x12,0xd6,0x5a,0x53,0x5a,0xd6,0x12,0x28,0x64,0x57,0xca,0x56,0x52,0x20,0x20,0x00, 0x10,0x17,0x15,0xfd,0x15,0x17,0x10,0x81,0xbd,0x45,0x35,0x45,0x7d,0x81,0x00,0x00, /*-- ID:15,字符:"鲁",ASCII编码:C2B3,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x10,0x10,0xf8,0xac,0xaa,0xab,0xaa,0xfa,0xae,0xaa,0xaa,0xa8,0xfc,0x08,0x00,0x00, 0x02,0x02,0x02,0xfa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xfe,0x0a,0x02,0x02,0x00, /*-- ID:16,字符:"豫",ASCII编码:D4A5,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x40,0x42,0x52,0xe2,0x5a,0xc6,0x50,0xf8,0x94,0xd3,0xba,0x96,0x92,0xf8,0x10,0x00, 0x00,0x40,0x80,0x7f,0x00,0x10,0x54,0x4a,0x25,0x92,0xfc,0x0c,0x12,0x61,0x20,0x00, /*-- ID:17,字符:"鄂",ASCII编码:B6F5,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x00,0x5e,0x52,0x5e,0x40,0x5e,0x52,0x5e,0x00,0xfe,0x02,0x42,0xb2,0x0e,0x00,0x00, 0x01,0x01,0x0d,0x4b,0x89,0x89,0x7d,0x09,0x01,0xff,0x08,0x10,0x20,0x11,0x0e,0x00, /*-- ID:18,字符:"湘",ASCII编码:CFE6,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x10,0x22,0x64,0x0c,0x10,0xd0,0xff,0x90,0x10,0xfc,0x44,0x44,0x44,0xfe,0x04,0x00, 0x04,0x04,0xfe,0x05,0x03,0x00,0xff,0x00,0x01,0xff,0x44,0x44,0x44,0xff,0x00,0x00, /*-- ID:19,字符:"粤",ASCII编码:D4C1,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x00,0x00,0x00,0xfe,0x92,0xd6,0x93,0xfe,0x92,0xd6,0x92,0xff,0x02,0x00,0x00,0x00, 0x02,0x02,0x02,0x02,0x0a,0x0e,0x0a,0x0a,0x4a,0x8a,0x4a,0x3a,0x02,0x03,0x02,0x00, /*-- ID:20,字符:"桂",ASCII编码:B9F0,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x10,0x10,0xd0,0xff,0x90,0x50,0x48,0x48,0x48,0xff,0x48,0x48,0x4c,0x68,0x40,0x00, 0x04,0x03,0x00,0xff,0x40,0x41,0x44,0x44,0x44,0x7f,0x44,0x44,0x46,0x64,0x40,0x00, /*-- ID:21,字符:"琼",ASCII编码:C7ED,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x44,0x44,0xfc,0x46,0x44,0x08,0xe8,0x28,0x29,0x2a,0x28,0x28,0xf8,0x2c,0x08,0x00, 0x10,0x30,0x1f,0x08,0x08,0x20,0x13,0x5a,0x82,0x7e,0x02,0x0a,0x13,0x30,0x00,0x00, /*-- ID:22,字符:"川",ASCII编码:B4A8,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0xff,0x00,0x00, 0x00,0x40,0x20,0x1f,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0xff,0x00,0x00, /*-- ID:23,字符:"贵",ASCII编码:B9F3,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x40,0x40,0x5c,0x54,0x54,0x54,0x54,0x7f,0x54,0x54,0x54,0xd4,0x5e,0x44,0x40,0x00, 0x00,0x00,0x80,0x9f,0x41,0x41,0x21,0x1d,0x21,0x21,0x41,0x5f,0x81,0x00,0x00,0x00, /*-- ID:24,字符:"云",ASCII编码:D4C6,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x40,0x40,0x40,0x44,0x44,0x44,0xc4,0x44,0x44,0x44,0x46,0x44,0x40,0x60,0x40,0x00, 0x00,0x00,0x40,0x60,0x58,0x46,0x41,0x40,0x40,0x40,0x50,0x60,0xc0,0x00,0x00,0x00, /*-- ID:25,字符:"藏",ASCII编码:B2D8,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x02,0xf2,0x82,0xf2,0x12,0xdf,0x52,0xd2,0x5f,0x12,0xfe,0x12,0x16,0x9b,0x12,0x00, 0x90,0x4e,0x22,0x1f,0x00,0x7f,0x25,0x3d,0xa7,0x40,0x2f,0x30,0x4c,0x83,0xe0,0x00, /*-- ID:26,字符:"陕",ASCII编码:C9C2,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x00,0xfe,0x22,0x5a,0x86,0x08,0x28,0x48,0x08,0xff,0x08,0x48,0x2c,0x88,0x00,0x00, 0x00,0xff,0x04,0x08,0x87,0x41,0x21,0x11,0x0d,0x03,0x0d,0x11,0x61,0xc1,0x41,0x00, /*-- ID:27,字符:"甘",ASCII编码:B8CA,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x10,0x10,0x10,0x10,0xff,0x10,0x10,0x10,0x10,0x10,0xff,0x10,0x10,0x18,0x10,0x00, 0x00,0x00,0x00,0x00,0xff,0x42,0x42,0x42,0x42,0x42,0xff,0x00,0x00,0x00,0x00,0x00, /*-- ID:28,字符:"青",ASCII编码:C7E0,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x40,0x44,0x54,0x54,0x54,0x54,0x54,0x7f,0x54,0x54,0x54,0xd4,0x56,0x44,0x40,0x00, 0x00,0x00,0x00,0xff,0x15,0x15,0x15,0x15,0x15,0x55,0x95,0x7f,0x01,0x00,0x00,0x00, /*-- ID:29,字符:"宁",ASCII编码:C4FE,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x50,0x4c,0x44,0x44,0x44,0x44,0x45,0xc6,0x44,0x44,0x44,0x44,0x44,0x54,0x4c,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*-- ID:30,字符:"新",ASCII编码:D0C2,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x40,0x44,0x54,0x65,0xc6,0x64,0xd6,0x44,0x40,0xfc,0x44,0x42,0xc3,0x62,0x40,0x00, 0x20,0x11,0x49,0x81,0x7f,0x01,0x05,0x29,0x18,0x07,0x00,0x00,0xff,0x00,0x00,0x00, /*-- ID:31,字符:"禁",ASCII编码:BDFB,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x40,0x24,0x14,0x0c,0x7f,0x14,0x24,0x20,0x14,0x0c,0x7f,0x0c,0x16,0x24,0x40,0x00, 0x04,0x04,0x45,0x25,0x15,0x45,0x85,0x7d,0x05,0x05,0x15,0x25,0x65,0x04,0x04,0x00, /*-- ID:32,字符:"通",ASCII编码:CDA8,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x40,0x42,0x44,0xcc,0x00,0x00,0xf1,0x91,0x95,0xf9,0x95,0x93,0xf9,0x10,0x00,0x00, 0x00,0x40,0x20,0x1f,0x20,0x40,0xbf,0x84,0x84,0xbf,0x94,0xa4,0x9f,0xc0,0x40,0x00, /*-- ID:33,字符:"行",ASCII编码:D0D0,对应字:宽x高=16x16,画布:宽W=16 高H=16,共32字节*/ 0x00,0x10,0x88,0xc4,0x23,0x40,0x42,0x42,0x42,0x42,0x42,0xc2,0x43,0x62,0x40,0x00, 0x02,0x01,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7f,0x00,0x00,0x00,0x00}; // 定义一个宏,用于标识UDP服务器端口 #define PARAM_SERVER_PORT 8081 void switch_init(void) { IoTGpioInit(5); hi_io_set_func(5, 0); IoTGpioSetDir(5, IOT_GPIO_DIR_IN); hi_io_set_pull(5, 1); } //按键中断响应函数 void gpio5_isr_func_mode(void) { printf("gpio5_isr_func_mode start\n"); unsigned int tick_interval = 0; unsigned int current_gpio5_tick = 0; current_gpio5_tick = hi_get_tick(); tick_interval = current_gpio5_tick - g_gpio5_tick; if (tick_interval < KEY_INTERRUPT_PROTECT_TIME) { return NULL; } g_gpio5_tick = current_gpio5_tick; control_flag = !control_flag; } unsigned char get_gpio5_voltage(void *param) { int i; unsigned short data; unsigned int ret; unsigned short vlt; float voltage; float vlt_max = 0; float vlt_min = VLT_MIN; hi_unref_param(param); memset_s(g_gpio5_adc_buf, sizeof(g_gpio5_adc_buf), 0x0, sizeof(g_gpio5_adc_buf)); for (i = 0; i < ADC_TEST_LENGTH; i++) { ret = hi_adc_read(HI_ADC_CHANNEL_2, &data, HI_ADC_EQU_MODEL_4, HI_ADC_CUR_BAIS_DEFAULT, 0xF0); //ADC_Channal_2 自动识别模式 CNcomment:4次平均算法模式 CNend */ if (ret != IOT_SUCCESS) { printf("ADC Read Fail\n"); return NULL; } g_gpio5_adc_buf[i] = data; } for (i = 0; i < ADC_TEST_LENGTH; i++) { vlt = g_gpio5_adc_buf[i]; voltage = (float)vlt * 1.8 * 4 / 4096.0; /* vlt * 1.8* 4 / 4096.0为将码字转换为电压 */ vlt_max = (voltage > vlt_max) ? voltage : vlt_max; vlt_min = (voltage < vlt_min) ? voltage : vlt_min; } printf("vlt_max is %f\r\n", vlt_max); if (vlt_max > 0.6 && vlt_max < 1.0) { gpio5_isr_func_mode(); } } //按键中断 void interrupt_monitor(void) { unsigned int ret = 0; /*gpio5 switch2 mode*/ g_gpio5_tick = hi_get_tick(); ret = IoTGpioRegisterIsrFunc(GPIO5, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, get_gpio5_voltage, NULL); if (ret == IOT_SUCCESS) { printf(" register gpio5\r\n"); } } void OledShowChinese3(uint8_t x, uint8_t y, uint8_t idx) { // 控制循环 uint8_t t; // 显示汉字的上半部分 OledSetPosition(x, y); for (t = 0; t < 16; t++) { WriteData(fonts3[32 * idx + t]); } // 显示汉字的下半部分 OledSetPosition(x, y + 1); for (t = 16; t < 32; t++) { WriteData(fonts3[32 * idx + t]); } } static void controlTask(void *arg) { (void)arg; int control_temp = control_flag; int count = 0; static int display_timer = 0; // 显示计时器 while (1) { if(control_flag != control_temp) { count = 0; display_timer = 0; OledClearScreen(); // 使用新的清屏函数 control_temp = control_flag; // 处理新的JSON命令格式 if(control_flag == CMD_ROTATE_DISPLAY_CLEAR) // 命令1:顺时针90°+显示字符串+10秒后逆时针90°+清屏 { printf("Command 1: Rotate clockwise, display text, wait 10s, rotate back, clear\r\n"); // 顺时针旋转90度 servo_rotate_clockwise_90(); // 显示字符串 if (strlen(g_current_command.text) > 0) { printf("Displaying text: %s\r\n", g_current_command.text); DisplayMixedString(0, 0, g_current_command.text); } display_timer = 10; // 设置10秒计时器 } else if(control_flag == CMD_ROTATE_CLOCKWISE) // 命令2:顺时针90° { printf("Command 2: Rotate clockwise 90 degrees\r\n"); servo_rotate_clockwise_90(); } else if(control_flag == CMD_ROTATE_COUNTER) // 命令3:逆时针90° { printf("Command 3: Rotate counter-clockwise 90 degrees\r\n"); servo_rotate_counter_clockwise_90(); } else if(control_flag == CMD_DISPLAY_ONLY) // 命令4:只显示字符串,舵机不动 { printf("Command 4: Display text only, no servo movement\r\n"); // 只显示字符串,不控制舵机 if (strlen(g_current_command.text) > 0) { printf("Displaying text: %s\r\n", g_current_command.text); DisplayMixedString(0, 0, g_current_command.text); } display_timer = 2; // 设置2秒计时器 } // 兼容旧命令的处理逻辑(只有在非JSON命令时才执行) else if(control_flag == 0 && g_current_command.cmd == 0) // 兼容旧命令:关闭 { regress_middle(); printf("barrier off\n"); } else if(control_flag == 1 && g_current_command.cmd == 0) // 兼容旧命令:开启(只有非JSON命令时) { servo_rotate_counter_clockwise_90(); printf("barrier on\n"); } // 兼容旧的复杂字符串解析逻辑 - 只有在非JSON命令时才执行 if(control_flag == 2 && g_current_command.cmd == 0) { char prefix[20]; // 存储前部分字符串 int num; // 存储后部分数字 int index1 = 0; // 使用 sscanf 解析字符串 int result = sscanf(response, "%[^i]index:%dflag:%d", prefix, &num,&index1); if (result == 3) { memset(response,0,sizeof(response)); OledShowChinese3(0,0,num); OledShowString(18, 0, prefix, FONT8x16); OledShowChinese3(0 , 2, index1); OledShowChinese3(18 , 2, 33); } if (index1 == 32) { servo_rotate_counter_clockwise_90(); } } } // 处理命令1的10秒计时器 if(control_flag == CMD_ROTATE_DISPLAY_CLEAR && display_timer > 0) { display_timer--; if(display_timer == 0) { printf("10 seconds elapsed, rotating back and clearing screen\r\n"); // 逆时针旋转90度 servo_rotate_counter_clockwise_90(); // 清屏 OledClearScreen(); // 重置控制标志 control_flag = 0; } } // 处理命令4的2秒计时器 if(control_flag == CMD_DISPLAY_ONLY && display_timer > 0) { display_timer--; if(display_timer == 0) { printf("2 seconds elapsed, clearing screen for command 4\r\n"); // 清屏 OledClearScreen(); // 重置控制标志,使其能够响应下一个命令4 control_flag = 0; } } // 兼容旧的计时逻辑 if(control_flag == 2 && g_current_command.cmd == 0) { count++; if(count > 10) { control_flag = 0; count = 0; } } sleep(1); } } // 主线程函数 static void NetDemoTask(void *arg) { (void)arg; int control_temp = 0; // 定义热点配置 WifiDeviceConfig config = {0}; // 设置热点配置中的SSID strcpy(config.ssid, PARAM_HOTSPOT_SSID); // 设置热点配置中的密码 strcpy(config.preSharedKey, PARAM_HOTSPOT_PSK); // 设置热点配置中的加密方式(Wi-Fi security types) config.securityType = PARAM_HOTSPOT_TYPE; // 显示启动信息 printf("=== Hi3861 智能闸机控制系统启动 ===\r\n"); printf("正在连接WiFi: %s\r\n", PARAM_HOTSPOT_SSID); printf("服务器地址: %s:%d\r\n", PARAM_SERVER_ADDR, PARAM_SERVER_PORT); // 在OLED上显示启动信息 OledFillScreen(0x00); OledShowString(0, 0, "Starting...", FONT8x16); OledShowString(0, 2, PARAM_HOTSPOT_SSID, FONT8x16); // 等待100ms osDelay(10); // 连接到热点 printf("开始连接WiFi...\r\n"); int netId = ConnectToHotspot(&config); // 检查是否成功连接到热点 if (netId < 0) { // 连接到热点失败 printf("WiFi连接失败!错误代码: %d\r\n", netId); OledFillScreen(0x00); OledShowString(0, 0, "WiFi Failed!", FONT8x16); OledShowString(0, 2, "Check Config", FONT8x16); return; } // 连接到热点成功,显示连接成功信息 printf("WiFi连接成功!网络ID: %d\r\n", netId); OledFillScreen(0x00); OledShowString(0, 0, "WiFi Connected", FONT8x16); OledShowString(0, 2, "Starting UDP...", FONT8x16); // 等待一段时间确保连接稳定 printf("等待网络稳定...\r\n"); sleep(3); // 运行UDP客户端测试,发送IP地址到服务器 printf("启动UDP客户端,连接服务器 %s:%d\r\n", PARAM_SERVER_ADDR, PARAM_SERVER_PORT); UdpClientTest(PARAM_SERVER_ADDR, PARAM_SERVER_PORT); // 断开热点连接 printf("断开WiFi连接...\r\n"); DisconnectWithHotspot(netId); printf("WiFi连接已断开!\r\n"); } // 入口函数 static void NetDemoEntry(void) { switch_init(); interrupt_monitor(); // 初始化OLED OledInit(); // 全屏填充黑色 OledFillScreen(0x00); // OLED显示APP标题 OledShowString(0, 0, "UdpClient Test", FONT8x16); // 定义线程属性 osThreadAttr_t attr; attr.name = "NetDemoTask"; attr.attr_bits = 0U; attr.cb_mem = NULL; attr.cb_size = 0U; attr.stack_mem = NULL; attr.stack_size = 10240; attr.priority = osPriorityNormal; // 创建线程 if (osThreadNew(NetDemoTask, NULL, &attr) == NULL) { printf("[NetDemoEntry] Falied to create NetDemoTask!\n"); } attr.name = "controlTask"; attr.stack_size = 2048; if (osThreadNew(controlTask, NULL, &attr) == NULL) { printf("[control] Falied to create NetDemoTask!\n"); } } // 运行入口函数 SYS_RUN(NetDemoEntry);