/** * @file ALGO_MilkContent_ATY.c * * @param Project ALGO_Algorithm_ATY_LIB * * @author ATY * * @copyright * - Copyright 2017 - 2025 MZ-ATY * - This code follows: * - MZ-ATY Various Contents Joint Statement - * * https://mengze.top/MZ-ATY_VCJS * - CC 4.0 BY-NC-SA - * * https://creativecommons.org/licenses/by-nc-sa/4.0/ * - Your use will be deemed to have accepted the terms of this statement. * * @brief Familiar functions of MilkContent algorithm * * @version * - 1_01_221217 > ATY * -# Preliminary version, first Release ******************************************************************************** */ #ifndef __ALGO_MilkContent_ATY_C #define __ALGO_MilkContent_ATY_C #include "ALGO_MilkContent_ATY.h" /******************************* For user *************************************/ /******************************************************************************/ uint8_t detectContent_Milk = COW_MILK; __CODE MilkCoefficient_S coeSave[MILK_KIND_MAX - 1] = { // P/L/S/FM/FPl/FPo/SC/PH {0.3925, 0.5251, 0.0727, -0.071, 0.0588, -0.52}, // 2-COW_MILK // {0.367, 0.55, 0.083, 0, 0.52}, // 2-COW_MILK {0.5987, 0.3683, 0.066, -0, -0, -0.52}, // 3-SHEEP_MILK // {0.475, 0.45, 0.075, 0.52}, // 3-SHEEP_MILK {0.3972, 0.5205, 0.0802, -0.071134, 0.0874, -0.52}, // 4-UHT_MILK }; // Use: coeSave[kind - 2] MilkContent_S milcDefault = {0}; float dampAtRefT = 0; float speedAtRefT = 0; /** * @brief Calc Milk Density and Fat From US * * @param usSpeed us speed at current temperature * @param usDamp damp percent at current temperature, 50-100 * @param refT ref temperature */ void MilkDensityFatFromUS(float usSpeed, float usDamp, float refT, float offset) { if(usSpeed > 0) { if(detectContent_Milk == COW_MILK) { /* 30.589 1524.097 40.5036 1535.311 49.490 1523.449 */ // Speed=-0.13T^2+10.376T+(1328.33) (3.18,2.97P g/100ml) float speedParam_C = 0; #define P_A 0.13 #define P_B 10.376 speedParam_C = usSpeed + P_A * milcDefault.conTemperature * milcDefault.conTemperature - P_B * milcDefault.conTemperature; #define WEIGHT_DAIRY ((usSpeed - PureWaterSpeed(milcDefault.conTemperature)) / (1520 - PureWaterSpeed(milcDefault.conTemperature))) #define WEIGHT_WATER (1 - WEIGHT_DAIRY) speedAtRefT = (WEIGHT_WATER * PureWaterSpeed(refT)) + (WEIGHT_DAIRY * (speedParam_C - P_A * refT * refT + P_B * refT)); // y = -0.044959 x2 + 138.798999 x - 106,102.073260 (5.68 Plus) milcDefault.conDensity = (-106102 + 138.8 * speedAtRefT - 0.045 * speedAtRefT * speedAtRefT) + offset; // / PureWaterDensity(refT) * 1000; } else if(detectContent_Milk == PURE_WATER){ speedAtRefT = PureWaterSpeed(refT); milcDefault.conDensity = PureWaterDensity(milcDefault.conTemperature) + ((usSpeed - PureWaterSpeed(milcDefault.conTemperature)) * 1.6); // milcDefault.conDensity = PureWaterDensity(milcDefault.conTemperature); } if(milcDefault.conDensity < 0) milcDefault.conDensity = 0; } else milcDefault.conDensity = 0; if(detectContent_Milk > PURE_WATER && usDamp > 0 && milcDefault.conDensity > 1000) { /* 30.477 1529.69 35.400 1530.448 39.528 1531.863 44.571 1534.34 49.471 1537.76 */ // y=0.0189x^2-1.0874x+(1545.3) (3.18,2.97P g/100ml) float dampParam_C = 0; dampParam_C = usDamp - 0.0189 * milcDefault.conTemperature * milcDefault.conTemperature + 1.0874 * milcDefault.conTemperature; dampAtRefT = dampParam_C + 0.0189 * refT * refT - 1.0874 * refT; // Fat = fat + (fat - (Density - 1000) / 10) = 2 * fat - (Denaity - 1000) / 10 // if(dampAtRefT < 40 && milcDefault.conDensity - PureWaterDensity(refT) > 20) // milcDefault.conFat = 4.5; // else milcDefault.conFat = dampAtRefT * RefFat / 100; // milcDefault.conFat = (0.1500 * (milcDefault.conDensity - 1000)) + 0.0160; // Temp debug // milcDefault.conFat = milcDefault.conFat // + ((milcDefault.conFat - (milcDefault.conDensity - 1006) / 10) // * (1 - (milcDefault.conFat / RefFat))); if(milcDefault.conFat > 4.6) milcDefault.conFat = 4.6; else if(milcDefault.conFat < 0) milcDefault.conFat = 0; } else milcDefault.conFat = 0; MilkContentFromDensity(); } /** * @brief Analyse milk content from density */ void MilkContentFromDensity(void) { // Test algo // milcDefault.conDensity = 25.73; // milcDefault.conFat = 3.87; if(detectContent_Milk == PURE_WATER || milcDefault.conDensity < 1000) { milcDefault.conSnf = 0; milcDefault.conProtein = 0; milcDefault.conLactose = 0; milcDefault.conSalts = 0; milcDefault.conFreeze = 0; milcDefault.conWater = 100; milcDefault.conSC = 0; milcDefault.conPH = 0; return; } if(detectContent_Milk == COW_MILK || detectContent_Milk == SHEEP_MILK || detectContent_Milk == UHT_MILK) { milcDefault.conSnf = (100 - ( (99865) // Pure water density with temperature: y = -0.0038x2 - 0.0475x + 1000.5 (y = -0.3844x2 - 4.7525x + 100046) // (100046 - (4.7525 * milcDefault.conTemperature) - (0.3844 * milcDefault.conTemperature * milcDefault.conTemperature)) // / (milcDefault.conDensity + 1000)) + (0.075 * milcDefault.conFat)) / 0.378; / (milcDefault.conDensity)) + (0.075 * milcDefault.conFat)) / 0.378; // milcDefault.conSnf = (100 - (100000 / (milcDefault.conDensity + 1000)) + (0.075 * milcDefault.conFat)) / 0.378; // milcDefault.conSnf = (100 - (100000 / (milcDefault.conDensity + 1000)) + (0.075 * milcDefault.conFat)) / 0.3647; milcDefault.conProtein = coeSave[detectContent_Milk - 2].coeProtein * milcDefault.conSnf; milcDefault.conLactose = coeSave[detectContent_Milk - 2].coeLactose * milcDefault.conSnf; milcDefault.conSalts = coeSave[detectContent_Milk - 2].coeSalts * milcDefault.conSnf; milcDefault.conFreeze = (coeSave[detectContent_Milk - 2].coeFreezeMul * milcDefault.conSnf) + coeSave[detectContent_Milk - 2].coeFreezePlus; if(milcDefault.conFreeze < coeSave[detectContent_Milk - 2].coeFreezePoint) milcDefault.conFreeze = coeSave[detectContent_Milk - 2].coeFreezePoint; milcDefault.conWater = 100.0 - (100.0 * milcDefault.conFreeze / coeSave[detectContent_Milk - 2].coeFreezePoint); milcDefault.conSC = 0; milcDefault.conPH = 0; } #ifdef __DEBUG_ALGO_MilkContent_ATY printf("\r\n\r\nFinalData:\ \r\nFat - %2.5f\ \r\nDensity - %2.5f\ \r\nSNF - %2.5f\ \r\nProteinD - %2.5f\ \r\nLactose - %2.5f\ \r\nSalts - %2.5f\ \r\nWater - %2.5f\ \r\nFreezing - %2.5f\ \r\nTemperature - %2.5f\ ", milcDefault.conFat, milcDefault.conDensity, milcDefault.conSnf, milcDefault.conProtein, milcDefault.conLactose, milcDefault.conSalts, milcDefault.conWater, milcDefault.conFreeze, milcDefault.conTemperature); #endif /* __DEBUG_ALGO_MilkContent_ATY */ } #endif /* __ALGO_MilkContent_ATY_C */ /******************************** End Of File *********************************/