Skip to main content
Learn how to interface with analog sensors, apply calibration, and filter noisy signals using the Kinematrix sensor framework.

Basic Analog Sensor

The AnalogSensV2 class simplifies reading analog sensors and converting to voltage values.
1

Enable Required Modules

#define ENABLE_SENSOR_MODULE_V2
#define ENABLE_SENSOR_ANALOG_V2
#define ENABLE_SENSOR_UTILITY_V2
#include "Kinematrix.h"
2

Create Analog Sensor

Initialize with pin, reference voltage, and ADC resolution:
// AnalogSensV2(pin, referenceVoltage, adcMaxValue)
AnalogSensV2 analogSensor(A0, 5.0, 1023);
3

Initialize and Read

void setup() {
    Serial.begin(115200);
    
    JsonDocument doc;
    analogSensor.setDocumentValue(&doc);
    analogSensor.setDocument("analog");
    
    analogSensor.init();
    Serial.println("Analog sensor initialized");
}

void loop() {
    if (analogSensor.update()) {
        Serial.print("Raw Value: ");
        Serial.print((int)analogSensor.getIntValue("raw"));
        Serial.print(", Voltage: ");
        Serial.print((float)analogSensor.getFloatValue("volt"));
        Serial.println("V");
    }
    
    delay(500);
}
Source: /home/daytona/workspace/source/example/sensors/SensorModuleV2/SensorList/AnalogSensV2/BasicAnalogSensor/BasicAnalogSensor.ino:1

Custom Analog Sensor with Callback

Convert raw analog values to meaningful measurements using a custom callback function:
#define ENABLE_SENSOR_MODULE_V2
#define ENABLE_SENSOR_ANALOG_V2
#define ENABLE_SENSOR_UTILITY_V2
#include "Kinematrix.h"

// Custom callback to convert voltage to pressure and temperature
AnalogSensV2 customSensor(A0, 5.0, 1023, [](BaseSensV2* sensor, int rawValue, float voltageValue) {
    float pressure = voltageValue * 25.0;        // Convert to kPa
    float temperature = (rawValue - 100) * 0.1;  // Convert to °C
    
    sensor->updateValue("pressure", pressure);
    sensor->updateValue("temperature", temperature);
});

void setup() {
    Serial.begin(115200);
    
    // Register custom values
    customSensor.addCustomValue("pressure", "Pressure", "kPa", 2, true);
    customSensor.addCustomValue("temperature", "Temperature", "°C", 1, true);
    
    JsonDocument doc;
    customSensor.setDocumentValue(&doc);
    customSensor.setDocument("custom");
    
    customSensor.init();
    Serial.println("Custom analog sensor initialized");
}

void loop() {
    if (customSensor.update()) {
        Serial.print("Raw: ");
        Serial.print((int)customSensor.getIntValue("raw"));
        Serial.print(", Voltage: ");
        Serial.print((float)customSensor.getFloatValue("volt"));
        Serial.print("V, Pressure: ");
        Serial.print((float)customSensor.getFloatValue("pressure"));
        Serial.print("kPa, Temp: ");
        Serial.print((float)customSensor.getFloatValue("temperature"));
        Serial.println("°C");
    }
    
    delay(1000);
}
Source: /home/daytona/workspace/source/example/sensors/SensorModuleV2/SensorList/AnalogSensV2/CustomAnalogSensor/CustomAnalogSensor.ino:1

Multiple Analog Sensors with Filters

Manage multiple analog sensors with filtering and alert systems:
#define ENABLE_SENSOR_MODULE_V2
#define ENABLE_SENSOR_ANALOG_V2
#define ENABLE_SENSOR_FILTER_V2
#define ENABLE_SENSOR_ALERT_SYSTEM_V2
#define ENABLE_SENSOR_UTILITY_V2
#include "Kinematrix.h"

SensorModuleV2 sensorModule;

void setup() {
    Serial.begin(115200);
    
    // Add multiple analog sensors with different configurations
    sensorModule.addSensor("analog1", new AnalogSensV2(A0, 5.0, 1023));
    sensorModule.addSensor("analog2", new AnalogSensV2(A1, 3.3, 1023));
    sensorModule.addSensor("analog3", new AnalogSensV2(A2, 5.0, 4095));  // ESP32 12-bit ADC
    sensorModule.addSensor("analog4", new AnalogSensV2(A3, 3.3, 4095));
    
    sensorModule.init();
    
    // Attach moving average filters
    FilterParams movingAvgParams;
    movingAvgParams.movingAverage.windowSize = 5;
    sensorModule.attachFilter("analog1", "volt", FILTER_MOVING_AVERAGE, movingAvgParams);
    sensorModule.attachFilter("analog2", "volt", FILTER_MOVING_AVERAGE, movingAvgParams);
    
    // Set voltage thresholds with alerts
    sensorModule.setThreshold("analog1", "volt", 1.0, 4.0, ALERT_OUTSIDE);
    sensorModule.setThreshold("analog2", "volt", 0.5, 2.8, ALERT_OUTSIDE);
    
    Serial.println("Multiple analog sensors initialized with filters and alerts");
}

