hi3861软件
This commit is contained in:
		
							
								
								
									
										509
									
								
								demo_entry_cmsis.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										509
									
								
								demo_entry_cmsis.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,509 @@
 | 
			
		||||
#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);
 | 
			
		||||
		Reference in New Issue
	
	Block a user