// ===== KALMAN FILTER =====
#include <Arduino.h>
#include <DHT.h>
#define NTC_PIN 35
#define DHT_PIN 4
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
// Variabel Kalman Filter
float kalmanEstimate = 0;
float kalmanErrorEstimate = 1;
float kalmanErrorMeasure = 0.5;
float kalmanGain = 0;
// Variabel sensor
float ntcTemperature = 0;
float dhtTemperature = 0;
float estimatedTemperature = 0;
// Fungsi baca suhu dari NTC
float readNTCTemperature() {
const float referenceVoltage = 3.3;
const float referenceResistor = 10000;
const float beta = 3950;
const float nominalTemperature = 25;
const float nominalResistance = 10000;
int adcValue = analogRead(NTC_PIN);
float voltage = (adcValue * referenceVoltage) / 4095.0;
float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage);
float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
return tempK - 273.15;
}
// Fungsi baca suhu DHT22
float readDHTTemperature() {
float t = dht.readTemperature();
if (!isnan(t)) return t;
return dhtTemperature; // kalo gagal baca, pakai nilai lama
}
// Update Kalman filter
void updateKalmanFilter() {
float measurement = (ntcTemperature + dhtTemperature) / 2.0;
kalmanGain = kalmanErrorEstimate / (kalmanErrorEstimate + kalmanErrorMeasure);
kalmanEstimate = kalmanEstimate + kalmanGain * (measurement - kalmanEstimate);
kalmanErrorEstimate = (1 - kalmanGain) * kalmanErrorEstimate;
estimatedTemperature = kalmanEstimate;
}
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
ntcTemperature = readNTCTemperature();
dhtTemperature = readDHTTemperature();
updateKalmanFilter();
Serial.print("NTC Temp: ");
Serial.print(ntcTemperature);
Serial.print(" °C | DHT Temp: ");
Serial.print(dhtTemperature);
Serial.print(" °C | Kalman Estimasi: ");
Serial.print(estimatedTemperature);
Serial.println(" °C");
delay(500);
}