diff --git a/Config.cpp b/Config.cpp index 1cc6e2c..6a199e0 100644 --- a/Config.cpp +++ b/Config.cpp @@ -44,14 +44,10 @@ void Config::setMagic() { } void Config::initialize() { + bool res = false; if (! isInitialized()) { - setFloat(ADC1START, 0.0); - setFloat(ADC1START + 4, 1.0); - setFloat(ADC2START, 0.0); - setFloat(ADC2START + 4, 1.0); - setFloat(THERMO1START, 1.0); - setFloat(THERMO2START, 1.0); - + res = true; setMagic(); } + return res; } diff --git a/Config.h b/Config.h index 4aadae0..916b829 100644 --- a/Config.h +++ b/Config.h @@ -24,14 +24,13 @@ namespace Config { const int THERMO1START = 20; const int THERMO2START = 24; - 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(); + bool 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(); } diff --git a/ModbusThermometer.cpp b/ModbusThermometer.cpp index d68750c..f6b4aaf 100644 --- a/ModbusThermometer.cpp +++ b/ModbusThermometer.cpp @@ -23,72 +23,53 @@ const uint8_t MODBUS_ID = 3; const uint32_t MODBUS_BAUD = 1200; +const uint8_t NUM_OF_CHANNELS = 2; -ADS1210 ads1210_1; -ADS1210 ads1210_2; -Thermometer thermometer1; -Thermometer thermometer2; +ADS1210 ads1210[NUM_OF_CHANNELS]; +Thermometer thermometer[NUM_OF_CHANNELS]; LED led; Metro secondTick = Metro(1000); uint32_t uptimeSeconds; struct { - union { - uint32_t in; - uint16_t modbusRegisters[2]; // 0, 1 - } adc1Value; - union { - float in; - uint16_t modbusRegisters[2]; // 2, 3 - } adc1U; - union { - float in; - uint16_t modbusRegisters[2]; // 4, 5 - } adc1R; - union { - float in; - uint16_t modbusRegisters[2]; // 6, 7 - } temperature1Raw; - union { - float in; - uint16_t modbusRegisters[2]; // 8, 9 - } temperature1; - union { - uint32_t in; - uint16_t modbusRegisters[2]; // 10, 11 - } adc2Value; - union { - float in; - uint16_t modbusRegisters[2]; // 12, 13 - } adc2U; - union { - float in; - uint16_t modbusRegisters[2]; // 14, 15 - } adc2R; - union { - float in; - uint16_t modbusRegisters[2]; // 16, 17 - } temperature2Raw; - union { - float in; - uint16_t modbusRegisters[2]; // 18, 19 - } temperature2; - union { - uint32_t in; - uint16_t modbusRegisters[2]; // 20, 21 - } uptimeSeconds; + struct { + union { + uint32_t in; + uint16_t modbusRegisters[2]; + } adcValue; + union { + float in; + uint16_t modbusRegisters[2]; + } adcU; + union { + float in; + uint16_t modbusRegisters[2]; + } adcR; + union { + float in; + uint16_t modbusRegisters[2]; + } temperatureRaw; + union { + float in; + uint16_t modbusRegisters[2]; + } temperature; + } channelVariables[NUM_OF_CHANNELS]; + union { + uint32_t in; + uint16_t modbusRegisters[2]; + } uptimeSeconds; } modbusHoldingRegisters; void setup() { delay(100); - Config::initialize(); + bool initializeConfig = Config::initialize(); led.begin(LED_PIN); - ads1210_1.begin(ADC_1_CS_PIN, ADC_1_RDY_PIN, Config::ADC1START); - ads1210_2.begin(ADC_2_CS_PIN, ADC_2_RDY_PIN, Config::ADC2START); - thermometer1.begin(Config::THERMO1START); - thermometer2.begin(Config::THERMO2START); + ads1210[0].begin(ADC_1_CS_PIN, ADC_1_RDY_PIN, initializeConfig, Config::ADC1START); + ads1210[1].begin(ADC_2_CS_PIN, ADC_2_RDY_PIN, initializeConfig, Config::ADC2START); + thermometer[0].begin(initializeConfig, Config::THERMO1START); + thermometer[1].begin(initializeConfig, Config::THERMO2START); modbus_configure(&Serial, MODBUS_BAUD, SERIAL_8N2, MODBUS_ID, MODBUS_TX_ENABLE_PIN, sizeof(modbusHoldingRegisters), (uint16_t*)(&modbusHoldingRegisters)); uptimeSeconds = 0; @@ -97,22 +78,16 @@ void setup() { void loop() { modbus_update(); - ads1210_1.exec(); - modbusHoldingRegisters.adc1Value.in = ads1210_1.value; - modbusHoldingRegisters.adc1U.in = ads1210_1.u; - modbusHoldingRegisters.adc1R.in = ads1210_1.r; - thermometer1.exec(ads1210_1.r); - modbusHoldingRegisters.temperature1Raw.in = thermometer1.temperatureRaw; - modbusHoldingRegisters.temperature1.in = thermometer1.temperature; - - - ads1210_2.exec(); - modbusHoldingRegisters.adc2Value.in = ads1210_2.value; - modbusHoldingRegisters.adc2U.in = ads1210_2.u; - modbusHoldingRegisters.adc2R.in = ads1210_2.r; - thermometer2.exec(ads1210_2.r); - modbusHoldingRegisters.temperature2Raw.in = thermometer2.temperatureRaw; - modbusHoldingRegisters.temperature2.in = thermometer2.temperature; + for (uint8_t i = 0; i < NUM_OF_CHANNELS; i++) { + ads1210[i].exec(); + modbusHoldingRegisters.channelVariables[i].adcValue.in = ads1210[i].value; + modbusHoldingRegisters.channelVariables[i].adcU.in = ads1210[i].u; + modbusHoldingRegisters.channelVariables[i].adcR.in = ads1210[i].r; + + thermometer[i].exec(ads1210[i].r); + modbusHoldingRegisters.channelVariables[i].temperatureRaw.in = thermometer[i].temperatureRaw; + modbusHoldingRegisters.channelVariables[i].temperature.in = thermometer[i].temperature; + } if (secondTick.check() == 1) { led.toggle(); diff --git a/Thermometer.cpp b/Thermometer.cpp index 1e3d17c..dcd4474 100644 --- a/Thermometer.cpp +++ b/Thermometer.cpp @@ -9,8 +9,13 @@ Thermometer::Thermometer() { } -void Thermometer::begin(int eepromAddr) { +void Thermometer::begin(bool initializeConfig, int eepromAddr) { m_eepromAddr = eepromAddr; + + if (initializeConfig) { + // set default values + } + m_lastSmoothedTemperature = INVALID_TEMPERATURE; m_alpha = 0.1; } diff --git a/Thermometer.h b/Thermometer.h index 62679dc..38150a4 100644 --- a/Thermometer.h +++ b/Thermometer.h @@ -12,8 +12,8 @@ namespace nsThermometer { class Thermometer { public: - Thermometer(); - void begin(int eepromAddr); + Thermometer(); + void begin(bool initializeConfig, int eepromAddr); void exec(float r); float temperature; float temperatureRaw; diff --git a/ads1210.cpp b/ads1210.cpp index 7139217..a762724 100644 --- a/ads1210.cpp +++ b/ads1210.cpp @@ -99,12 +99,16 @@ void ADS1210::setGain(uint8_t gain) const { writeRegister(ADDR_CMR2, cmr); } -void ADS1210::begin(uint8_t csPin, uint8_t drdyPin, int eepromAddr) { +void ADS1210::begin(uint8_t csPin, uint8_t drdyPin, bool initializeConfig, int eepromAddr) { static bool onlyOnce = false; m_csPin = csPin; m_drdyPin = drdyPin; m_eepromAddr = eepromAddr; + + if (initializeConfig) { + // set default values + } // initialization of SPI // Serial << "Start SPI initialization ... "; diff --git a/ads1210.h b/ads1210.h index 3e4471e..9ccc7a8 100644 --- a/ads1210.h +++ b/ads1210.h @@ -11,7 +11,7 @@ class ADS1210 { public: ADS1210() : value(0) {}; - void begin(uint8_t csPin, uint8_t drdyPin, int eepromAddr); + void begin(uint8_t csPin, uint8_t drdyPin, bool initializeConfig, int eepromAddr); void exec(); uint32_t value;