diff --git a/Config.cpp b/Config.cpp new file mode 100644 index 0000000..13e7ae4 --- /dev/null +++ b/Config.cpp @@ -0,0 +1,54 @@ +#include "Config.h" + + +float Config::getFloat(int pos) { + u_float u; + for (uint8_t i = 0; i < sizeof(float); i++) { + u.e[i] = EEPROM.read(pos + i); + } + return u.f; +} + +void Config::setFloat(int pos, float value) { + u_float u; + u.f = value; + for (uint8_t i = 0; i < sizeof(float); i++) { + EEPROM.write(pos + i, u.e[i]); + } +} + +unsigned int Config::getUInt32(int pos) { + u_uint32 u; + for (uint8_t i = 0; i < sizeof(uint32_t); i++) { + u.e[i] = EEPROM.read(pos + i); + } + return u.i; +} + +void Config::setUInt32(int pos, uint32_t value) { + u_uint32 u; + u.i = value; + for (uint8_t i = 0; i < sizeof(uint32_t); i++) { + EEPROM.write(pos + i, u.e[i]); + } +} + +bool Config::isInitialized() { + uint32_t magic = getUInt32(MAGIC); + return magic == MAGIC_TOKEN; +} + +void Config::setMagic() { + setUInt32(MAGIC, MAGIC_TOKEN); +} + +void Config::initialize() { + if (! isInitialized()) { + setFloat(ADC1START, 0.0); + setFloat(ADC1START + 4, 1.0); + setFloat(ADC2START, 0.0); + setFloat(ADC2START + 4, 1.0); + + setMagic(); + } +} diff --git a/Config.h b/Config.h new file mode 100644 index 0000000..b0f4674 --- /dev/null +++ b/Config.h @@ -0,0 +1,36 @@ +#ifndef _config_h_ +#define _config_h_ + +#include + + +typedef union { + float f; + uint8_t e[sizeof(float)]; +} u_float; + +typedef union { + uint32_t i; + uint8_t e[sizeof(uint32_t)]; +} u_uint32; + + +namespace Config { + const uint32_t MAGIC_TOKEN = 0xDEADBEEF; + + const int MAGIC = 0; + const int ADC1START = 4; + const int ADC2START = 12; + + void initialize(); + bool isInitialized(); + float getFloat(int pos); + void setFloat(int pos, float value); + uint32_t getUInt32(int pos); + void setUInt32(int pos, uint32_t value); + + void setMagic(); +} + + +#endif // _config_h_ \ No newline at end of file diff --git a/ModbusThermometer.cpp b/ModbusThermometer.cpp index 6e7a1c4..bf0982a 100644 --- a/ModbusThermometer.cpp +++ b/ModbusThermometer.cpp @@ -5,6 +5,7 @@ #include "ads1210.h" #include "led.h" #include "SimpleModbusSlave.h" +#include "Config.h" const uint8_t LED_PIN = 8; @@ -61,6 +62,7 @@ struct { void setup() { delay(100); + Config::initialize(); led.begin(LED_PIN); ads1210_1.begin(ADC_1_CS_PIN, ADC_1_RDY_PIN); ads1210_2.begin(ADC_2_CS_PIN, ADC_2_RDY_PIN); diff --git a/ads1210.cpp b/ads1210.cpp index 72e5c4c..233c7b2 100644 --- a/ads1210.cpp +++ b/ads1210.cpp @@ -77,11 +77,8 @@ void ADS1210::exec() { value = res.out; u = (((float)value) / ((float)V_MAX)) * U_REF; - r = ((((float)V_MAX) / ((float)value)) - 1.0) * R_REF; - - if (value == 0) { - // fatal(2); - } + rRaw = ((((float)V_MAX) / ((float)value)) - 1.0) * R_REF; + r = (rRaw + m_calOffset) * m_calFactor; } } @@ -133,6 +130,9 @@ void ADS1210::begin(uint8_t csPin, uint8_t drdyPin) { setMode(CMR_MD_SelfCalibration); waitForDRdy(); // Serial << "done." << endl; + + m_calOffset = 0.0; + m_calFactor = 1.0; } diff --git a/ads1210.h b/ads1210.h index 5fa40b6..8e3bcde 100644 --- a/ads1210.h +++ b/ads1210.h @@ -11,11 +11,12 @@ class ADS1210 { public: ADS1210() : value(0) {}; - void begin(uint8_t csPin, uint8_t drdyPin); + void begin(uint8_t csPin, uint8_t drdyPin, int eepromAddr); void exec(); uint32_t value; float u; + float rRaw; float r; private: // register addresses @@ -77,6 +78,9 @@ private: uint8_t m_csPin; uint8_t m_drdyPin; + int m_eepromAddr; + float m_calFactor; + float m_calOffset; void enableCS() const;