Skip to main content

Overview

Sensor Module V1 is the legacy sensor framework providing support for 40+ sensor types with JSON-based data storage, calibration, and filtering capabilities. While V2 offers enhanced features, V1 remains fully supported and provides a simpler API for many common sensor applications.

Architecture

class BaseSens {
public:
    virtual bool init() = 0;
    virtual bool update() = 0;
    virtual void getValue(float *output);
    virtual JsonVariant getVariant(const char *searchName);
    virtual void setDocument(const char *objName);
    virtual void setDocumentValue(JsonDocument *docBase);
};

class SensorModule {
    void addModule(const char *name, BaseSens *sensor);
    void init();
    void update();
    JsonVariant operator[](const char *searchName);
    BaseSens *getModuleByNamePtr(const char *searchName);
};

Supported Sensors (40+)

Environmental Sensors

DHTSens - DHT11/DHT22/DHT21 Temperature & Humidity
#define ENABLE_SENSOR_DHT_V1
DHTSens dht(2, DHT22);  // Pin 2, DHT22 type
dht.init();
float temp = sensors["dht"]["temperature"];
float humidity = sensors["dht"]["humidity"];
AHTSens - AHT10/AHT20 High-Precision Sensor
#define ENABLE_SENSOR_AHT_V1
AHTSens aht;
aht.init();
float temp = sensors["aht"]["temperature"];
float humidity = sensors["aht"]["humidity"];
BME280Sens - Temperature, Humidity, Pressure
#define ENABLE_SENSOR_BME280_V1
BME280Sens bme280;
bme280.init();
float temp = bme280.getValueTemperature();
float pressure = bme280.getValuePressure();
float altitude = bme280.getValueAltitude();
float humidity = bme280.getValueHumidity();
MQSens - MQ Series Gas Sensors (MQ-2/3/4/5/6/7/8/9/135)
#define ENABLE_SENSOR_MQ_V1
MQSens mq2(A0, 5.0);  // Analog pin, voltage
mq2.setRL(5.0);       // Load resistance in kOhms
mq2.setR0(9.83);      // Sensor resistance in clean air
mq2.init();
float ppm = sensors["mq2"]["ppm"];
float ratio = sensors["mq2"]["ratio"];
SCD30Sens - CO2, Temperature, Humidity
#define ENABLE_SENSOR_SCD30_V1
SCD30Sens scd30;
scd30.init();
float co2 = sensors["scd30"]["co2"];
float temp = sensors["scd30"]["temperature"];
float humidity = sensors["scd30"]["humidity"];
DustSens - GP2Y1010AU0F Dust/Particle Sensor
#define ENABLE_SENSOR_DUST_V1
DustSens dust(A0, 7);  // Analog pin, LED pin
dust.init();
float density = sensors["dust"]["density"];
DS18B20Sens - Dallas OneWire Temperature
#define ENABLE_SENSOR_DS18B20_V1
DS18B20Sens ds18b20(4);  // OneWire pin
ds18b20.init();
float temp = sensors["ds18b20"]["temperature"];
MLX90614Sens - Infrared Temperature (Non-Contact)
#define ENABLE_SENSOR_MLX90614_V1
MLX90614Sens mlx;
mlx.init();
float ambient = sensors["mlx"]["ambient"];
float object = sensors["mlx"]["object"];
MAX6675Sens - K-Type Thermocouple
#define ENABLE_SENSOR_MAX6675_V1
MAX6675Sens thermo(5, 6, 7);  // SCK, CS, SO pins
thermo.init();
float temp = sensors["thermo"]["temperature"];
MAX31865Sens - RTD Temperature (PT100/PT1000)
#define ENABLE_SENSOR_MAX31865_V1
MAX31865Sens rtd(10);  // CS pin
rtd.init();
float temp = sensors["rtd"]["temperature"];

Industrial & Measurement Sensors

