//Rizki
const int LM35Pin = 34; // Pin analog ESP32 yang terhubung ke sensor LM35
const int numReadings = 10; // Jumlah pembacaan yang akan digunakan untuk moving average
int readings[numReadings]; // Array untuk menyimpan pembacaan
int readingIndex = 0; // Indeks saat ini dalam array readings
int total = 0; // Total pembacaan untuk perhitungan moving average
float averageTemperature = 0.0; // Hasil rata-rata temperatur
float KalmanFilterData;
float Xt, Xt_update, Xt_prev;
float Pt, Pt_update, Pt_prev;
float Kt, R, Q;
void setup() {
Serial.begin(9600);
pinMode(LM35Pin, INPUT);
analogReadResolution(12); // Resolusi ADC 12-bit
R=0;
Q=0.05;
Pt_prev=1;
for (int i = 0; i < numReadings; i++) {
readings[i] = 0;
}
}
void loop() {
// get the ADC value from the temperature sensor
int sensorValue = analogRead(LM35Pin);
// Ubah nilai bacaan menjadi suhu dalam derajat Celsius
float temperatureC = (sensorValue / 4095.0) * 330.0;
// print the temperature TANPA FILTER in the Serial Monitor:
Serial.print("Temperature: ");
Serial.print(temperatureC); // print the temperature in Celsius
Serial.print("°C");
Serial.print(" ~ ");
// setting parameter filter
Xt_update = Xt_prev;
Pt_update = Pt_prev + Q;
Kt = Pt_update/(Pt_update + R);
Xt = Xt_update + (Kt * (temperatureC - Xt_update));
Pt = (1-Kt)*Pt_update;
// rumus
Xt_prev = Xt;
Pt_prev = Pt;
KalmanFilterData = Xt;
// print the temperature KALMAN FILTER in the Serial Monitor:
Serial.print("Kalman Filter = ");
Serial.print(KalmanFilterData,2);
Serial.print(" ~ ");
// Tambahkan pembacaan ke total
total = total - readings[readingIndex] + sensorValue;
readings[readingIndex] = sensorValue;
// Hitung rata-rata suhu
averageTemperature = (total / numReadings) / 4095.0 * 330.0;
// print the temperature MOVING AVERAGE in the Serial Monitor:
Serial.print("Average Temperature: ");
Serial.println(averageTemperature);
// Geser indeks
readingIndex = (readingIndex + 1) % numReadings;
delay(1000);
}