#include "Arduino.h" #include "Metro.h" #include "ads1210.h" #include "led.h" #include "SimpleModbusSlave.h" #include "Thermometer.h" #include "Config.h" const uint8_t LED_PIN = 8; const uint8_t ADC_1_CS_PIN = 9; const uint8_t ADC_1_RDY_PIN = 7; const uint8_t ADC_2_CS_PIN = 2; const uint8_t ADC_2_RDY_PIN = 3; const uint8_t MODBUS_TX_ENABLE_PIN = 6; const uint8_t MODBUS_ID = 3; const uint32_t MODBUS_BAUD = 1200; const uint8_t NUM_OF_CHANNELS = 2; ADS1210 ads1210[NUM_OF_CHANNELS]; Thermometer thermometer[NUM_OF_CHANNELS]; LED led; Metro secondTick = Metro(1000); uint32_t uptimeSeconds; struct { 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]; } calOffset; union { float in; uint16_t modbusRegisters[2]; } calFactor; union { float in; uint16_t modbusRegisters[2]; } temperatureRaw; union { float in; uint16_t modbusRegisters[2]; } temperature; union { float in; uint16_t modbusRegisters[2]; } alpha; } channelVariables[NUM_OF_CHANNELS]; union { uint32_t in; uint16_t modbusRegisters[2]; } uptimeSeconds; } modbusHoldingRegisters; void setup() { delay(100); bool initializeConfig = Config::initialize(); led.begin(LED_PIN); 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; for (uint8_t i = 0; i < NUM_OF_CHANNELS; i++) { modbusHoldingRegisters.channelVariables[i].calOffset.in = ads1210[i].calOffset; modbusHoldingRegisters.channelVariables[i].calFactor.in = ads1210[i].calFactor; modbusHoldingRegisters.channelVariables[i].alpha.in = thermometer[i].alpha; } } void loop() { 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 (modbusHoldingRegisters.channelVariables[i].calOffset.in != ads1210[i].calOffset) { ads1210[i].calOffset = modbusHoldingRegisters.channelVariables[i].calOffset.in; } if (modbusHoldingRegisters.channelVariables[i].calFactor.in != ads1210[i].calFactor) { ads1210[i].calOffset = modbusHoldingRegisters.channelVariables[i].calFactor.in; } if (modbusHoldingRegisters.channelVariables[i].alpha.in != thermometer[i].alpha) { thermometer[i].alpha = modbusHoldingRegisters.channelVariables[i].alpha.in; } } modbus_update(); if (secondTick.check() == 1) { led.toggle(); uptimeSeconds++; modbusHoldingRegisters.uptimeSeconds.in = uptimeSeconds; } }