ALGO_MilkContent_ATY.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /**
  2. * @file ALGO_MilkContent_ATY.c
  3. *
  4. * @param Project ALGO_Algorithm_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2025 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief Familiar functions of MilkContent algorithm
  20. *
  21. * @version
  22. * - 1_01_221217 > ATY
  23. * -# Preliminary version, first Release
  24. ********************************************************************************
  25. */
  26. #ifndef __ALGO_MilkContent_ATY_C
  27. #define __ALGO_MilkContent_ATY_C
  28. #include "ALGO_MilkContent_ATY.h"
  29. /******************************* For user *************************************/
  30. /******************************************************************************/
  31. uint8_t detectContent_Milk = COW_MILK;
  32. __CODE MilkCoefficient_S coeSave[MILK_KIND_MAX - 1] = {
  33. // P/L/S/FM/FPl/FPo/SC/PH
  34. {0.3925, 0.5251, 0.0727, -0.071, 0.0588, -0.52}, // 2-COW_MILK
  35. // {0.367, 0.55, 0.083, 0, 0.52}, // 2-COW_MILK
  36. {0.5987, 0.3683, 0.066, -0, -0, -0.52}, // 3-SHEEP_MILK
  37. // {0.475, 0.45, 0.075, 0.52}, // 3-SHEEP_MILK
  38. {0.3972, 0.5205, 0.0802, -0.071134, 0.0874, -0.52}, // 4-UHT_MILK
  39. }; // Use: coeSave[kind - 2]
  40. MilkContent_S milcDefault = {0};
  41. float dampAtRefT = 0;
  42. float speedAtRefT = 0;
  43. /**
  44. * @brief Calc Milk Density and Fat From US
  45. *
  46. * @param usSpeed us speed at current temperature
  47. * @param usDamp damp percent at current temperature, 50-100
  48. * @param refT ref temperature
  49. */
  50. void MilkDensityFatFromUS(float usSpeed, float usDamp, float refT, float offset)
  51. {
  52. if(usSpeed > 0)
  53. {
  54. if(detectContent_Milk == COW_MILK)
  55. {
  56. /*
  57. 30.589 1524.097
  58. 40.5036 1535.311
  59. 49.490 1523.449
  60. */
  61. // Speed=-0.13T^2+10.376T+(1328.33) (3.18,2.97P g/100ml)
  62. float speedParam_C = 0;
  63. #define P_A 0.13
  64. #define P_B 10.376
  65. speedParam_C = usSpeed
  66. + P_A * milcDefault.conTemperature * milcDefault.conTemperature
  67. - P_B * milcDefault.conTemperature;
  68. #define WEIGHT_DAIRY ((usSpeed - PureWaterSpeed(milcDefault.conTemperature)) / (1520 - PureWaterSpeed(milcDefault.conTemperature)))
  69. #define WEIGHT_WATER (1 - WEIGHT_DAIRY)
  70. speedAtRefT = (WEIGHT_WATER * PureWaterSpeed(refT))
  71. + (WEIGHT_DAIRY * (speedParam_C - P_A * refT * refT + P_B * refT));
  72. // y = -0.044959 x2 + 138.798999 x - 106,102.073260 (5.68 Plus)
  73. milcDefault.conDensity =
  74. (-106102 + 138.8 * speedAtRefT - 0.045 * speedAtRefT * speedAtRefT)
  75. + offset;
  76. // / PureWaterDensity(refT) * 1000;
  77. }
  78. else if(detectContent_Milk == PURE_WATER){
  79. speedAtRefT = PureWaterSpeed(refT);
  80. milcDefault.conDensity = PureWaterDensity(milcDefault.conTemperature)
  81. + ((usSpeed - PureWaterSpeed(milcDefault.conTemperature)) * 1.6);
  82. // milcDefault.conDensity = PureWaterDensity(milcDefault.conTemperature);
  83. }
  84. if(milcDefault.conDensity < 0)
  85. milcDefault.conDensity = 0;
  86. }
  87. else
  88. milcDefault.conDensity = 0;
  89. if(detectContent_Milk > PURE_WATER && usDamp > 0 && milcDefault.conDensity > 1000)
  90. {
  91. /*
  92. 30.477 1529.69
  93. 35.400 1530.448
  94. 39.528 1531.863
  95. 44.571 1534.34
  96. 49.471 1537.76
  97. */
  98. // y=0.0189x^2-1.0874x+(1545.3) (3.18,2.97P g/100ml)
  99. float dampParam_C = 0;
  100. dampParam_C = usDamp
  101. - 0.0189 * milcDefault.conTemperature * milcDefault.conTemperature
  102. + 1.0874 * milcDefault.conTemperature;
  103. dampAtRefT = dampParam_C + 0.0189 * refT * refT - 1.0874 * refT;
  104. // Fat = fat + (fat - (Density - 1000) / 10) = 2 * fat - (Denaity - 1000) / 10
  105. // if(dampAtRefT < 40 && milcDefault.conDensity - PureWaterDensity(refT) > 20)
  106. // milcDefault.conFat = 4.5;
  107. // else
  108. milcDefault.conFat = dampAtRefT * RefFat / 100;
  109. // milcDefault.conFat = (0.1500 * (milcDefault.conDensity - 1000)) + 0.0160; // Temp debug
  110. // milcDefault.conFat = milcDefault.conFat
  111. // + ((milcDefault.conFat - (milcDefault.conDensity - 1006) / 10)
  112. // * (1 - (milcDefault.conFat / RefFat)));
  113. if(milcDefault.conFat > 4.6)
  114. milcDefault.conFat = 4.6;
  115. else if(milcDefault.conFat < 0)
  116. milcDefault.conFat = 0;
  117. }
  118. else
  119. milcDefault.conFat = 0;
  120. MilkContentFromDensity();
  121. }
  122. /**
  123. * @brief Analyse milk content from density
  124. */
  125. void MilkContentFromDensity(void)
  126. {
  127. // Test algo
  128. // milcDefault.conDensity = 25.73;
  129. // milcDefault.conFat = 3.87;
  130. if(detectContent_Milk == PURE_WATER || milcDefault.conDensity < 1000)
  131. {
  132. milcDefault.conSnf = 0;
  133. milcDefault.conProtein = 0;
  134. milcDefault.conLactose = 0;
  135. milcDefault.conSalts = 0;
  136. milcDefault.conFreeze = 0;
  137. milcDefault.conWater = 100;
  138. milcDefault.conSC = 0;
  139. milcDefault.conPH = 0;
  140. return;
  141. }
  142. if(detectContent_Milk == COW_MILK || detectContent_Milk == SHEEP_MILK || detectContent_Milk == UHT_MILK)
  143. {
  144. milcDefault.conSnf = (100 - (
  145. (99865)
  146. // Pure water density with temperature: y = -0.0038x2 - 0.0475x + 1000.5 (y = -0.3844x2 - 4.7525x + 100046)
  147. // (100046 - (4.7525 * milcDefault.conTemperature) - (0.3844 * milcDefault.conTemperature * milcDefault.conTemperature))
  148. // / (milcDefault.conDensity + 1000)) + (0.075 * milcDefault.conFat)) / 0.378;
  149. / (milcDefault.conDensity)) + (0.075 * milcDefault.conFat)) / 0.378;
  150. // milcDefault.conSnf = (100 - (100000 / (milcDefault.conDensity + 1000)) + (0.075 * milcDefault.conFat)) / 0.378;
  151. // milcDefault.conSnf = (100 - (100000 / (milcDefault.conDensity + 1000)) + (0.075 * milcDefault.conFat)) / 0.3647;
  152. milcDefault.conProtein = coeSave[detectContent_Milk - 2].coeProtein * milcDefault.conSnf;
  153. milcDefault.conLactose = coeSave[detectContent_Milk - 2].coeLactose * milcDefault.conSnf;
  154. milcDefault.conSalts = coeSave[detectContent_Milk - 2].coeSalts * milcDefault.conSnf;
  155. milcDefault.conFreeze = (coeSave[detectContent_Milk - 2].coeFreezeMul * milcDefault.conSnf) + coeSave[detectContent_Milk - 2].coeFreezePlus;
  156. if(milcDefault.conFreeze < coeSave[detectContent_Milk - 2].coeFreezePoint)
  157. milcDefault.conFreeze = coeSave[detectContent_Milk - 2].coeFreezePoint;
  158. milcDefault.conWater = 100.0 - (100.0 * milcDefault.conFreeze / coeSave[detectContent_Milk - 2].coeFreezePoint);
  159. milcDefault.conSC = 0;
  160. milcDefault.conPH = 0;
  161. }
  162. #ifdef __DEBUG_ALGO_MilkContent_ATY
  163. printf("\r\n\r\nFinalData:\
  164. \r\nFat - %2.5f\
  165. \r\nDensity - %2.5f\
  166. \r\nSNF - %2.5f\
  167. \r\nProteinD - %2.5f\
  168. \r\nLactose - %2.5f\
  169. \r\nSalts - %2.5f\
  170. \r\nWater - %2.5f\
  171. \r\nFreezing - %2.5f\
  172. \r\nTemperature - %2.5f\
  173. ", milcDefault.conFat, milcDefault.conDensity, milcDefault.conSnf,
  174. milcDefault.conProtein, milcDefault.conLactose, milcDefault.conSalts,
  175. milcDefault.conWater, milcDefault.conFreeze, milcDefault.conTemperature);
  176. #endif /* __DEBUG_ALGO_MilkContent_ATY */
  177. }
  178. #endif /* __ALGO_MilkContent_ATY_C */
  179. /******************************** End Of File *********************************/