FlowMeterSens - Water Flow Sensor (Basic)
#define ENABLE_SENSOR_FLOWMETER_V1
FlowMeterSens flow(2);  // Interrupt pin
flow.init();
float flowRate = sensors["flow"]["rate"];
float totalVolume = sensors["flow"]["total"];
FlowMeterV2Sens - Enhanced Flow Sensor
#define ENABLE_SENSOR_FLOWMETERV2_V1
FlowMeterV2Sens flow(2, 7.5);  // Pin, calibration factor
flow.init();
float flowRate = sensors["flow"]["rate"];
FlowMeterV3Sens - Advanced Flow with Multiple Outputs
#define ENABLE_SENSOR_FLOWMETERV3_V1
FlowMeterV3Sens flow(2);
flow.setCalibrationFactor(7.5);
flow.init();
float rate_lpm = sensors["flow"]["lpm"];      // Liters per minute
float rate_mlps = sensors["flow"]["mlps"];    // mL per second
float total_ml = sensors["flow"]["total_ml"];
PHSens - pH Sensor
#define ENABLE_SENSOR_PH_V1
PHSens ph(A0);  // Analog pin
ph.init();
float phValue = sensors["ph"]["ph"];
SoilPHSens - Soil pH Sensor
#define ENABLE_SENSOR_SOILPH_V1
SoilPHSens soilPh(A0);
soilPh.init();
float ph = sensors["soilPh"]["ph"];
TurbiditySens - Water Turbidity Sensor
#define ENABLE_SENSOR_TURBIDITY_V1
TurbiditySens turbidity(A0);
turbidity.init();
float ntu = sensors["turbidity"]["ntu"];
TDSSens - Total Dissolved Solids
#define ENABLE_SENSOR_TDS_V1
TDSSens tds(A0);
tds.setTemperature(25.0);
tds.init();
float tdsValue = sensors["tds"]["tds"];
HX711Sens - Load Cell Amplifier
#define ENABLE_SENSOR_HX711_V1
HX711Sens loadCell(3, 2);  // DOUT, SCK pins
loadCell.init();
loadCell.tare();  // Zero the scale
float weight = sensors["loadCell"]["weight"];
INA219Sens - Current/Voltage/Power Monitor
#define ENABLE_SENSOR_INA219_V1
INA219Sens ina219;
ina219.init();
float voltage = sensors["ina219"]["voltage"];
float current = sensors["ina219"]["current"];
float power = sensors["ina219"]["power"];
PZEM004TSens - AC Energy Monitor
#define ENABLE_SENSOR_PZEM004T_V1
PZEM004TSens pzem(&Serial2);
pzem.init();
float voltage = sensors["pzem"]["voltage"];
float current = sensors["pzem"]["current"];
float power = sensors["pzem"]["power"];
float energy = sensors["pzem"]["energy"];
UltrasonicSens - HC-SR04 Ultrasonic Distance
#define ENABLE_SENSOR_ULTRASONIC_V1
UltrasonicSens ultrasonic(9, 10);  // Trigger, Echo pins
ultrasonic.init();
float distance_cm = sensors["ultrasonic"]["distance"];
RPMSens - RPM/Speed Sensor
#define ENABLE_SENSOR_RPM_V1
RPMSens rpm(2);  // Interrupt pin
rpm.init();
float rpmValue = sensors["rpm"]["rpm"];
GPSSens - GPS Module (NEO-6M/7M/8M)
#define ENABLE_SENSOR_GPS_V1
GPSSens gps(&Serial1);
gps.init();
float latitude = sensors["gps"]["latitude"];
float longitude = sensors["gps"]["longitude"];
float altitude = sensors["gps"]["altitude"];
float speed = sensors["gps"]["speed"];
int satellites = sensors["gps"]["satellites"];
RFIDSens - MFRC522 RFID Reader
#define ENABLE_SENSOR_RFID_V1
RFIDSens rfid(10, 9);  // SS, RST pins
rfid.init();
String uid = sensors["rfid"]["uid"];
bool cardPresent = sensors["rfid"]["present"];
GM67Sens - GM67 Barcode Scanner
#define ENABLE_SENSOR_GM67_V1
GM67Sens barcode(&Serial2);
barcode.init();
String code = sensors["barcode"]["code"];
String type = sensors["barcode"]["type"];

Color & Light Sensors

TCS3200Sens - Color Sensor
#define ENABLE_SENSOR_TCS3200_V1
TCS3200Sens color(2, 3, 4, 5, 6);  // S0, S1, S2, S3, OUT pins
color.init();
int red = sensors["color"]["red"];
int green = sensors["color"]["green"];
int blue = sensors["color"]["blue"];

Biometric Sensors

MAX30100LibSens - Pulse Oximeter
#define ENABLE_SENSOR_MAX30100_V1
MAX30100LibSens pulse;
pulse.init();
float heartRate = sensors["pulse"]["heartRate"];
float spo2 = sensors["pulse"]["spo2"];
MAX3010xV2Sens - Enhanced Pulse Oximeter
#define ENABLE_SENSOR_MAX3010XV2_V1
MAX3010xV2Sens pulse;
pulse.init();
float heartRate = sensors["pulse"]["heartRate"];
float spo2 = sensors["pulse"]["spo2"];
float temperature = sensors["pulse"]["temperature"];

Input & Time

KeypadI2CSens - I2C Keypad
#define ENABLE_SENSOR_KEYPAD_I2C_V1
KeypadI2CSens keypad(0x20);  // I2C address
keypad.init();
char key = sensors["keypad"]["key"];
RTCSens - Real-Time Clock (DS1307/DS3231)
#define ENABLE_SENSOR_RTC_V1
RTCSens rtc;
rtc.init();
int hour = sensors["rtc"]["hour"];
int minute = sensors["rtc"]["minute"];
int second = sensors["rtc"]["second"];

