417 lines
15 KiB
C
417 lines
15 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"
|
|
|
|
#include <string.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;
|
|
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) {
|
|
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"));
|
|
}
|
|
/* 保存数据到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);
|
|
}
|