Files
License_plate_recognition/demo_entry_cmsis.c
2025-10-18 16:05:39 +08:00

510 lines
21 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h> // 标准输入输出
#include <unistd.h> // POSIX标准接口
#include <string.h> // 字符串处理(操作字符数组)
#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);
}
}
// 兼容旧命令的处理逻辑只有在非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;
}
}
// 兼容旧的计时逻辑
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);