【世界快播报】基于STM32设计的智能灌溉控制系统
2023-05-17 10:47:15 来源:DS小龙哥-嵌入式技术

一、项目介绍

随着现代农业的发展,人们对于水资源的合理利用越来越重视。而传统的灌溉方式往往存在着浪费水资源、劳动力投入大、效率低等问题。因此,设计一款智能灌溉控制系统,可以实现对灌溉水量的精准控制,增加水资源利用率,提高农业生产效率,具有广泛的应用前景。


(资料图片仅供参考)

当前文章介绍一款高性能的智能灌溉控制系统的开发过程,可自动采集电压、电流、累计用水量,并根据用户需要实现自动灌溉、定时灌溉、周期灌溉和手动灌溉等多种模式,同时具备中控室控制、手机短信、现场遥控及现场手动等多种方式控制功能。该系统可以对现场温湿度限值进行设置和修改,并通过控制器或后台监控系统完成灌溉起始时间、停止时间、喷灌时间等参数设置。系统显示功能包括液晶屏以中文菜单方式显示现场采集数据以及后台监控系统配大屏幕显示器,图形、表格等多种形式动态显示整个灌溉区运行情况。同时,在电压、电流或者流量出现异常时,系统可以及时报警。该系统供电为220VAC,流量计量误差精度为2级,使用二维码或卡实现预付费功能,通讯使用4G与云平台连接。

二、设计功能

本系统采用STM32作为主控芯片,并通过AD模块采集电压、电流和流量等数据。同时,通过继电器控制灌溉设备的启停,使用PWM控制阀门的开合程度,从而实现精确控制灌溉水量。通信模块则采用4G模块与云平台连接,实现远程监控及控制功能。预付费模块则使用二维码或卡实现预付费功能,用户需在充值后才能使用该系统进行灌溉操作。

系统软件设计包括采集程序、控制程序、前端程序和后台程序。其中,采集程序主要负责采集电压、电流、流量等数据,并将采集到的数据上传到云平台;控制程序主要负责控制灌溉设备的启停和阀门的开合程度,从而实现灌溉控制;前端程序主要负责实现中文菜单方式显示现场采集数据,并提供灌溉模式选择、参数设置等功能;后台程序主要负责实现大屏幕显示器、图形、表格等多种形式动态显示整个灌溉区运行情况。

【1】硬件部分

MCU:本系统采用STM32作为主控芯片,其具有高性能、低功耗等优点,可满足该系统的高要求。数据采集模块:本系统通过AD模块采集电压、电流和流量等数据,然后使用MCU进行处理,并将采集到的数据存储到Flash中。控制模块:本系统通过继电器控制灌溉设备的启停,同时使用PWM控制阀门的开合程度,从而实现精确控制灌溉水量。通信模块:本系统采用4G模块与云平台连接,实现远程监控及控制功能。预付费模块:本系统使用二维码或卡实现预付费功能,用户需在充值后才能使用该系统进行灌溉操作。

【2】软件部分

采集程序:本系统的采集程序主要负责采集电压、电流、流量等数据,并将采集到的数据上传到云平台。控制程序:本系统的控制程序主要负责控制灌溉设备的启停和阀门的开合程度,从而实现灌溉控制。前端程序:本系统的前端程序主要负责实现中文菜单方式显示现场采集数据,并提供灌溉模式选择、参数设置等功能。后台程序:本系统的后台程序主要负责实现大屏幕显示器、图形、表格等多种形式动态显示整个灌溉区运行情况。

三、系统实现

具体实现过程如下:

(1)采集程序

采集程序主要由AD模块和STM32芯片完成。AD模块采集电压、电流和流量等数据,经过滤波和放大处理后,传输到STM32芯片上。STM32芯片通过串口将采集到的数据上传到云平台,并存储在Flash中。

(2)控制程序

控制程序主要由继电器和PWM模块完成。继电器用于控制灌溉设备的启停,PWM模块则用于控制阀门的开合程度,从而实现精确控制灌溉水量。控制程序通过读取Flash中存储的参数,确定灌溉起始时间、停止时间、喷灌时间等操作流程,并根据实时采集到的数据进行动态调整,保证灌溉操作的准确性和稳定性。

(3)前端程序

前端程序主要是通过液晶屏以中文菜单方式显示现场采集数据,并提供灌溉模式选择、参数设置等功能。用户可以通过按键或触摸屏来进行操作,并实时查看灌溉操作的运行情况。此外,用户还可以通过手机短信、现场遥控或现场手动等方式对灌溉操作进行控制。

(4)后台程序