Analog & Digital I/O

AnalogSens - General Analog Input
#define ENABLE_SENSOR_ANALOG_V1
AnalogSens analog(A0);
analog.init();
int raw = sensors["analog"]["raw"];
float voltage = sensors["analog"]["voltage"];
DigitalSens - General Digital Input
#define ENABLE_SENSOR_DIGITAL_V1
DigitalSens digital(7);
digital.init();
bool state = sensors["digital"]["state"];
VoltageSens - Voltage Divider Sensor
#define ENABLE_SENSOR_VOLTAGE_V1
VoltageSens voltage(A0, 5.0, 1023);
voltage.init();
float volts = sensors["voltage"]["voltage"];
SoilSens - Soil Moisture Sensor
#define ENABLE_SENSOR_SOIL_V1
SoilSens soil(A0);
soil.init();
float moisture = sensors["soil"]["moisture"];

Basic Usage

Setup and Initialization

#define ENABLE_SENSOR_MODULE_V1
#define ENABLE_SENSOR_DHT_V1
#define ENABLE_SENSOR_BME280_V1
#include "Kinematrix.h"

SensorModule sensors;
DHTSens dht(2, DHT22);
BME280Sens bme280;

void setup() {
    Serial.begin(115200);
    
    // Add sensors with names
    sensors.addModule("dht", &dht);
    sensors.addModule("bme280", &bme280);
    
    // Initialize all sensors
    sensors.init();
}

void loop() {
    // Update all sensors
    sensors.update();
    
    // Access sensor data
    float temp = sensors["dht"]["temperature"];
    float humidity = sensors["dht"]["humidity"];
    
    Serial.print("Temperature: ");
    Serial.println(temp);
    
    delay(2000);
}

Direct Sensor Access

// Get sensor pointer
DHTSens *dhtPtr = sensors.getModule<DHTSens>("dht");

// Direct method calls
if (dhtPtr) {
    float temp = dhtPtr->readTemperature();
    float humidity = dhtPtr->readHumidity();
}

Multiple Sensors of Same Type

DS18B20Sens temp1(4);   // OneWire on pin 4
DS18B20Sens temp2(5);   // OneWire on pin 5
DS18B20Sens temp3(6);   // OneWire on pin 6

void setup() {
    sensors.addModule("temp1", &temp1);
    sensors.addModule("temp2", &temp2);
    sensors.addModule("temp3", &temp3);
    sensors.init();
}

void loop() {
    sensors.update();
    
    float t1 = sensors["temp1"]["temperature"];
    float t2 = sensors["temp2"]["temperature"];
    float t3 = sensors["temp3"]["temperature"];
}

Data Access Methods

JSON-Based Access

// Direct JSON access
JsonVariant temp = sensors["dht"]["temperature"];
float tempFloat = temp.as<float>();

// Get full sensor document
JsonDocument doc = sensors("dht");
float temp = doc["dht"]["temperature"];
float humidity = doc["dht"]["humidity"];

Sensor-Specific Getters

BME280Sens *bme = sensors.getModule<BME280Sens>("bme280");
float temp = bme->getValueTemperature();
float pressure = bme->getValuePressure();
float altitude = bme->getValueAltitude();
float humidity = bme->getValueHumidity();

Module Management

// Get module count
uint8_t count = sensors.getModuleCount();

// Get module by index
BaseSens *sensor = sensors.getModulePtr(0);

// Get sensor name
char *name = sensors.getName(0);

// Check if module exists
if (sensors.isModulePresent(0)) {
    // Module exists
}

// Remove module
sensors.removeModule(0);

// Clear all modules
sensors.clearModules();

Best Practices

Initialization: Always check sensor initialization status:
if (!dht.init()) {
    Serial.println("DHT initialization failed!");
}
Update Rate: Don’t update sensors too frequently. Most sensors have minimum update intervals:
  • DHT sensors: 2000ms minimum
  • BME280: 1000ms recommended
  • Analog sensors: 100ms minimum
Memory: Each sensor uses heap memory for JSON storage. Monitor available heap on ESP32/ESP8266:
Serial.println(ESP.getFreeHeap());

Migration to V2

Consider migrating to V2 for:
  • Type-safe data access
  • Built-in filtering
  • Alert system
  • Better memory management
// V1
float temp = sensors["dht"]["temperature"];

// V2
float temp = sensors.getValue<float>("dht", "temperature");

Next Steps

Sensor Module V2

Explore the modern sensor framework

Calibration

Sensor calibration techniques

Build docs developers (and LLMs) love