#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" #include "Usr_4GCatDtuDrv.h" #include #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 unsigned short gMcuTaskManyPara4gSerial = 0; /* 北斗发送标志位 */ static int gMcuTaskManyParaBeiDouSendFlag = 0; static unsigned char gMcuTaskManyParaBeiDouSerial = 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) { McuTaskFlashWriteOpt("ManyPara Join\r\n", strlen("ManyPara Join\r\n")); /* 获取数据 */ 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); McuTaskFlashWriteOpt("ManyPara BlueTh Send Data\r\n", strlen("ManyPara BlueTh Send Data\r\n")); TaskBlueToothSendMessage(MCU_TASK_MANYPARA_SEND_MESSAGE_ID, &gMcuTaskManyParaBlueToothSerial, gMcuTaskManyParaBlueToothSendBuf, sizeof(gMcuTaskManyParaBlueToothSendBuf)); gMcuTaskManyParaBlueToothSerial++; gMcuTaskManyParaBlueToothSendFlag = 0; } if (gMcuTaskManyParaBeiDouSendFlag == 1) { gMcuTaskManyParaBeiDouSendFlag = 0; if (1 != McuDrv4GCatDtuPowerSta()) { unsigned char crc = 0; int i = 0; unsigned char BeiDouSend[70] = {0}; gMcuTaskManyParaBeiDouSendFlag = 0; /* 发送水下多参数数据1 */ crc = 0; sprintf((char *)BeiDouSend, "ManyPara 01 %03d %0.3f %0.2f %0.2f", gMcuTaskManyParaBeiDouSerial, gTEM, gPH, gEC); for (i = 0; i < strlen((char *)BeiDouSend); i++) { crc ^= BeiDouSend[i]; } sprintf((char *)&BeiDouSend[strlen((char *)BeiDouSend)], "%x", crc); McuDrvBeiDouHtySendPacket(BeiDouSend, strlen((char *)BeiDouSend)); /* 发送水下多参数数据2 */ crc = 0; memset(BeiDouSend, 0, sizeof(BeiDouSend)); sprintf((char *)BeiDouSend, "ManyPara 02 %03d %0.4f %0.2f %0.2f", gMcuTaskManyParaBeiDouSerial, gDO, gMcuTaskOiwData.Oiw, gMcuTasNhn.Nhn); for (i = 0; i < strlen((char *)BeiDouSend); i++) { crc ^= BeiDouSend[i]; } sprintf((char *)&BeiDouSend[strlen((char *)BeiDouSend)], "%x", crc); McuDrvBeiDouHtySendPacket(BeiDouSend, strlen((char *)BeiDouSend)); gMcuTaskManyParaBeiDouSerial++; gMcuTaskManyParaBeiDouSerial = gMcuTaskManyParaBeiDouSerial % 1000; McuTaskFlashWriteOpt("ManyPara BeiDou Send Data\r\n", strlen("ManyPara BeiDou Send Data\r\n")); } else { 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); McuTaskFlashWriteOpt("ManyPara 4G Send Data\r\n", strlen("ManyPara 4G Send Data\r\n")); McuDrv4GSendMessage(MCU_TASK_MANYPARA_SEND_MESSAGE_ID, &gMcuTaskManyPara4gSerial, gMcuTaskManyParaBlueToothSendBuf, sizeof(gMcuTaskManyParaBlueToothSendBuf)); gMcuTaskManyPara4gSerial++; } } /* 保存数据到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); McuTaskOiwDownPower(); if (rt < 0) { return -1; } 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); }