-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPressureMonitor.h
More file actions
115 lines (97 loc) · 3.29 KB
/
Copy pathPressureMonitor.h
File metadata and controls
115 lines (97 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
* PressureMonitor.h
*
* Monitors atmospheric pressure and detects significant changes
* that may indicate severe weather conditions.
*/
#ifndef PRESSURE_MONITOR_H
#define PRESSURE_MONITOR_H
class PressureMonitor {
private:
float baselinePressure; // Established baseline pressure
float currentPressure; // Current smoothed pressure
float pressureThreshold; // Threshold for alerts (hPa)
bool baselineEstablished; // Whether baseline has been set
bool severeWeatherDetected; // Alert flag
float pressureChange; // Change from baseline
int readingsCount; // Number of readings processed
int minReadingsForBaseline; // Minimum readings before baseline is set
public:
// Constructor
PressureMonitor(float threshold) {
pressureThreshold = threshold;
baselinePressure = 0.0;
currentPressure = 0.0;
baselineEstablished = false;
severeWeatherDetected = false;
pressureChange = 0.0;
readingsCount = 0;
minReadingsForBaseline = 20; // Wait for full moving average
}
// Update with new pressure reading
void updatePressure(float pressure) {
currentPressure = pressure;
readingsCount++;
// Establish baseline after collecting enough readings
if (!baselineEstablished && readingsCount >= minReadingsForBaseline) {
baselinePressure = pressure;
baselineEstablished = true;
}
// Check for significant pressure changes
if (baselineEstablished) {
pressureChange = currentPressure - baselinePressure;
// Detect severe weather based on threshold
if (abs(pressureChange) >= pressureThreshold) {
severeWeatherDetected = true;
} else {
severeWeatherDetected = false;
}
// Update baseline gradually to adapt to seasonal changes
// Use exponential moving average with alpha = 0.01 (1% weight to new value)
baselinePressure = baselinePressure * 0.99 + currentPressure * 0.01;
}
}
// Check if severe weather is detected
bool isSevereWeatherDetected() {
return severeWeatherDetected;
}
// Get the established baseline pressure
float getBaselinePressure() {
return baselinePressure;
}
// Get current pressure
float getCurrentPressure() {
return currentPressure;
}
// Get pressure change from baseline
float getPressureChange() {
return pressureChange;
}
// Check if baseline has been established
bool isBaselineEstablished() {
return baselineEstablished;
}
// Reset the monitor
void reset() {
baselinePressure = 0.0;
currentPressure = 0.0;
baselineEstablished = false;
severeWeatherDetected = false;
pressureChange = 0.0;
readingsCount = 0;
}
// Manually set baseline (useful for testing or calibration)
void setBaseline(float pressure) {
baselinePressure = pressure;
baselineEstablished = true;
}
// Set the alert threshold
void setThreshold(float threshold) {
pressureThreshold = threshold;
}
// Get the alert threshold
float getThreshold() {
return pressureThreshold;
}
};
#endif // PRESSURE_MONITOR_H