| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- /**
- * @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 -
- * <a href="https://mengze.top/MZ-ATY_VCJS">
- * https://mengze.top/MZ-ATY_VCJS</a>
- * - CC 4.0 BY-NC-SA -
- * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
- * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
- * - 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 *********************************/
|