Русифицированная версия программы для измерения температуры и отн. влажности и вывода информации на сенсорный TFT
Dependencies: FT800_2 HYT mbed
statistics.cpp
00001 #include "statistics.h" 00002 00003 /************************************************************************************************************************** 00004 ************************** Main function called every second ************************************************************** 00005 **************************************************************************************************************************/ 00006 uint64_t Statistics::UpdateStatistics(float humidity, float temperature, uint64_t seconds, uint64_t changeSecondsOffset) 00007 { 00008 short int secondsIn5min = (seconds % 300); // 0..299 00009 if (secondsIn5min == 0) { 00010 changeSecondsOffset = Update24hrsData(changeSecondsOffset); 00011 } 00012 CalculateHumididty(humidity, secondsIn5min); 00013 CalculateTemperature(temperature, secondsIn5min); 00014 00015 // changeSecondsOffset is nessesary for changing time-grid if more then 24 hours left since devise was turned on 00016 return changeSecondsOffset; 00017 } 00018 00019 /************************************************************************************************************************** 00020 ************************** Update average, minimum and maximum humidity in current five-minute interval **************** 00021 **************************************************************************************************************************/ 00022 void Statistics::CalculateHumididty(float humidity, short int secondsIn5min) 00023 { 00024 humidity5min[secondsIn5min] = humidity; 00025 humidity5minSum += humidity5min[secondsIn5min]; 00026 humidity5minAverage = humidity5minSum / (secondsIn5min + 1); 00027 00028 if (humidity5min[secondsIn5min] > humidity5minMax || humidity5minMax == INIT_STATISTICS_NUMBER) { 00029 humidity5minMax = humidity5min[secondsIn5min]; 00030 } 00031 if (humidity5min[secondsIn5min] < humidity5minMin || humidity5minMin == INIT_STATISTICS_NUMBER) { 00032 humidity5minMin = humidity5min[secondsIn5min]; 00033 } 00034 } 00035 00036 /************************************************************************************************************************** 00037 ************************** Update average, minimum and maximum temperature in current five-minute interval **************** 00038 **************************************************************************************************************************/ 00039 void Statistics::CalculateTemperature(float temperature, short int secondsIn5min) 00040 { 00041 // we use TEMPERATURE_MULTIPLIER = 10 for store temperatures tenths in integer values 00042 temperature5min[secondsIn5min] = temperature * TEMPERATURE_MULTIPLIER; 00043 temperature5minSum += temperature5min[secondsIn5min]; 00044 temperature5minAverage = temperature5minSum / (secondsIn5min + 1); 00045 00046 if (temperature5min[secondsIn5min] > temperature5minMax || temperature5minMax == INIT_STATISTICS_NUMBER) { 00047 temperature5minMax = temperature5min[secondsIn5min]; 00048 } 00049 if (temperature5min[secondsIn5min] < temperature5minMin || temperature5minMin == INIT_STATISTICS_NUMBER) { 00050 temperature5minMin = temperature5min[secondsIn5min]; 00051 } 00052 } 00053 00054 /************************************************************************************************************************** 00055 ************************** Update humidity24hrs[][] and temperature24hrs[][] after each five-minute interval ************** 00056 **************************************************************************************************************************/ 00057 uint64_t Statistics::Update24hrsData(uint64_t changeSecondsOffset) 00058 { 00059 // after each five-minute interval we moving to next value if it's availiable 00060 // OR shifting the entire array and update just last value if 24 hrs are already gone 00061 if (Counter24hrs < 287) { 00062 Counter24hrs ++; 00063 } else { 00064 for (int i = 0; i < 288; i++) { 00065 humidity24hrs[0][i] = humidity24hrs[0][i + 1]; 00066 humidity24hrs[1][i] = humidity24hrs[1][i + 1]; 00067 humidity24hrs[2][i] = humidity24hrs[2][i + 1]; 00068 temperature24hrs[0][i] = temperature24hrs[0][i + 1]; 00069 temperature24hrs[1][i] = temperature24hrs[1][i + 1]; 00070 temperature24hrs[2][i] = temperature24hrs[2][i + 1]; 00071 } 00072 Counter24hrs = 287; 00073 changeSecondsOffset += 300; 00074 } 00075 00076 // update the current value 00077 humidity24hrs[0][Counter24hrs] = humidity5minAverage; 00078 humidity24hrs[1][Counter24hrs] = humidity5minMin; 00079 humidity24hrs[2][Counter24hrs] = humidity5minMax; 00080 temperature24hrs[0][Counter24hrs] = temperature5minAverage; 00081 temperature24hrs[1][Counter24hrs] = temperature5minMin; 00082 temperature24hrs[2][Counter24hrs] = temperature5minMax; 00083 00084 // initialize all values using for calculations "inside" five-minute interval 00085 for (int i = 0; i < 300; i++) { 00086 humidity5min[i] = INIT_STATISTICS_NUMBER; 00087 temperature5min[i] = INIT_STATISTICS_NUMBER; 00088 } 00089 humidity5minSum = 0; 00090 humidity5minMax = INIT_STATISTICS_NUMBER; 00091 humidity5minMin = INIT_STATISTICS_NUMBER; 00092 temperature5minSum = 0; 00093 temperature5minMax = INIT_STATISTICS_NUMBER; 00094 temperature5minMin = INIT_STATISTICS_NUMBER; 00095 00096 // changeSecondsOffset is nessesary for changing time-grid if more then 24 hours left since devise was turned on 00097 return changeSecondsOffset; 00098 } 00099 00100 /************************************************************************************************************************** 00101 ************************** Initialization for all statistics values and arrays ******************************************** 00102 **************************************************************************************************************************/ 00103 void Statistics::InitValues(float humidity, float temperature) 00104 { 00105 for (int i = 0; i < 300; i++) { 00106 humidity5min[i] = INIT_STATISTICS_NUMBER; 00107 temperature5min[i] = INIT_STATISTICS_NUMBER; 00108 } 00109 for (int i = 0; i < 288; i++) { 00110 humidity24hrs[0][i] = INIT_STATISTICS_NUMBER; 00111 humidity24hrs[1][i] = INIT_STATISTICS_NUMBER; 00112 humidity24hrs[2][i] = INIT_STATISTICS_NUMBER; 00113 temperature24hrs[0][i] = INIT_STATISTICS_NUMBER; 00114 temperature24hrs[1][i] = INIT_STATISTICS_NUMBER; 00115 temperature24hrs[2][i] = INIT_STATISTICS_NUMBER; 00116 } 00117 humidity5min[0] = humidity; 00118 humidity5minMin = humidity; 00119 humidity5minMax = humidity; 00120 humidity24hrs[0][0] = humidity; 00121 humidity24hrs[1][0] = humidity; 00122 humidity24hrs[2][0] = humidity; 00123 00124 temperature5min[0] = temperature * TEMPERATURE_MULTIPLIER; 00125 temperature5minMin = temperature * TEMPERATURE_MULTIPLIER; 00126 temperature5minMax = temperature * TEMPERATURE_MULTIPLIER; 00127 temperature24hrs[0][0] = temperature * TEMPERATURE_MULTIPLIER; 00128 temperature24hrs[1][0] = temperature * TEMPERATURE_MULTIPLIER; 00129 temperature24hrs[2][0] = temperature * TEMPERATURE_MULTIPLIER; 00130 00131 Counter24hrs = 0; 00132 }
Generated on Wed Jul 13 2022 04:41:34 by 1.7.2