#include <SimpleKalmanFilter.h>
// SimpleKalmanFilter(e_mea, e_est, q);
// e_mea: Measurement Uncertainty
// e_est: Estimation Uncertainty
// q: Process Noise
// */
SimpleKalmanFilter simpleKalmanFilter(50, 50, 0.01);
#include <Adafruit_AS5600.h>
#include <Wire.h>
#include <Servo.h>
Adafruit_AS5600 as5600;
#define REPORT_INTERVAL 200 // report every 200 ms while held
// Make Window Size smaller/bigger if data scatter is less/more
// (For MAX6675 the optimal WindowSize is ~0.6 | suggested to use a simple moving average before DWFilter for better results)
#define WindowSize 20
Servo myServo;
unsigned long lastReportTime = 0;
int lastButtonState = HIGH;
void setup() {
// Wire.begin();
Serial.begin(115200);
Serial.println("DEBUG MODE ON");
myServo.attach(9); // Servo signal on pin 9
as5600.begin();
as5600.setHysteresis(AS5600_HYSTERESIS_2LSB);
// as5600.setOutputStage(AS5600_OUTPUT_STAGE_DIGITAL_PWM);
as5600.setOutputStage(AS5600_OUTPUT_STAGE_ANALOG_FULL);
as5600.setPWMFreq(AS5600_PWM_FREQ_920HZ);
as5600.setSlowFilter(AS5600_SLOW_FILTER_16X);
as5600.setFastFilterThresh(AS5600_FAST_FILTER_THRESH_SLOW_ONLY);
}
void loop() {
// uint16_t rawAngle = analogRead(A_sensor);
uint16_t rawAngle = as5600.getRawAngle();
float filtered=simpleKalmanFilter.updateEstimate(rawAngle);
float angleDegrees = constrain((filtered * 360.0) / 4096.0, 0, 180);
myServo.write((int)angleDegrees);
// --- Report if Button Held ---
// if (buttonHeld && millis() - lastReportTime >= REPORT_INTERVAL) {
// Serial.print("Angle: ");
if (millis() - lastReportTime > 10)
{ //Serial.print(angleDegrees, 0);
// Showing results in the Plotter
// Serial.print("Data:");
// Serial.print(rawAngle);
// Serial.print("\t");
Serial.print("FilteredData:");
Serial.println(angleDegrees); // filter() function receives your data, returning the filtered value
}
// }
delay(10); // Small delay for loop stability
}