#include <EEPROM.h>
struct CalibrationData {
int minValue;
int maxValue;
float scaleFactor;
int offset;
bool isCalibrated;
};
const int POT_PIN = A0;
const int BTN_CALIBRATE = 2;
const int BTN_RESET_CAL = 3;
const int LED_PIN = 13;
CalibrationData calData;
bool lastButtonState = HIGH;
void setup() {
pinMode(BTN_CALIBRATE, INPUT_PULLUP);
pinMode(BTN_RESET_CAL, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
EEPROM.get(0, calData);
if(!calData.isCalibrated) {
resetCalibration();
}
}
void loop() {
bool buttonState = digitalRead(BTN_CALIBRATE);
if(buttonState == LOW && lastButtonState == HIGH) {
calibrateSensor();
delay(300);
}
if(digitalRead(BTN_RESET_CAL) == LOW) {
resetCalibration();
delay(300);
}
int rawValue = analogRead(POT_PIN);
int calibratedValue = applyCalibration(rawValue);
int blinkDelay = map(calibratedValue, 0, 1023, 100, 1000);
digitalWrite(LED_PIN, HIGH);
delay(blinkDelay / 2);
digitalWrite(LED_PIN, LOW);
delay(blinkDelay / 2);
lastButtonState = buttonState;
}
void calibrateSensor() {
waitForButton();
calData.minValue = analogRead(POT_PIN);
waitForButton();
calData.maxValue = analogRead(POT_PIN);
calData.scaleFactor = 1023.0 / (calData.maxValue - calData.minValue);
calData.offset = calData.minValue;
calData.isCalibrated = true;
EEPROM.put(0, calData);
}
void resetCalibration() {
calData.minValue = 0;
calData.maxValue = 1023;
calData.scaleFactor = 1.0;
calData.offset = 0;
calData.isCalibrated = false;
EEPROM.put(0, calData);
}
int applyCalibration(int rawValue) {
if(!calData.isCalibrated) return rawValue;
int calibrated = (rawValue - calData.offset) * calData.scaleFactor;
return constrain(calibrated, 0, 1023);
}
void waitForButton() {
while(digitalRead(BTN_CALIBRATE) == HIGH && digitalRead(BTN_RESET_CAL) == HIGH) {
delay(50);
}
delay(300); // Защита от дребезга
}