// Configuration
#define POT_PIN A0
#define OUT_PIN 9
#define NUM_READINGS 100
#define CALIBRATION_TIME 5000 // 5 seconds for simulation
// Global state
struct {
int min = 1023;
int max = 0;
bool done = false;
unsigned long startTime;
} calibration;
int readings[NUM_READINGS];
int readIndex = 0;
long total = 0;
float sensitivity = 0.8; // More noticeable for simulation
void setup() {
Serial.begin(115200); // Faster for simulator
pinMode(OUT_PIN, OUTPUT);
calibration.startTime = millis();
int initial = getSmoothedReading();
for(int i=0; i<NUM_READINGS; i++) {
readings[i] = initial;
}
total = initial * NUM_READINGS;
}
void loop() {
if (!calibration.done) {
handleCalibration();
} else {
handleNormalOperation();
}
}
void handleCalibration() {
int raw = analogRead(POT_PIN);
calibration.min = min(calibration.min, raw);
calibration.max = max(calibration.max, raw);
Serial.print("CALIBRATING ");
Serial.print(raw);
Serial.print(" ");
Serial.print(calibration.min);
Serial.print(" ");
Serial.println(calibration.max);
if (millis() - calibration.startTime > CALIBRATION_TIME) {
calibration.done = true;
Serial.println("CALIBRATION_COMPLETE");
}
delay(50);
}
void handleNormalOperation() {
int raw = analogRead(POT_PIN);
updateRunningAverage(raw);
int avg = total / NUM_READINGS;
int pwm = map(constrain(avg, calibration.min, calibration.max),
calibration.min, calibration.max, 0, 255);
analogWrite(OUT_PIN, pwm);
// Simulator-friendly output
Serial.print("INPUT:");
Serial.print(raw);
Serial.print(",AVG:");
Serial.print(avg);
Serial.print(",PWM:");
Serial.println(pwm);
delay(20);
}
void updateRunningAverage(int newReading) {
total -= readings[readIndex];
total += newReading;
readings[readIndex] = newReading;
readIndex = (readIndex + 1) % NUM_READINGS;
}
int getSmoothedReading() {
// Initial smoothing for simulation stability
int sum = 0;
for(int i=0; i<10; i++) {
sum += analogRead(POT_PIN);
delay(1);
}
return sum/10;
}