后台程序主要负责实现大屏幕显示器、图形、表格等多种形式动态显示整个灌溉区运行情况,同时还能够将采集到的数据进行分析和统计,为灌溉管理提供决策参考。

四、核心代码

【1】电机控制代码

以下是STM32F103ZET6通过PWM控制直流电机转速的代码,并封装成子函数调用的示例:

首先,需要在STM32CubeMX中配置TIM定时器和GPIO引脚,以及将PWM模式设置为嵌套边沿对齐模式,然后生成代码,并在main.c文件中添加以下代码:

#include "main.h"#include "stm32f1xx_hal.h"​/* TIM handle structure */TIM_HandleTypeDef htim;​/* Function prototypes */void PWM_Init(TIM_HandleTypeDef *htim, uint32_t channel);void Set_Motor_Speed(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed);​int main(void){ /* Initialize the HAL Library */ HAL_Init();​ /* Initialize TIM2 PWM with a frequency of 10 kHz */ PWM_Init(&htim2, TIM_CHANNEL_1);​ /* Set the motor speed to 50% */ Set_Motor_Speed(&htim2, TIM_CHANNEL_1, 5000);​ while (1)  {  /* Infiniteloop */  }}​/** * @brief  Initializes PWM output on specified TIM channel. * @paramhtim: TIM handle structure. * @param  channel: TIM channel to be used for PWM output. * @retval None */void PWM_Init(TIM_HandleTypeDef *htim, uint32_t channel){ TIM_OC_InitTypeDef sConfigOC = {0};​ /* Configure PWM output on specified TIM channel */ sConfigOC.OCMode    = TIM_OCMODE_PWM1; sConfigOC.Pulse    = 0; sConfigOC.OCPolarity  = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode  = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, channel);​ /* Start PWM output */ HAL_TIM_PWM_Start(htim, channel);}​/** * @brief  Sets the motor speed on specified TIM channel. * @param  htim: TIM handle structure. * @param  channel: TIM channel to be used for PWM output. * @param  speed: Motor speed in units of 1/10,000th of the maximum speed. *         For example, a speed of 5000 would set the motor speed to 50%. * @retval None */void Set_Motor_Speed(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed){ uint16_t max_speed = htim->Init.Period;​ /* Ensure that speed is within range */ if (speed > max_speed)  speed = max_speed;​ /* Update PWM duty cycle */ __HAL_TIM_SET_COMPARE(htim, channel, speed);}

在以上代码中,定义了两个函数:PWM_Init和Set_Motor_Speed。PWM_Init用于初始化TIM定时器的PWM输出,并设置指定通道的PWM模式和默认占空比为0。Set_Motor_Speed用于设置电机的转速,其接收三个参数:TIM句柄结构体,指定的通道,以及电机的转速(单位为1/10,000最大速度)。该函数会将电机的转速转换为PWM占空比,并通过__HAL_TIM_SET_COMPARE函数更新PWM占空比。

最后,可以按照以下步骤将代码封装成子函数调用:

将以上代码复制到单独的.c文件中,并包含必要的头文件。在该文件中定义一个名为Motor_Control的函数,该函数接收三个参数:TIM句柄结构体,指定的通道,以及电机的转速。在Motor_Control函数中调用PWM_Init和Set_Motor_Speed函数,并传递相应的参数。在main函数中调用Motor_Control函数,传递相应的参数。

以下是Motor_Control函数的示例代码:

#include "motor_control.h"​void Motor_Control(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed){ /* Initialize PWM output on specified TIM channel */ PWM_Init(htim, channel);​ /* Set the motor speed */ Set_Motor_Speed(htim, channel, speed);}

在以上示例中,将PWM的初始化和设置电机转速的函数封装成了一个名为Motor_Control的函数。可以在需要控制电机转速的其他地方调用Motor_Control函数即可。

注意,在调用Motor_Control函数之前,需要先定义并初始化TIM句柄结构体,并确保GPIO引脚已经正确配置为TIM模式。此外,如果需要控制多个电机,可以在Motor_Control函数中增加参数以区分不同的电机通道。

以下是motor_control.h头文件的示例代码:

cCopy Code#ifndef __MOTOR_CONTROL_H__#define __MOTOR_CONTROL_H__​#include "stm32f1xx_hal.h"​/* Function prototypes */void PWM_Init(TIM_HandleTypeDef *htim, uint32_t channel);void Set_Motor_Speed(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed);void Motor_Control(TIM_HandleTypeDef *htim, uint32_t channel, uint16_t speed);​#endif /* __MOTOR_CONTROL_H__ */

