/* SENSOR MODULE Copyright (C) 2016-2019 by Xose PĂ©rez Copyright (C) 2020 by Maxim Prokhorov */ #pragma once struct sensor_magnitude_t; //-------------------------------------------------------------------------------- namespace sensor { namespace type { enum Type : unsigned char { Base = 0, Emon = 1 << 0, Analog = 1 << 1 }; } // namespace type enum class Unit : int { Min_, None, Celcius, Farenheit, Kelvin, Percentage, Hectopascal, Ampere, Volt, Voltampere, Kilovoltampere, VoltampereReactive, KilovoltampereReactive, Watt, Kilowatt, WattSecond, Joule = WattSecond, KilowattHour, PartsPerMillion, Ohm, MicrogrammPerCubicMeter, // The concentration of an air pollutant MilligrammPerCubicMeter, // Lux, UltravioletIndex, // "measurement of the strength of sunburn-producing ultraviolet (UV) radiation at a particular place and time" // (XXX: Not a unit. Distinguish from None and specify decimals) CountsPerMinute, // Unit of local dose rate (Geiger counting) MicrosievertPerHour, // 2nd unit of local dose rate (Geiger counting) Meter, Max_ }; // Base units are 32 bit since we are the fastest with them. struct Ws { Ws(); Ws(uint32_t); uint32_t value; }; struct Wh { Wh(); Wh(Ws); Wh(uint32_t); uint32_t value; }; struct KWh { KWh(); KWh(Ws); KWh(Wh); KWh(uint32_t); uint32_t value; }; struct Energy { constexpr static uint32_t KwhMultiplier = 3600000ul; constexpr static uint32_t KwhLimit = ((1ul << 31ul) / KwhMultiplier); Energy() = default; // TODO: while we accept ws >= the kwh conversion limit, // should this be dealt with on the unit level? Energy(double); Energy(KWh, Ws); Energy(KWh); Energy(Wh); Energy(Ws); // Sets internal counters to zero void reset(); // Check whether we have *any* energy recorded. Can be zero: // - on cold boot // - on overflow // - when we call `reset()` operator bool(); // Generic conversion as-is double asDouble(); // Convert back to input unit, with overflow mechanics when kwh values goes over 32 bit Ws asWs(); // Generic sensors output energy in joules / watt-second Energy& operator +=(Ws); Energy operator +(Ws); // But sometimes we want to accept asDouble() value back Energy& operator =(double); // We are storing a kind-of integral and fractional parts // Using watt-second to avoid loosing precision, we don't expect these to be accessed directly KWh kwh; Ws ws; }; } String magnitudeName(unsigned char index); String magnitudeUnits(unsigned char index); unsigned char magnitudeType(unsigned char index); // XXX: without param name it is kind of vague what exactly unsigned char is // consider using index instead of type or adding stronger param type String magnitudeTopic(unsigned char type); String magnitudeTopic(const sensor_magnitude_t& magnitude); String magnitudeUnits(const sensor_magnitude_t& magnitude); unsigned char sensorCount(); unsigned char magnitudeCount(); double magnitudeValue(unsigned char index); unsigned char magnitudeIndex(unsigned char index); String magnitudeTopicIndex(unsigned char index); void sensorSetup(); void sensorLoop(); //-------------------------------------------------------------------------------- #include "filters/LastFilter.h" #include "filters/MaxFilter.h" #include "filters/MedianFilter.h" #include "filters/MovingAverageFilter.h" #include "filters/SumFilter.h" #include "sensors/BaseSensor.h" #include "sensors/BaseEmonSensor.h" #include "sensors/BaseAnalogSensor.h" #if AM2320_SUPPORT #include "sensors/AM2320Sensor.h" #endif #if ANALOG_SUPPORT #include "sensors/AnalogSensor.h" #endif #if BH1750_SUPPORT #include "sensors/BH1750Sensor.h" #endif #if BMP180_SUPPORT #include "sensors/BMP180Sensor.h" #endif #if BMX280_SUPPORT #include "sensors/BMX280Sensor.h" #endif #if CSE7766_SUPPORT #include "sensors/CSE7766Sensor.h" #endif #if DALLAS_SUPPORT #include "sensors/DallasSensor.h" #endif #if DHT_SUPPORT #include "sensors/DHTSensor.h" #endif #if DIGITAL_SUPPORT #include "sensors/DigitalSensor.h" #endif #if ECH1560_SUPPORT #include "sensors/ECH1560Sensor.h" #endif #if EMON_ADC121_SUPPORT #include "sensors/EmonADC121Sensor.h" #endif #if EMON_ADS1X15_SUPPORT #include "sensors/EmonADS1X15Sensor.h" #endif #if EMON_ANALOG_SUPPORT #include "sensors/EmonAnalogSensor.h" #endif #if EVENTS_SUPPORT #include "sensors/EventSensor.h" #endif #if EZOPH_SUPPORT #include "sensors/EZOPHSensor.h" #endif #if GEIGER_SUPPORT #include "sensors/GeigerSensor.h" #endif #if GUVAS12SD_SUPPORT #include "sensors/GUVAS12SDSensor.h" #endif #if HLW8012_SUPPORT #include "sensors/HLW8012Sensor.h" #endif #if LDR_SUPPORT #include "sensors/LDRSensor.h" #endif #if MAX6675_SUPPORT #include "sensors/MAX6675Sensor.h" #endif #if MICS2710_SUPPORT #include "sensors/MICS2710Sensor.h" #endif #if MICS5525_SUPPORT #include "sensors/MICS5525Sensor.h" #endif #if MHZ19_SUPPORT #include "sensors/MHZ19Sensor.h" #endif #if NTC_SUPPORT #include "sensors/NTCSensor.h" #endif #if SDS011_SUPPORT #include "sensors/SDS011Sensor.h" #endif #if SENSEAIR_SUPPORT #include "sensors/SenseAirSensor.h" #endif #if PMSX003_SUPPORT #include "sensors/PMSX003Sensor.h" #endif #if PULSEMETER_SUPPORT #include "sensors/PulseMeterSensor.h" #endif #if PZEM004T_SUPPORT #include "sensors/PZEM004TSensor.h" #endif #if SHT3X_I2C_SUPPORT #include "sensors/SHT3XI2CSensor.h" #endif #if SI7021_SUPPORT #include "sensors/SI7021Sensor.h" #endif #if SONAR_SUPPORT #include "sensors/SonarSensor.h" #endif #if T6613_SUPPORT #include "sensors/T6613Sensor.h" #endif #if TMP3X_SUPPORT #include "sensors/TMP3XSensor.h" #endif #if V9261F_SUPPORT #include "sensors/V9261FSensor.h" #endif #if VEML6075_SUPPORT #include "sensors/VEML6075Sensor.h" #endif #if VL53L1X_SUPPORT #include "sensors/VL53L1XSensor.h" #endif #if ADE7953_SUPPORT #include "sensors/ADE7953Sensor.h" #endif #if SI1145_SUPPORT #include "sensors/SI1145Sensor.h" #endif #if HDC1080_SUPPORT #include "sensors/HDC1080Sensor.h" #endif //--------------------------------------------------------------------------------