DreherTankController/DreherTankController.ino

165 lines
4.7 KiB
C++

#ifndef ARDUINO_AVR_MEGA2560
#error This program was written for an Arduino Mega (Atmega2560)
#endif
#include "src/common.h"
#include "src/modbus/ModbusRTUSlave.h"
#include <EEPROM.h>
const uint8_t BTN_PWR = 7;
ModbusParameters modbusParams;
Parameters params; // Prozessparameter
Values vals; // aktuelle Messwerte
PSensor pSensor; // verwendeter Drucksensor
ValveStates vStates; // Zustände der Ausgänge
bool timeStampOverflow = false; // true, wenn mehr als 0xFFF Zehntelsekunden vergangen sind
unsigned long timeStamp;
u16 lastRefTime = 0xFFFF;
u16 zones = 1; // Aktuell ist nur eine Kühlzone implementiert
u32 currMillis;
#if _MODBUS == 1
ModbusRTUSlave mb(&Serial1, 2);
#endif
// cs, btnNext, btnPrev, btnSelect, btnCancel, bgLed
Display display(10, 3, 4, 5, 6, 9);
// Analogeingang Druck, OneWire-Pin, t1Pin, t2Pin, pRisePin, pFallPin
Controller controller(A0, 8, 55, 56, 57, 58);
void setup()
{
#if _DEBUG == 1
Serial.begin(115200);
#endif
pinMode(BTN_PWR, INPUT_PULLUP);
pinMode(53, OUTPUT); // Mega CS-Pin (um Slave-Betrieb zu vermeiden)
display.init();
display.bgLight(true);
getModbusParams();
_printf("ModbusAddress: ");
_println(modbusParams.address);
_printf("ModbusBaudrate: ");
_println(modbusParams.baudrate);
getPSensor();
getParams();
getFaultSettings();
u16 powerOnCount;
EEPROM.get(_EEPROM_POWERON_COUNT, powerOnCount);
switch (powerOnCount) {
case 0:
case 0xFFFF:
powerOnCount = 1;
break;
case 0xFFFE:
break;
default:
powerOnCount++;
}
EEPROM.put(_EEPROM_POWERON_COUNT, powerOnCount);
#if _MODBUS == 1
setupModbus(powerOnCount);
mb.callbackCoil = modbusCallbackCoil;
mb.callbackRegister = modbusCallbackRegister;
#endif
display.greeting();
delay(1000);
controller.init(true);
if (params.cEn)
display.bgLight(true);
else
display.bgLight(100);
_printf("Gespeicherte Alarme: "); _println(faults.count());
timeStamp = millis();
}
void loop()
{
currMillis = millis();
static bool pwrBtnPressed;
bool currentPwrBtnState = readPwrBtn();
if (!pwrBtnPressed && currentPwrBtnState) {
_printlnf("pwrButton pressed");
pwrBtnPressed = true;
} else if(pwrBtnPressed && !currentPwrBtnState) {
_printlnf("pwrButton released");
pwrBtnPressed = false;
Parameters p;
p.cEn = !params.cEn;
setParams(p, true);
}
controller.process();
display.process();
#if _MODBUS == 1
mb.process();
//checkModbusParams();
static bool firstLoop = true;
if (refTime != lastRefTime) {
// _printf("refTime: "); _print(refTime); _printf(", lastRefTime: ");
// _print(lastRefTime); _printf(", new Alarm: "); _println(bitRead(modbusData[1], 12));
lastRefTime = refTime;
timeStamp = currMillis;
modbusData[5] = 0;
eventCounter = 0;
timeStampOverflow = false;
// Bit 12 gibt an, ob ein neuer Alarm aufgetreten ist - zurücksetzen
bitClear(modbusData[1], 12);
// Bit 13 gibt an, ob ein Alarm aktiv ist
if (faults.state() == activeFault) {
bitSet(modbusData[1], 13);
} else {
bitClear(modbusData[1], 13);
}
// Setze das 'Timer-Überlauf'-Bit zurück (falls es gesetzt war)
bitClear(modbusData[1], 14);
if (firstLoop) {
// Nachden die 'ReferenzZeit' erstmalig gesetzt wurde, wird dieses Bit gelöscht
bitClear(modbusData[1], 15);
firstLoop = false;
}
// Setze die Durchschnittswerte für die Messwerte zurück
controller.resetAverageCounters();
_printblnf("Der 12 Bit Timer wurde zurückgesetzt");
}
modbusData[5] = (currMillis - timeStamp) / 100;
if (modbusDelAlarms[0] != 0 && modbusDelAlarms[0] != 0xFFFF) {
modbusDelAlarms[0] = (faults.removeID(modbusDelAlarms[0])) ? 0 : 0xFFFF;
} else if (modbusDelAlarms[1] != 0 && modbusDelAlarms[1] != 0xFFFF) {
modbusDelAlarms[1] = (faults.removeAll()) ? 0 : 0xFFFF;
}
if (!timeStampOverflow && modbusData[5] > 0xFFF) {
#if _DEBUG_MODBUS == 1
_printf("Der 12 Bit Timer ist übergelaufen. Vergangene Sekunden: ");
_print(modbusData[5] / 10); _printf("."); _println(modbusData[5] % 10);
#endif // _DEBUG_MODBUS == 1
timeStampOverflow = true;
bitSet(modbusData[1], 14);
}
#endif // _MODBUS == 1
#if 0
static unsigned long counter = 0;
static unsigned long tl = currMillis;
if (currMillis - tl > 1000) {
tl = currMillis;
_printf("Loops / Sekunde: "); _println(counter);
counter = 0;
} else {
counter++;
}
#endif
}