diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
deleted file mode 100644
index 2b7ad02..0000000
--- a/.settings/language.settings.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs
index 6646c0d..52b321f 100644
--- a/.settings/org.eclipse.cdt.core.prefs
+++ b/.settings/org.eclipse.cdt.core.prefs
@@ -268,7 +268,7 @@ environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.
environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.BOARD_NAME/value=Arduino Micro
environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.COM_PORT/delimiter=\:
environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.COM_PORT/operation=replace
-environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.COM_PORT/value=/dev/tty.usbmodemfd111
+environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.COM_PORT/value=/dev/tty.usbmodemfd1111
environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.EXTRA.C.COMPILE/delimiter=\:
environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.EXTRA.C.COMPILE/operation=replace
environment/project/it.baeyens.arduino.core.toolChain.release.1518476005/JANTJE.EXTRA.C.COMPILE/value=
diff --git a/MeterBusPowerMaster.cpp b/MeterBusPowerMaster.cpp
index 385d502..b72fc32 100644
--- a/MeterBusPowerMaster.cpp
+++ b/MeterBusPowerMaster.cpp
@@ -7,28 +7,28 @@
// #include "test.h"
#include "uptime.h"
#include "meterBusMaster.h"
+#include "overCurrentProt.h"
static CmdServer cmdServer(&Serial);
// static TestCmd testCmd;
static Uptime uptime;
static MeterBusMaster meterBusMaster;
+static OverCurrentProt overCurrentProt;
void setup() {
cmdServer.begin();
// testCmd.registerYourself(&cmdServer);
+ overCurrentProt.begin(&cmdServer);
uptime.begin(&cmdServer);
meterBusMaster.begin(&cmdServer);
-
-
- Serial.println("Good afternoon, Sir!");
}
void loop() {
cmdServer.exec();
+ overCurrentProt.exec();
uptime.exec();
meterBusMaster.exec();
-
}
diff --git a/meterBusMaster.cpp b/meterBusMaster.cpp
index c64e5bf..25f7a80 100644
--- a/meterBusMaster.cpp
+++ b/meterBusMaster.cpp
@@ -40,9 +40,9 @@ uint16_t stringToUInt8(String i, uint8_t index) {
String MeasureCurrent::exec(String params) {
int currentInVal = analogRead(CURRENT_IN);
- int current = currentInVal;
+ int current = ((double)currentInVal * U_UNIT) / R_SHUNT;
- return String() + current;
+ return String() + current + String("mA");
}
diff --git a/meterBusMaster.h b/meterBusMaster.h
index 3145a00..001e4b2 100644
--- a/meterBusMaster.h
+++ b/meterBusMaster.h
@@ -14,6 +14,8 @@ const uint8_t RX_ENABLE = LOW;
const uint8_t RX_DISABLE = HIGH;
const uint8_t CURRENT_IN = A0;
+const double U_UNIT = 4.9; // mV
+const double R_SHUNT = 11.0;
class SendOctets : public Cmd, public ResponseCallback {
diff --git a/overCurrentProt.cpp b/overCurrentProt.cpp
new file mode 100644
index 0000000..7028ed0
--- /dev/null
+++ b/overCurrentProt.cpp
@@ -0,0 +1,66 @@
+#include
+#include
+#include "overCurrentProt.h"
+
+
+
+volatile bool overCurrentMarker;
+
+void overCurrentProtServiceRoutine() {
+ // switch off current
+ digitalWrite(CURRENT_SHUTDOWN, CURRENT_OFF);
+
+ // set marker
+ overCurrentMarker = true;
+
+ Serial.println("X");
+}
+
+
+
+
+OverCurrentProtCmd::OverCurrentProtCmd(OverCurrentProt *overCurrentProt) : m_overCurrentProt(overCurrentProt) {
+}
+
+String OverCurrentProtCmd::exec(String params) {
+ return String("") + m_overCurrentProt->getEventCnt();
+}
+
+OverCurrentResetCmd::OverCurrentResetCmd(OverCurrentProt *overCurrentProt) : m_overCurrentProt(overCurrentProt) {
+}
+
+String OverCurrentResetCmd::exec(String params) {
+ m_overCurrentProt->resetEventCnt();
+ return "done";
+}
+
+
+
+OverCurrentProt::OverCurrentProt() : m_overCurrentProtCmd(this), m_overCurrentResetCmd(this), m_eventCnt(0), m_timestamp(0) {
+
+}
+
+
+void OverCurrentProt::begin(CmdServer *cmdServer) {
+ m_overCurrentProtCmd.registerYourself(cmdServer);
+ m_overCurrentResetCmd.registerYourself(cmdServer);
+ pinMode(CURRENT_SHUTDOWN, OUTPUT);
+ digitalWrite(CURRENT_SHUTDOWN, CURRENT_ON);
+ overCurrentMarker = false;
+ attachInterrupt(CURRENT_INTERRUPT, overCurrentProtServiceRoutine, RISING);
+ Serial.println("OC ready");
+}
+
+
+void OverCurrentProt::exec() {
+ if ((m_timestamp == 0) && overCurrentMarker) {
+ m_eventCnt++;
+ m_timestamp = millis();
+ }
+
+ if ((m_timestamp != 0) && ((m_timestamp + TURN_ON_DELAY) < millis())) {
+ overCurrentMarker = false;
+ m_timestamp = 0;
+ digitalWrite(CURRENT_SHUTDOWN, CURRENT_ON);
+ }
+}
diff --git a/overCurrentProt.h b/overCurrentProt.h
new file mode 100644
index 0000000..999598a
--- /dev/null
+++ b/overCurrentProt.h
@@ -0,0 +1,56 @@
+#ifndef OVERCURRENTPROT_H_
+#define OVERCURRENTPROT_H_
+
+
+#include "cmd.h"
+
+
+#define CURRENT_SHUTDOWN 5
+#define CURRENT_ON 0
+#define CURRENT_OFF 1
+#define CURRENT_INTERRUPT 0
+
+const unsigned long TURN_ON_DELAY = 10000; // ms
+
+
+class OverCurrentProt;
+
+class OverCurrentProtCmd : public Cmd {
+public:
+ OverCurrentProtCmd(OverCurrentProt *overCurrentProt);
+ virtual String getCmdName() { return "OCPC"; }
+ virtual String getHelp() { return "OCP cnt"; }
+ virtual String exec(String params);
+private:
+ OverCurrentProt *m_overCurrentProt;
+};
+
+class OverCurrentResetCmd : public Cmd {
+public:
+ OverCurrentResetCmd(OverCurrentProt *overCurrentProt);
+ virtual String getCmdName() { return "OCRST"; }
+ virtual String getHelp() { return "OCP rst"; }
+ virtual String exec(String params);
+private:
+ OverCurrentProt *m_overCurrentProt;
+};
+
+
+
+class OverCurrentProt {
+public:
+ OverCurrentProt();
+ void begin(CmdServer *cmdServer);
+ void exec();
+ uint32_t getEventCnt() { return m_eventCnt; };
+ void resetEventCnt() { m_eventCnt = 0; };
+private:
+ OverCurrentProtCmd m_overCurrentProtCmd;
+ OverCurrentResetCmd m_overCurrentResetCmd;
+ uint32_t m_eventCnt;
+ unsigned long m_timestamp;
+};
+
+
+
+#endif /* OVERCURRENTPROT_H_ */