在以上头文件中,声明了三个函数:PWM_Init,Set_Motor_Speed和Motor_Control,并包含必要的头文件。

【2】电压、电流采集

为了采集220V抽水电机的用电量和当前电压,当前使用STM32F103ZET6的ADC模数转换器)来测量电压和电流,并通过乘法器计算电功率和电能。

下面是实现方案和实现代码:

选择合适的传感器: 为了测量电压,可以使用AC-AC变压器将220V交流电压降至低电平,再使用电阻分压器将电压信号调整在ADC的输入范围内。 为了测量电流,可以使用霍尔传感器或者电阻式传感器,将电流信号转换成电压信号,然后通过电阻分压器调整信号范围。配置ADC: 使用STM32CubeMX软件选择相应的引脚和配置ADC模块,设置采样频率、参考电压等参数。需要注意的是,ADC模块只能同时转换一路模拟信号,因此需要轮流采样电压和电流信号。计算电流、电压、功率和能量: 将电压和电流信号转换成数字值后,可以使用下面的公式计算电流、电压、功率和能量:
Copy Code电流 = AD值 / 灵敏度电压 = AD值 / 分压比功率 = 电压 * 电流能量 = 功率 * 时间

其中,灵敏度是传感器的转换系数,分压比是电阻分压器的比值,时间可以通过定时器计算。

输出数据: 将测量的电流、电压、功率和能量输出到串口或者LCD显示屏上。可以设置一个定时器,在一定时间间隔内输出一次数据。

实现代码:

#include "stm32f1xx_hal.h"​ADC_HandleTypeDef hadc1;TIM_HandleTypeDef htim2;​void SystemClock_Config(void);static void MX_GPIO_Init(void);static void MX_ADC1_Init(void);static void MX_TIM2_Init(void);​uint16_t ad_val_ch1, ad_val_ch2;float voltage, current, power, energy;​int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); MX_TIM2_Init();​ while (1)  {  // ADC采样电压信号  HAL_ADC_Start(&hadc1);  HAL_ADC_PollForConversion(&hadc1, 100);  ad_val_ch1 = HAL_ADC_GetValue(&hadc1);  voltage = ad_val_ch1 * 3.3 / 4096 * 10; // 假设分压比为10​  // ADC采样电流信号  HAL_TIM_Base_Start(&htim2);  HAL_ADC_Start(&hadc1);  HAL_ADC_PollForConversion(&hadc1, 100);  ad_val_ch2 = HAL_ADC_GetValue(&hadc1);  current = ad_val_ch2 * 3.3 / 4096 * 50; // 假设灵敏度为50mV/A​  // 计算功率和能量  power = voltage * current;  energy += power * 0.1; // 假设定时器时间间隔为100ms​  // 输出测量结果  printf("Voltage: %.2f Vrn", voltage);  printf("Current: %.2f Arn", current);  printf("Power: %.2f Wrn", power);  printf("Energy: %.2f Jrn", energy);​  HAL_Delay(1000); // 假设数据输出间隔为1s  }}​void SystemClock_Config(void){ RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};​ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);​ RCC_OscInitStruct.OscillatorType = RCCRCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}​RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}}​static void MX_ADC1_Init(void){ADC_ChannelConfTypeDef sConfig = {0};​__HAL_RCC_ADC1_CLK_ENABLE();​hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK){Error_Handler();}​sConfig.Channel = ADC_CHANNEL_0; // 假设测量电压的ADC通道为0sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}​sConfig.Channel = ADC_CHANNEL_1; // 假设测量电流的ADC通道为1if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK){Error_Handler();}}​static void MX_TIM2_Init(void){__HAL_RCC_TIM2_CLK_ENABLE();​htim2.Instance = TIM2;htim2.Init.Prescaler = 7200 - 1;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 10000 - 1; // 假设定时器时间间隔为100msif (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}}​void Error_Handler(void){while (1){}}​#ifdef USE_FULL_ASSERT​void assert_failed(char *file, uint32_t line){}​#endif

【世界快播报】基于STM32设计的智能灌溉控制系统

2023-05-17

楼面价9199元/㎡!瑞安又挂牌一宗住宅地块,位置就在...

2023-05-17

美强行定义中国“发达”居心不良|天天即时看

2023-05-17

环球微动态丨老杜收到的祝福,真是五雷轰顶,哭在厕所里

2023-05-17

亚光科技:公司微波电路及组件等产品作为军用电子元器件广泛用于星载、机载、舰载、弹载、地面等应用平台的雷达部件、通讯部件、电子对抗等

2023-05-17

