Terkadang apa yang terlihat sederhana tidak sesederhana itu. Anda memiliki pengukuran yang cukup rumit untuk dilakukan, tetapi Anda menginginkan hasil yang sederhana. Apa yang ingin Anda ukur tidak konstan, ini bervariasi dalam waktu. Bergantung pada tingkat kebutuhan Anda, Anda dapat menghitung satu atau banyak properti dari konsumsi saat ini. Properti ini akan membantu Anda memantau sistem dengan lebih baik. Saya mengusulkan Anda 3 solusi berbeda, dalam kompleksitas yang menanjak.
Solusi 1: Rata-rata
Anda ingin mendapatkan hasil satu nilai -> dapatkan rata-rata dalam waktu. Seperti yang sudah diusulkan oleh @akellyirl, gunakan filter low-pass. Hitung float y = alpha*input + (1-alpha)*y
untuk setiap sampel, di mana alpha
faktor penghalusannya. Lihat Wikipedia untuk detailnya.
Solusi 2: Max + Rata-Rata
Anda menarik dalam mendapatkan rata-rata, dan nilai maksimal. Pemantauan nilai maks bisa menarik untuk dimensi komponen misalnya.
if (y > max)
max = y;
Solusi 3: Deviasi standar + Max + Rata-rata
Mengapa?
Lihat grafik di bawah ini. Ada 3 sinyal dengan bentuk berbeda. Sebuah segitiga , sebuah sinus , dan lonjakan sinyal. Mereka semua periodik dengan periode yang sama , amplitudo yang sama , rata-rata yang sama , dan min dan maks yang sama . Tapi, mereka memiliki bentuk yang berbeda, dan memang mereka memiliki cerita yang sama sekali berbeda ...
Salah satu perbedaannya adalah standar deviasi. Itu sebabnya saya menyarankan Anda untuk memperluas pengukuran Anda, dan termasuk deviasi standar. Masalahnya adalah bahwa cara standar untuk menghitungnya adalah mengkonsumsi CPU. Semoga ada satu solusi.
Bagaimana?
Gunakan metode histogram . Buat histogram dari semua pengukuran, dan ekstrak secara efisien statistik (min, maks, rata-rata, deviasi standar) dari dataset. Histogram mengelompokkan nilai-nilai yang memiliki nilai yang sama, atau rentang nilai yang sama. Keuntungannya adalah untuk menghindari penyimpanan semua sampel (menambah waktu dalam hitungan), dan memiliki perhitungan cepat pada sejumlah data yang terbatas.
Sebelum mulai mendapatkan pengukuran, buat array untuk menyimpan histogram. Ini adalah array integer 1 dimensi, dengan ukuran 32 misalnya:
int histo[32];
Tergantung pada kisaran ammeter, adaptasikan fungsi di bawah ini. Misalnya, jika kisaran 256mA itu berarti bahwa bin 0 dari histogram akan bertambah dengan nilai antara 0 dan 8 mA, bin 1 dengan nilai antara 8 dan 16 mA dll ... Jadi, Anda akan memerlukan integer untuk mewakili nomor bin histogram:
short int index;
Setiap kali Anda mendapatkan sampel, cari indeks tempat sampah yang sesuai:
index = (short int) floor(yi);
Dan menambahkan nampan ini:
histo[index] += 1;
Untuk menghitung rata-rata, jalankan loop ini:
float mean = 0;
int N = 0;
for (i=0; i < 32 ; i++) {
mean = i * histo[i]; // sum along the histogram
N += i; // count of samples
}
mean /= N; // divide the sum by the count of samples.
mean *= 8; // multiply by the bin width, in mA: Range of 256 mA / 32 bins = 8 mA per bin.
Untuk menghitung standar deviasi, jalankan loop ini:
float std_dev = 0;
for (i=0; i < 32 ; i++) {
std_dev = (i - mean) * (i - mean) * histo[i]; // sum along the histogram
}
std_dev /= N; // divide the sum by the count of samples.
std_dev = sqrt(std_dev); // get the root mean square to finally convert the variance to standard deviation.
Strategi metode histogram adalah untuk membuat operasi lambat pada beberapa jumlah sampah, bukan semua sampel sinyal yang diperoleh. Semakin lama ukuran sampel, semakin baik. Jika Anda ingin lebih detail, baca halaman menarik ini The Histogram, Pmf dan Pdf .