void loop() {
    sensorModule.update();
    
    if (sensorModule.isUpdated("analog1")) {
        float filteredVolt = sensorModule.getFilteredValue("analog1", "volt");
        bool alertActive = sensorModule.isAlertActive("analog1", "volt");
        Serial.print("A1 - Raw: ");
        Serial.print((float)sensorModule["analog1"]["raw"]);
        Serial.print(", Filtered: ");
        Serial.print(filteredVolt);
        Serial.print("V, Alert: ");
        Serial.println(alertActive ? "YES" : "NO");
    }
    
    if (sensorModule.isUpdated("analog2")) {
        float filteredVolt = sensorModule.getFilteredValue("analog2", "volt");
        Serial.print("A2 - Filtered: ");
        Serial.print(filteredVolt);
        Serial.println("V");
    }
    
    if (sensorModule.isUpdated("analog3")) {
        Serial.print("A3 - Voltage: ");
        Serial.print((float)sensorModule["analog3"]["volt"]);
        Serial.println("V");
    }
    
    delay(800);
}
Source: /home/daytona/workspace/source/example/sensors/SensorModuleV2/SensorList/AnalogSensV2/MultipleAnalogSensors/MultipleAnalogSensors.ino:1

Sensor Calibration

Calibrate analog sensors for accurate real-world measurements:
#define ENABLE_SENSOR_MODULE_V2
#define ENABLE_SENSOR_CALIBRATION_MODULE_V2
#define ENABLE_SENSOR_ANALOG_V2
#include "Kinematrix.h"

SensorCalibrationModuleV2 calibrationModule;

void setup() {
    Serial.begin(115200);
    
    // Add analog sensors for pressure, temperature, and flow
    calibrationModule.addSensor("pressure", new AnalogSensV2(A0, 5.0, 1023));
    calibrationModule.addSensor("temperature", new AnalogSensV2(A1, 3.3, 1023));
    calibrationModule.addSensor("flow", new AnalogSensV2(A2, 5.0, 1023));
    
    calibrationModule.init();
    
    // Add calibration entries
    calibrationModule.addCalibrationEntry("pressure", "volt");
    calibrationModule.addCalibrationEntry("temperature", "volt");
    calibrationModule.addCalibrationEntry("flow", "volt");
    
    // Two-point calibration: reference low/high vs measured low/high
    calibrationModule.calibrateTwoPoint("pressure", "volt", 1.0, 0.95, 4.0, 4.08);
    
    // One-point calibration
    calibrationModule.calibrateOnePoint("temperature", "volt", 2.5);
    calibrationModule.calibrateOnePoint("flow", "volt", 3.0);
    
    Serial.println("Analog sensors with calibration ready");
}

void loop() {
    calibrationModule.update();
    
    if (calibrationModule.isUpdated("pressure")) {
        float rawVolt = calibrationModule["pressure"]["volt"];
        float calPressure = calibrationModule.getCalibratedValue("pressure", "volt");
        Serial.print("Pressure - Raw: ");
        Serial.print(rawVolt);
        Serial.print("V, Calibrated: ");
        Serial.print(calPressure);
        Serial.println(" bar");
    }
    
    if (calibrationModule.isUpdated("temperature")) {
        float rawVolt = calibrationModule["temperature"]["volt"];
        float calTemp = calibrationModule.getCalibratedValue("temperature", "volt");
        Serial.print("Temperature - Raw: ");
        Serial.print(rawVolt);
        Serial.print("V, Calibrated: ");
        Serial.print(calTemp);
        Serial.println("°C");
    }
    
    delay(1500);
}
Source: /home/daytona/workspace/source/example/sensors/SensorModuleV2/SensorList/AnalogSensV2/AnalogWithCalibration/AnalogWithCalibration.ino:1

Wiring Diagram

Basic Analog Sensor

Sensor Output    Arduino/ESP32
-------------    -------------
Signal       ->  Analog Pin (A0-A7)
VCC          ->  3.3V or 5V
GND          ->  GND

Voltage Divider (for 5V sensors on 3.3V boards)

Sensor 5V Output
      |
     R1 (10kΩ)
      |
      +-------> To ADC Pin (max 3.3V)
      |
     R2 (20kΩ)
      |
     GND

Filter Types

Moving Average Filter

  • Smooths noisy signals
  • Window size determines smoothing strength
  • Best for slowly changing values
FilterParams movingAvgParams;
movingAvgParams.movingAverage.windowSize = 5;
sensorModule.attachFilter("sensor", "volt", FILTER_MOVING_AVERAGE, movingAvgParams);

Kalman Filter

  • Advanced filtering for dynamic systems
  • Process noise: system uncertainty
  • Measurement noise: sensor noise
FilterParams kalmanParams;
kalmanParams.kalman.processNoise = 0.01;
kalmanParams.kalman.measurementNoise = 0.1;
sensorModule.attachFilter("sensor", "volt", FILTER_KALMAN, kalmanParams);

Available Values

AnalogSensV2

  • raw - Raw ADC value (0-1023 or 0-4095) (int)
  • volt - Voltage value in volts (float)

Custom Values

Add custom values using addCustomValue() and update in the callback function.

Next Steps

Digital Sensors

Learn about I2C and digital sensor interfaces

Multi-Sensor Systems

Combine analog and digital sensors

Build docs developers (and LLMs) love