天天亮点!动漫ed是什么东西_动漫ed是什么

2023-05-17

家俱和家具的区别在哪_家俱和家具的区别 世界热点评

2023-05-17

巴特勒:东决G1想抢占先机 每个赛季都相信自己能赢得总冠军_当前看点

2023-05-17

汽车仪表太阳灯亮了是什么意思 汽车仪表的STOP是什么意思-全球信息

2023-05-17

孙兴慜和凯恩的死亡连线再度重现江湖_世界观天下

2023-05-17

奥委会是什么_奥委会和奥组委有什么区别|环球信息

2023-05-16

英雄联盟手游飞机出装_英雄联盟手游飞机新加点 环球聚焦

2023-05-16

曾仕强品三国:关羽温酒斩华雄

2023-05-16

2023年中国针焦行业分析

2023-05-16

【速看料】热情球迷集结机场,欢迎创造历史的浙江稠州金租男篮回家

2023-05-16

重庆:小区公共区域经营所得该归谁?法院判了_微资讯

2023-05-16

支付宝粘福卡_支付宝沾福卡

2023-05-16

马斯克:特斯拉将在法国进行重大投资 每日快报

2023-05-16

兵团2023初级会计成绩什么时候出

2023-05-16

维科技术拟定增募资不超3亿元 2021年定增募资7亿|世界要闻

2023-05-16

全球观焦点:东京股市三连涨

2023-05-16

今头条!太阳记者挖出KD去年称赞纳斯采访:他的能力让对手夜不能寐

2023-05-16

焦点速递!考驾照难吗我脑子笨(考驾照难)

2023-05-16

钮文新:低CPI是挑战也是机遇——金融结构调整的最佳时机

2023-05-16

发生了什么?传媒股突然大跌!私募大佬被“割韭菜”?最新回应

2023-05-16

开封失业保险和失业补助有什么区别? 环球动态

2023-05-16

河南安阳:警灯闪烁 守护夏夜烟火气

2023-05-16

今日热闻!dec是几月的缩写_dec几月

2023-05-16

红酒兑什么饮料更好喝?_世界视点

2023-05-16

知道税额如何求含税金额_已知税额求含税金额|全球短讯

2023-05-16

三川智慧:5月15日融资净买入103.81万元,连续3日累计净买入457.62万元

2023-05-16

速讯:海外联赛金球奖!中国足球也有一个“梅西”

2023-05-16

‘疯子教练’贝尔萨被正式认命为乌拉圭男足国家队主教练! 环球热闻

2023-05-16

当前动态:骑它出门泰酷辣! 试骑一下极核C!TY PLAY

2023-05-16

中信建投:军工行业处于板块估值、业绩增速以及资金配置三重底部区间-环球关注

2023-05-16

观速讯丨金钱癣初期图片(金钱癣)

2023-05-16

智微智能(001339):5月15日北向资金增持6.33万股 环球新视野

2023-05-16

焦点热讯:南雄龙华山温泉_龙华山温泉

2023-05-16

注射用盐酸曲马多是激素吗_曲马多注射液是什么药 焦点消息

2023-05-16

jxedugovcn成绩查询入口_jxedu gov cn

2023-05-16

环球微资讯!pu和橡胶的区别(pu和橡胶的区别是什么)

2023-05-15

专访 | 女足留洋国脚李梦雯:融入环境 自主思考

2023-05-15

刺客信条主角名字-刺客信条123现代主角是谁|观天下

2023-05-15

心理研究编辑部(心理医生杂志编审中心)_速递

2023-05-15

【说政事·向“扬”生长】招商引资“擂台赛”,扬州这样打响!

2023-05-15

农业农村部种植业管理司二级巡视员宁鸣辉莅临云图控股总部调研

2023-05-15

天天观天下!五菱神车陷危机,焕发第二春存有多大的可能?

2023-05-15

这才是大当家!51分大号两双送MVP回家,没有勇士,真要夺冠?

2023-05-15

华为畅享60 Pro正式官宣:直屏设计+轻薄家族设计+5000mAh大电池

2023-05-15

世界时讯:沃尔沃总裁:我们绝不会赔钱卖车

2023-05-15

趁早学车有什么好处?为什么要趁早学车

2023-05-15

《塞尔达传说 王国之泪》呀哈哈抓蒲公英任务完成方法|最新资讯

2023-05-15

贵条是什么香料?-焦点

2023-05-15

夏粮丰收在望 山西运城439万亩小麦长势良好 报资讯

2023-05-15

全球观热点:银行信用卡逾期会联系家人吗?欠信用卡申请停息挂账没通过怎么办?

