array of channels and config stuff

This commit is contained in:
Wolfgang Hottgenroth
2014-11-17 19:45:38 +01:00
parent f4cadb46a2
commit 4ea27a7169
7 changed files with 68 additions and 89 deletions

View File

@ -44,14 +44,10 @@ void Config::setMagic() {
} }
void Config::initialize() { void Config::initialize() {
bool res = false;
if (! isInitialized()) { if (! isInitialized()) {
setFloat(ADC1START, 0.0); res = true;
setFloat(ADC1START + 4, 1.0);
setFloat(ADC2START, 0.0);
setFloat(ADC2START + 4, 1.0);
setFloat(THERMO1START, 1.0);
setFloat(THERMO2START, 1.0);
setMagic(); setMagic();
} }
return res;
} }

View File

@ -24,13 +24,12 @@ namespace Config {
const int THERMO1START = 20; const int THERMO1START = 20;
const int THERMO2START = 24; const int THERMO2START = 24;
void initialize(); bool initialize();
bool isInitialized(); bool isInitialized();
float getFloat(int pos); float getFloat(int pos);
void setFloat(int pos, float value); void setFloat(int pos, float value);
uint32_t getUInt32(int pos); uint32_t getUInt32(int pos);
void setUInt32(int pos, uint32_t value); void setUInt32(int pos, uint32_t value);
void setMagic(); void setMagic();
} }

View File

