const int bufferSize = 10; // Velikost bufferu pro uchovávání historie hodnot
float buffer[bufferSize]; // Buffer pro ukládání hodnot
int currentIndex = 0; // Index aktuální pozice v bufferu
// Konstanty pro detekci odlehlých hodnot
const float outlierThreshold = 3.0; // Práh pro detekci odlehlých hodnot (úprava podle potřeby)
int outlierCount = 0; // Počet odlehlých hodnot v bufferu
// Funkce pro inicializaci bufferu
void initializeBuffer() {
for (int i = 0; i < bufferSize; i++) {
buffer[i] = 0.0;
}
}
// Funkce pro přidání nové hodnoty do bufferu a aktualizaci klouzavého průměru
float calculateMovingAverage(float newValue) {
// Přidání nové hodnoty do bufferu
buffer[currentIndex] = newValue;
// Aktualizace indexu pro kruhový buffer
currentIndex = (currentIndex + 1) % bufferSize;
// Výpočet klouzavého průměru
float sum = 0.0;
for (int i = 0; i < bufferSize; i++) {
sum += buffer[i];
}
// Detekce a odstranění odlehlých hodnot
float average = sum / bufferSize;
if (abs(newValue - average) > outlierThreshold) {
// Hodnota je odlehlá, nenastavujeme ji do průměru
outlierCount++;
return average; // Můžete vrátit průměr bez odlehlé hodnoty nebo jinou indikaci
}
// Hodnota není odlehlá, vrátíme nový průměr
outlierCount = 0; // Resetujeme počet odlehlých hodnot
return average;
}
void setup() {
// Inicializace bufferu
initializeBuffer();
// Příklad použití
float newValue = 5.0; // Nahraďte touto hodnotou aktuální čtenou hodnotu
float movingAverage = calculateMovingAverage(newValue);
// Použití hodnoty klouzavého průměru (v tuto chvíli se může použít nebo zobrazit)
Serial.begin(9600);
Serial.print("Moving Average: ");
Serial.println(movingAverage);
// Detekce odlehlých hodnot
if (outlierCount > 0) {
Serial.print("Detected outliers: ");
Serial.println(outlierCount);
}
}
void loop() {
// Hlavní smyčka, můžete přidávat další části kódu zde
}