2023-05-15

环球观天下!泰国大选出口民调出炉:为泰党、前进党领先

2023-05-15

吉首大学与益阳市中心医院临床教学合作签约仪式举行|动态焦点

2023-05-15

世界短讯!新能源汽车行业招聘!

2023-05-15

今日快看!女子斯诺克迎来新王!白雨露绝杀“女皇”埃文斯加冕英国公开赛

2023-05-15

全球快看点丨千方百计助经营主体“长得好”

2023-05-15

某些央企“偏爱”北京户口:甚至非京籍清华硕博,都无法通过HR那关

2023-05-15

遥遥领先苹果!余承东:华为WATCH4系列首发血糖评估

2023-05-15

保险:供需同频共振行业处于相对底部位置,市场回暖推动利润弹性释放_当前快讯

2023-05-15

当前热门:大模型混战:科大讯飞不能输的一战

2023-05-15

世界最资讯丨成功下穿沪昆高铁!云南三清高速建设取得新进展

2023-05-15

洪都拉斯外长:将很快启动与中国自贸协定谈判,“将是一个好消息” 实时焦点

2023-05-15

每日视讯:陈平不进则亡读后感

2023-05-15

环球短讯!火星数字教学_关于火星数字教学介绍

2023-05-15

天天动态:戴奇:曼城能通过不同方式取得进球,他们有5名球员可以主导进攻

2023-05-15

采样频率越高越好吗_采样频率

2023-05-14

世界信息:“骑遍四川”2023年“中国最美乡村路”巴山大峡谷自行车爬坡大师赛收官

2023-05-14

献礼母亲节 湖南省妇幼保健院开展母亲节健康教育及送感恩卡片活动|最新消息

2023-05-14

承德避暑山庄怎么走?北京到承德避暑山庄自驾车路线?|每日消息

2023-05-14

万事胜意繁体书法作品_万事胜意的繁体字怎么写 简讯

2023-05-14

韦国清在文革中的暴行_韦国清是广西败类 全球快资讯

2023-05-14

环球热资讯!天童美语上班感觉_天童美语上班不想干

2023-05-14

报考公务员需要看什么书

2023-05-14

专访张宁:苏迪曼杯中国优势大 期待陈雨菲做到这两点

2023-05-14

环球视讯!伊拉克宣布原油储量增加100亿桶

2023-05-14

斯芬克斯是指的什么_斯芬克斯是指-天天头条

2023-05-14

紧急辟谣!路易斯安娜州限买地法案并不针对个人-环球今日讯

2023-05-14

美军进驻芬兰将加剧地缘对抗

2023-05-14

黑帮小姐的未婚夫在线观看_黑帮小姐的未婚夫

2023-05-14

全球微资讯!16位外甥暑假住舅舅家:55天花6万(16位外甥暑假住舅舅家:55天花6万/we.)

2023-05-14

世界通讯!半场-萨内助攻穆勒破门基米希点射 拜仁暂2-0沙尔克

2023-05-14

T1拒绝让二追三击败GEN:我期待你在败者组杀回来,向我复仇!

2023-05-14

湖北一接亲队伍手持刺刀挂日本国旗,当地回应:本地迎亲风俗

2023-05-13

世界实时:增设车道、待行区!昆明城市主干道上这个大流量路口优化啦

2023-05-13

中南大学博士生导师郭亚东教授来到怀化学院法学与公共管理学院讲学

2023-05-13

环球今日报丨新鲜蛏如何保存 蛏子怎么保存

2023-05-13

热议:刺客伍六七:强者的背后是不是都有一段不为人知的故事?(上)

2023-05-13

阅读营造良好家风,成都市女职工阅读活动启动|世界观天下

2023-05-13

焦点要闻:三只松鼠内温馨小礼物的感触_三只松鼠内温馨小礼物的感触

2023-05-13

女人梦到丢鞋然后找鞋(女人梦到丢鞋然后找鞋周公解梦)

2023-05-13

视焦点讯!痒怎么组词(痒怎么组词两个字)

2023-05-13

天天简讯:0.3%的概率进季后赛!湖人从2胜10负西部第13一路逆袭进西决

2023-05-13

江苏南通:职业病防护添利器 为工人撑起健康保护伞

2023-05-13

数据表明,同人文在规范下更扩大了-当前通讯

2023-05-13

一向精明的郭嘉为何提议放过刘备,曹操为何言听计从?原因很简单

2023-05-13

哈姆谈外界嘲笑浓眉伤病:不关心 球队高度欣赏浓眉的职业精神 世界聚看点

2023-05-13