@ -23,72 +23,53 @@ const uint8_t MODBUS_ID = 3;
const uint32_t MODBUS_BAUD = 1200; const uint32_t MODBUS_BAUD = 1200;
const uint8_t NUM_OF_CHANNELS = 2;
ADS1210 ads1210_1; ADS1210 ads1210[NUM_OF_CHANNELS];
ADS1210 ads1210_2; Thermometer thermometer[NUM_OF_CHANNELS];
Thermometer thermometer1;
Thermometer thermometer2;
LED led; LED led;
Metro secondTick = Metro(1000); Metro secondTick = Metro(1000);
uint32_t uptimeSeconds; uint32_t uptimeSeconds;
struct { struct {
struct {
union { union {
uint32_t in; uint32_t in;
uint16_t modbusRegisters[2]; // 0, 1 uint16_t modbusRegisters[2];
} adc1Value; } adcValue;
union { union {
float in; float in;
uint16_t modbusRegisters[2]; // 2, 3 uint16_t modbusRegisters[2];
} adc1U; } adcU;
union { union {
float in; float in;
uint16_t modbusRegisters[2]; // 4, 5 uint16_t modbusRegisters[2];
} adc1R; } adcR;
union { union {
float in; float in;
uint16_t modbusRegisters[2]; // 6, 7 uint16_t modbusRegisters[2];
} temperature1Raw; } temperatureRaw;
union { union {
float in; float in;
uint16_t modbusRegisters[2]; // 8, 9 uint16_t modbusRegisters[2];
} temperature1; } temperature;
} channelVariables[NUM_OF_CHANNELS];
union { union {
uint32_t in; uint32_t in;
uint16_t modbusRegisters[2]; // 10, 11 uint16_t modbusRegisters[2];
} 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; } uptimeSeconds;
} modbusHoldingRegisters; } modbusHoldingRegisters;
void setup() { void setup() {
delay(100); delay(100);
Config::initialize(); bool initializeConfig = Config::initialize();
led.begin(LED_PIN); led.begin(LED_PIN);
ads1210_1.begin(ADC_1_CS_PIN, ADC_1_RDY_PIN, Config::ADC1START); ads1210[0].begin(ADC_1_CS_PIN, ADC_1_RDY_PIN, initializeConfig, Config::ADC1START);
ads1210_2.begin(ADC_2_CS_PIN, ADC_2_RDY_PIN, Config::ADC2START); ads1210[1].begin(ADC_2_CS_PIN, ADC_2_RDY_PIN, initializeConfig, Config::ADC2START);
thermometer1.begin(Config::THERMO1START); thermometer[0].begin(initializeConfig, Config::THERMO1START);
thermometer2.begin(Config::THERMO2START); thermometer[1].begin(initializeConfig, Config::THERMO2START);
modbus_configure(&Serial, MODBUS_BAUD, SERIAL_8N2, MODBUS_ID, MODBUS_TX_ENABLE_PIN, modbus_configure(&Serial, MODBUS_BAUD, SERIAL_8N2, MODBUS_ID, MODBUS_TX_ENABLE_PIN,
sizeof(modbusHoldingRegisters), (uint16_t*)(&modbusHoldingRegisters)); sizeof(modbusHoldingRegisters), (uint16_t*)(&modbusHoldingRegisters));
uptimeSeconds = 0; uptimeSeconds = 0;
@ -97,22 +78,16 @@ void setup() {
void loop() { void loop() {
modbus_update(); modbus_update();
ads1210_1.exec(); for (uint8_t i = 0; i < NUM_OF_CHANNELS; i++) {
modbusHoldingRegisters.adc1Value.in = ads1210_1.value; ads1210[i].exec();
modbusHoldingRegisters.adc1U.in = ads1210_1.u; modbusHoldingRegisters.channelVariables[i].adcValue.in = ads1210[i].value;
modbusHoldingRegisters.adc1R.in = ads1210_1.r; modbusHoldingRegisters.channelVariables[i].adcU.in = ads1210[i].u;
thermometer1.exec(ads1210_1.r); modbusHoldingRegisters.channelVariables[i].adcR.in = ads1210[i].r;
modbusHoldingRegisters.temperature1Raw.in = thermometer1.temperatureRaw;
modbusHoldingRegisters.temperature1.in = thermometer1.temperature;
thermometer[i].exec(ads1210[i].r);
ads1210_2.exec(); modbusHoldingRegisters.channelVariables[i].temperatureRaw.in = thermometer[i].temperatureRaw;
modbusHoldingRegisters.adc2Value.in = ads1210_2.value; modbusHoldingRegisters.channelVariables[i].temperature.in = thermometer[i].temperature;
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;
if (secondTick.check() == 1) { if (secondTick.check() == 1) {
led.toggle(); led.toggle();

View File

@ -9,8 +9,13 @@ Thermometer::Thermometer() {
} }
void Thermometer::begin(int eepromAddr) { void Thermometer::begin(bool initializeConfig, int eepromAddr) {
m_eepromAddr = eepromAddr; m_eepromAddr = eepromAddr;
if (initializeConfig) {
// set default values
}
m_lastSmoothedTemperature = INVALID_TEMPERATURE; m_lastSmoothedTemperature = INVALID_TEMPERATURE;
m_alpha = 0.1; m_alpha = 0.1;
} }

View File

@ -13,7 +13,7 @@ namespace nsThermometer {
class Thermometer { class Thermometer {
public: public:
Thermometer(); Thermometer();
void begin(int eepromAddr); void begin(bool initializeConfig, int eepromAddr);
void exec(float r); void exec(float r);
float temperature; float temperature;
float temperatureRaw; float temperatureRaw;

View File

@ -99,13 +99,17 @@ void ADS1210::setGain(uint8_t gain) const {
writeRegister(ADDR_CMR2, cmr); 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; static bool onlyOnce = false;
m_csPin = csPin; m_csPin = csPin;
m_drdyPin = drdyPin; m_drdyPin = drdyPin;
m_eepromAddr = eepromAddr; m_eepromAddr = eepromAddr;
if (initializeConfig) {
// set default values
}
// initialization of SPI // initialization of SPI
// Serial << "Start SPI initialization ... "; // Serial << "Start SPI initialization ... ";
pinMode(m_csPin, OUTPUT); pinMode(m_csPin, OUTPUT);

View File

@ -11,7 +11,7 @@
class ADS1210 { class ADS1210 {
public: public:
ADS1210() : value(0) {}; 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(); void exec();
uint32_t value; uint32_t value;