20230731_XiaoFuZi_emb/ZheDaXiaoFuZiBoot/Src/Usr/Task/McuTaskManyPara.c
Rjh913828050 a8560d741e 类型:重构
内容:重新整理项目文件分类
人员:任家豪
2023-10-08 16:10:23 +08:00

386 lines
13 KiB
C

#include "McuTaskManyPara.h"
#include "McuBspAdc.h"
#include "McuBspUart.h"
#include "McuTaskBlueTooth.h"
#include "BeiDouHtyDrv.h"
#include "ZthyToolDataTypeSwitch.h"
#include "McuTaskFlash.h"
#include "YsOiwY516A.h"
#include "McuNHN206ADrv.h"
#include "McuBspGpio.h"
#include "ZthyToolCheck.h"
#define MCU_TASK_UART_ID MCU_BSP_UART4_ID
#define MCU_TASK_RXBUF_LEN 32
static uint32_t gRxBufCount = 0;
static char gRxBuf[MCU_TASK_RXBUF_LEN] = {0};
static MCU_BSP_UART_CONF gMcuTaskUartConf = {0};
static void McuTaskUartRead(uint8_t data);
static int McuTaskWrite(uint8_t *data, uint32_t length);
static int McuTaskRead(uint8_t *data, uint32_t length);
/**********************************水中油****************************************************/
/* 控制引脚配置 */
#define MCU_TASK_OIW_ONOFF_GPIO_PORT GPIOG
#define MCU_TASK_OIW_ONOFF_GPIO_PIN GPIO_PIN_1
#define MCU_TASK_OIW_ONOFF_GPIO_MODE GPIO_MODE_OUTPUT_PP
#define MCU_TASK_OIW_ONOFF_GPIO_SPEED GPIO_SPEED_FREQ_HIGH
#define MCU_TASK_OIW_ONOFF_GPIO_PULL GPIO_PULLDOWN
static ys_oiw_y516a_data gMcuTaskOiwData;
static ys_oiw_y516a_dev gMcuTaskOiwDev = {0};
static uint32_t gMcuTaskOiwValue = 0;
/* 水中油上电 */
static void McuTaskOiwUpPower(void);
/* 水中油下电 */
static void McuTaskOiwDownPower(void);
static int8_t McuTaskOiwInit(void);
static int8_t McuTaskOiwMeasure(void);
/**********************************氨氮****************************************************/
#define MCU_TASK_NHN_UART_ID MCU_BSP_UART4_ID
#define MCU_TASK_NHN_RXBUF_LEN 32
/* 控制引脚配置 */
#define MCU_TASK_NHN_ONOFF_GPIO_PORT GPIOB
#define MCU_TASK_NHN_ONOFF_GPIO_PIN GPIO_PIN_13
#define MCU_TASK_NHN_ONOFF_GPIO_MODE GPIO_MODE_OUTPUT_PP
#define MCU_TASK_NHN_ONOFF_GPIO_SPEED GPIO_SPEED_FREQ_HIGH
#define MCU_TASK_NHN_ONOFF_GPIO_PULL GPIO_PULLDOWN
static HNH206A_OBJ gMcuTasNhn = {0};
static uint32_t gMcuTaskNhnValue = 0;
/* 水中油上电 */
static void McuTaskNhnUpPower(void);
/* 水中油下电 */
static void McuTaskNhnDownPower(void);
static int8_t McuTaskNhnInit(void);
static int8_t McuTaskNhnMeasure(void);
/******************************************* ADC采样 *************************************/
/* 控制引脚配置 */
#define MCU_TASK_ADC_ONOFF_GPIO_PORT GPIOB
#define MCU_TASK_ADC_ONOFF_GPIO_PIN GPIO_PIN_12
#define MCU_TASK_ADC_ONOFF_GPIO_MODE GPIO_MODE_OUTPUT_PP
#define MCU_TASK_ADC_ONOFF_GPIO_SPEED GPIO_SPEED_FREQ_HIGH
#define MCU_TASK_ADC_ONOFF_GPIO_PULL GPIO_PULLDOWN
#define MCU_TASK_TEMP_V_ADC MCU_ADC6
#define MCU_TASK_PH_V_ADC MCU_ADC5
#define MCU_TASK_COND_V_ADC MCU_ADC7
#define MCU_TASK_DO_V_ADC MCU_ADC8
static uint32_t gPH32 = 0;
static uint32_t gTEM32 = 0;
static uint32_t gEC32 = 0;
static uint32_t gDO32 = 0;
static float gPH = 0.0f;
static float gTEM = 0.0f;
static float gEC = 0.0f;
static float gDO = 0.0f;
static int McuTaskAdcInit(void);
/* ADC上电 */
static void McuTaskAdcUpPower(void);
static void McuTaskAdcDownPower(void);
/* 蓝牙发送标志位 */
static int gMcuTaskManyParaBlueToothSendFlag = 0;
static unsigned short gMcuTaskManyParaBlueToothSerial = 0;
static unsigned char gMcuTaskManyParaBlueToothSendBuf[25] = {0};
/* 北斗发送标志位 */
static int gMcuTaskManyParaBeiDouSendFlag = 0;
/******************************************************************************/
int McuTaskManyParaInit(void)
{
/* 初始化通信 */
gMcuTaskUartConf.BaudRate = 9600;
gMcuTaskUartConf.WordLength = UART_WORDLENGTH_8B;
gMcuTaskUartConf.StopBits = UART_STOPBITS_1;
gMcuTaskUartConf.Parity = UART_PARITY_NONE;
gMcuTaskUartConf.Mode = UART_MODE_TX_RX;
McuBspUartInit(MCU_TASK_UART_ID, &gMcuTaskUartConf,
NULL, McuTaskUartRead);
McuBspUartStartRecv(MCU_TASK_UART_ID);
/* 初始化氨氮 */
McuTaskNhnInit();
/* 初始化水中油 */
McuTaskOiwInit();
/* 初始化ADC */
McuTaskAdcInit();
return 0;
}
int McuTaskManyPara(void)
{
int i = 0;
if (gMcuTaskManyParaBlueToothSendFlag == 1 || gMcuTaskManyParaBeiDouSendFlag == 1) {
/* 获取数据 */
McuTaskAdcUpPower();
McuTaskNhnUpPower();
// for (i = 0; i < 52; i++) {
// HAL_Delay(5000);
// }
/* 获取氨氮 */
McuTaskNhnMeasure();
McuBspAdcGetData(MCU_TASK_TEMP_V_ADC, &gTEM);
McuBspAdcGetData(MCU_TASK_PH_V_ADC, &gPH);
McuBspAdcGetData(MCU_TASK_COND_V_ADC, &gEC);
McuBspAdcGetData(MCU_TASK_DO_V_ADC, &gDO);
McuTaskAdcDownPower();
McuTaskNhnDownPower();
McuTaskOiwUpPower();
/* 获取水中油数据 */
McuTaskOiwMeasure();
McuTaskOiwDownPower();
if (gMcuTaskManyParaBlueToothSendFlag == 1) {
ZthyToolFloatToUint32(gTEM, &gTEM32);
ZthyToolFloatToUint32(gPH, &gPH32);
ZthyToolFloatToUint32(gEC, &gEC32);
ZthyToolFloatToUint32(gDO, &gDO32);
gMcuTaskManyParaBlueToothSendBuf[0] = 1;
gMcuTaskManyParaBlueToothSendBuf[1] = (uint8_t)((gTEM32 & 0xff000000) >> 24);
gMcuTaskManyParaBlueToothSendBuf[2] = (uint8_t)((gTEM32 & 0x00ff0000) >> 16);
gMcuTaskManyParaBlueToothSendBuf[3] = (uint8_t)((gTEM32 & 0x0000ff00) >> 8);
gMcuTaskManyParaBlueToothSendBuf[4] = (uint8_t)(gTEM32 & 0x000000ff);
gMcuTaskManyParaBlueToothSendBuf[5] = (uint8_t)((gPH32 & 0xff000000) >> 24);
gMcuTaskManyParaBlueToothSendBuf[6] = (uint8_t)((gPH32 & 0x00ff0000) >> 16);
gMcuTaskManyParaBlueToothSendBuf[7] = (uint8_t)((gPH32 & 0x0000ff00) >> 8);
gMcuTaskManyParaBlueToothSendBuf[8] = (uint8_t)(gPH32 & 0x000000ff);
gMcuTaskManyParaBlueToothSendBuf[9] = (uint8_t)((gEC32 & 0xff000000) >> 24);
gMcuTaskManyParaBlueToothSendBuf[10] = (uint8_t)((gEC32 & 0x00ff0000) >> 16);
gMcuTaskManyParaBlueToothSendBuf[11] = (uint8_t)((gEC32 & 0x0000ff00) >> 8);
gMcuTaskManyParaBlueToothSendBuf[12] = (uint8_t)(gEC32 & 0x000000ff);
gMcuTaskManyParaBlueToothSendBuf[13] = (uint8_t)((gDO32 & 0xff000000) >> 24);
gMcuTaskManyParaBlueToothSendBuf[14] = (uint8_t)((gDO32 & 0x00ff0000) >> 16);
gMcuTaskManyParaBlueToothSendBuf[15] = (uint8_t)((gDO32 & 0x0000ff00) >> 8);
gMcuTaskManyParaBlueToothSendBuf[16] = (uint8_t)(gDO32 & 0x000000ff);
gMcuTaskManyParaBlueToothSendBuf[17] = (uint8_t)((gMcuTaskOiwValue & 0xff000000) >> 24);
gMcuTaskManyParaBlueToothSendBuf[18] = (uint8_t)((gMcuTaskOiwValue & 0x00ff0000) >> 16);
gMcuTaskManyParaBlueToothSendBuf[19] = (uint8_t)((gMcuTaskOiwValue & 0x0000ff00) >> 8);
gMcuTaskManyParaBlueToothSendBuf[20] = (uint8_t)(gMcuTaskOiwValue & 0x000000ff);
gMcuTaskManyParaBlueToothSendBuf[21] = (uint8_t)((gMcuTaskNhnValue & 0xff000000) >> 24);
gMcuTaskManyParaBlueToothSendBuf[22] = (uint8_t)((gMcuTaskNhnValue & 0x00ff0000) >> 16);
gMcuTaskManyParaBlueToothSendBuf[23] = (uint8_t)((gMcuTaskNhnValue & 0x0000ff00) >> 8);
gMcuTaskManyParaBlueToothSendBuf[24] = (uint8_t)(gMcuTaskNhnValue & 0x000000ff);
TaskBlueToothSendMessage(MCU_TASK_MANYPARA_SEND_MESSAGE_ID, &gMcuTaskManyParaBlueToothSerial, gMcuTaskManyParaBlueToothSendBuf, sizeof(gMcuTaskManyParaBlueToothSendBuf));
gMcuTaskManyParaBlueToothSerial++;
gMcuTaskManyParaBlueToothSendFlag = 0;
}
if (gMcuTaskManyParaBeiDouSendFlag == 1) {
gMcuTaskManyParaBeiDouSendFlag = 0;
}
/* 保存数据到Flash */
McuTaskFlashWriteManyPara(gTEM, gPH, gEC, gDO, gMcuTaskOiwData.Oiw, gMcuTasNhn.Nhn);
}
return 0;
}
/* 蓝牙请求数据 */
void McuTaskManyParaBlueToothAsk(void)
{
gMcuTaskManyParaBlueToothSendFlag = 1;
}
/* 北斗请求数据 */
void McuTaskManyParaBeiDouAsk(void)
{
gMcuTaskManyParaBeiDouSendFlag = 1;
}
/* 获取数据请求状态 */
int McuTaskManyParaAskStatus(void)
{
return ((gMcuTaskManyParaBlueToothSendFlag * 2) | gMcuTaskManyParaBeiDouSendFlag);
}
/***************************水中油**************************************/
static int8_t McuTaskOiwInit(void)
{
int rt = -1;
McuBspGpioInit(MCU_TASK_OIW_ONOFF_GPIO_PORT, MCU_TASK_OIW_ONOFF_GPIO_PIN,
MCU_TASK_OIW_ONOFF_GPIO_MODE, MCU_TASK_OIW_ONOFF_GPIO_SPEED,
MCU_TASK_OIW_ONOFF_GPIO_PULL, 0, NULL);
McuTaskOiwUpPower();
HAL_Delay(2000);
gMcuTaskOiwDev.NewDevAddr = 0x06;
gMcuTaskOiwDev.OldDevAddr = 0x06;
gMcuTaskOiwDev.Calib.k = 1.0f;
gMcuTaskOiwDev.Calib.b = 0.0f;
gMcuTaskOiwDev.Read = McuTaskRead;
gMcuTaskOiwDev.Write = McuTaskWrite;
gMcuTaskOiwDev.DelayMs = HAL_Delay;
gMcuTaskOiwDev.Crc = ZthyToolCheckCrc8_0x8005;
rt = YsOiw516AInit(&gMcuTaskOiwDev);
if (rt < 0) {
return -1;
}
McuTaskOiwDownPower();
HAL_Delay(2000);
gMcuTaskOiwData.OiwIndex = YS_OIW_Y516A_DEV_ENABLE;
gMcuTaskOiwData.TempIndex = YS_OIW_Y516A_DEV_ENABLE;
return rt;
}
static int8_t McuTaskOiwMeasure(void)
{
int i = 0;
int j = 0;
double Temp = 0.0; // 获取的温度
double Oiw = 0.0; // 获取的水中游
HAL_Delay(2000);
YsOiw516ADevStartMeasure(&gMcuTaskOiwDev);
for (; i < 10; i++) {
HAL_Delay(2000);
if (0 > YsOiw516ADevGetOiwAndTemp(&gMcuTaskOiwDev, &gMcuTaskOiwData)) {
continue;
}
Temp += gMcuTaskOiwData.Temp;
Oiw += gMcuTaskOiwData.Oiw;
j++;
}
if (j == 0) {
return -1;
}
gMcuTaskOiwData.Temp = Temp / j;
gMcuTaskOiwData.Oiw = Oiw / j;
ZthyToolFloatToUint32(gMcuTaskOiwData.Oiw, &gMcuTaskOiwValue);
return 0;
}
/* 水中油上电 */
static void McuTaskOiwUpPower(void)
{
McuBspGpioSetLevel(MCU_TASK_OIW_ONOFF_GPIO_PORT, MCU_TASK_OIW_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
}
/* 水中油下电 */
static void McuTaskOiwDownPower(void)
{
McuBspGpioSetLevel(MCU_TASK_OIW_ONOFF_GPIO_PORT, MCU_TASK_OIW_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW);
}
/*********************************氨氮***********************************/
static int8_t McuTaskNhnInit(void)
{
int rt = -1;
McuBspGpioInit(MCU_TASK_NHN_ONOFF_GPIO_PORT, MCU_TASK_NHN_ONOFF_GPIO_PIN,
MCU_TASK_NHN_ONOFF_GPIO_MODE, MCU_TASK_NHN_ONOFF_GPIO_SPEED,
MCU_TASK_NHN_ONOFF_GPIO_PULL, 0, NULL);
McuTaskNhnUpPower();
HAL_Delay(2000);
gMcuTasNhn.Nnh206aRecv = McuTaskRead;
gMcuTasNhn.Nnh206aSend = McuTaskWrite;
gMcuTasNhn.DelayMs = HAL_Delay;
gMcuTasNhn.Crc = ZthyToolCheckCrc8_0x8005;
McuTaskNhnDownPower();
HAL_Delay(2000);
return rt;
}
static int8_t McuTaskNhnMeasure(void)
{
int i = 0;
int j = 0;
double Temp = 0.0; // 获取的温度
double Nhn = 0.0; // 获取的水中游
HAL_Delay(2000);
for (; i < 10; i++) {
HAL_Delay(2000);
if (0 > McuHNH206ADrvGetValue(&gMcuTasNhn)) {
continue;
}
Temp += gMcuTasNhn.Temp;
Nhn += gMcuTasNhn.Nhn;
j++;
}
if (j == 0) {
return -1;
}
gMcuTasNhn.Temp = Temp / j;
gMcuTasNhn.Nhn = Nhn / j;
ZthyToolFloatToUint32(gMcuTasNhn.Nhn, &gMcuTaskNhnValue);
return 0;
}
/* 氨氮上电 */
static void McuTaskNhnUpPower(void)
{
McuBspGpioSetLevel(MCU_TASK_NHN_ONOFF_GPIO_PORT, MCU_TASK_NHN_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
}
/* 氨氮下电 */
static void McuTaskNhnDownPower(void)
{
McuBspGpioSetLevel(MCU_TASK_NHN_ONOFF_GPIO_PORT, MCU_TASK_NHN_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW);
}
/**********************************************************************************************************/
static void McuTaskUartRead(uint8_t data)
{
gRxBuf[gRxBufCount] = data;
gRxBufCount++;
gRxBufCount = gRxBufCount % MCU_TASK_RXBUF_LEN;
}
static int McuTaskWrite(uint8_t *data, uint32_t length)
{
gRxBufCount = 0;
return McuBspUartSend(MCU_TASK_NHN_UART_ID, data, length);
}
static int McuTaskRead(uint8_t *data, uint32_t length)
{
int i = 0;
if (length > MCU_TASK_NHN_RXBUF_LEN) {
return -1;
}
/* 等待接收完成 */
while (gRxBufCount < length) {
HAL_Delay(1);
i++;
/* 超时 */
if (i >= 100) {
break;
}
}
if (i < 100) {
for (i = 0; i < length; i++) {
data[i] = gRxBuf[i];
}
} else {
return -1;
}
return 0;
}
/********************************ADC*******************************/
static int McuTaskAdcInit(void)
{
McuBspGpioInit(MCU_TASK_ADC_ONOFF_GPIO_PORT, MCU_TASK_ADC_ONOFF_GPIO_PIN,
MCU_TASK_ADC_ONOFF_GPIO_MODE, MCU_TASK_ADC_ONOFF_GPIO_SPEED,
MCU_TASK_ADC_ONOFF_GPIO_PULL, 0, NULL);
McuBspAdcInit();
McuTaskAdcDownPower();
return 0;
}
/* ADC上电 */
static void McuTaskAdcUpPower(void)
{
McuBspGpioSetLevel(MCU_TASK_ADC_ONOFF_GPIO_PORT, MCU_TASK_ADC_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH);
}
/* ADC下电 */
static void McuTaskAdcDownPower(void)
{
McuBspGpioSetLevel(MCU_TASK_ADC_ONOFF_GPIO_PORT, MCU_TASK_ADC_ONOFF_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW);
}