Русифицированная версия программы для измерения температуры и отн. влажности и вывода информации на сенсорный TFT

Dependencies:   FT800_2 HYT mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers statistics.cpp Source File

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 }