From 34eddf58ce03df1ef18f477209735e1ac3158e54 Mon Sep 17 00:00:00 2001 From: hg Date: Mon, 18 May 2015 12:36:47 +0200 Subject: [PATCH] changes for Finder, introduce Wifi-Enable flag --- .settings/org.eclipse.cdt.core.prefs | 4 +- ModbusApp.cpp | 52 +++---- ModbusApp.h | 6 +- SimpleModbusMaster.cpp | 7 +- WiModbusGateway.cpp | 206 +++++++++++++-------------- 5 files changed, 136 insertions(+), 139 deletions(-) diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs index 8419ac1..9af1062 100644 --- a/.settings/org.eclipse.cdt.core.prefs +++ b/.settings/org.eclipse.cdt.core.prefs @@ -151,10 +151,10 @@ environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.DTS/value=3600 environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.LOCAL/delimiter=\: environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.LOCAL/operation=replace -environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.LOCAL/value=1431556581 +environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.LOCAL/value=1431952539 environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.UTC/delimiter=\: environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.UTC/operation=replace -environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.UTC/value=1431549381 +environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.UTC/value=1431945339 environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.ZONE/delimiter=\: environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.ZONE/operation=replace environment/project/it.baeyens.arduino.core.toolChain.release.1600398586/A.EXTRA.TIME.ZONE/value=3600 diff --git a/ModbusApp.cpp b/ModbusApp.cpp index 3491b80..72e4b74 100644 --- a/ModbusApp.cpp +++ b/ModbusApp.cpp @@ -13,7 +13,7 @@ enum { VOLTAGE, - FREQUENCY, + COSPHI, CURRENT, POWER, ENERGY, @@ -25,33 +25,24 @@ Packet packets[TOTAL_NO_OF_PACKETS]; // Mudbus *modbusSlave; -uint16_t voltage[2]; -uint16_t frequency[2]; -uint16_t current[2]; -uint16_t power[2]; -uint16_t energy[2]; +uint16_t voltage; +uint16_t cosphi; +uint16_t current; +uint16_t power; +union { + uint16_t in[2]; + uint32_t v; +} energy; float startEnergy = 0; -float convF(uint16_t in[2]) { - union { - struct { - uint16_t a; - uint16_t b; - } s; - float f; - } U; - U.s.a = in[1]; - U.s.b = in[0]; - return U.f; -} -float getVoltage() { return convF(voltage); } -float getCurrent() { return convF(current); } -float getFrequency() { return convF(frequency); } -float getPower() { return convF(power); } -float getEnergy() { return convF(energy); } -float getNewEnergy() { return convF(energy) - startEnergy; } +float getVoltage() { return (float)voltage; } +float getCurrent() { return (float)current * 0.1; } +float getCosPhi() { return (float)cosphi * 0.01; } +float getPower() { return (float)power * 0.01; } +float getEnergy() { return (float)energy.v; } +float getNewEnergy() { return ((float)energy.v) - startEnergy; } // void modbusAppBegin(Mudbus *mb) { @@ -60,11 +51,14 @@ void modbusAppBegin() { // modbusSlave = mb; - modbus_construct(&packets[VOLTAGE], 1, READ_HOLDING_REGISTERS, 0x2000, 2, voltage); - modbus_construct(&packets[FREQUENCY], 1, READ_HOLDING_REGISTERS, 0x2020, 2, frequency); - modbus_construct(&packets[CURRENT], 1, READ_HOLDING_REGISTERS, 0x2060, 2, current); - modbus_construct(&packets[POWER], 1, READ_HOLDING_REGISTERS, 0x2080, 2, power); - modbus_construct(&packets[ENERGY], 1, READ_HOLDING_REGISTERS, 0x3000, 2, energy); + + + modbus_construct(&packets[VOLTAGE], MODBUS_ADDRESS, READ_HOLDING_REGISTERS, 35, 1, &voltage); + modbus_construct(&packets[COSPHI], MODBUS_ADDRESS, READ_HOLDING_REGISTERS, 39, 1, &cosphi); + modbus_construct(&packets[CURRENT], MODBUS_ADDRESS, READ_HOLDING_REGISTERS, 36, 1, ¤t); + modbus_construct(&packets[POWER], MODBUS_ADDRESS, READ_HOLDING_REGISTERS, 37, 1, &power); + modbus_construct(&packets[ENERGY], MODBUS_ADDRESS, READ_HOLDING_REGISTERS, 27, 2, energy.in); +// modbus_construct(&packets[POWER], MODBUS_ADDRESS, READ_HOLDING_REGISTERS, 1, 1, &power); modbus_configure(&Serial2, MODBUS_BAUD, SERIAL_8N2, MODBUS_TIMEOUT, diff --git a/ModbusApp.h b/ModbusApp.h index 2960c0d..4878ac6 100644 --- a/ModbusApp.h +++ b/ModbusApp.h @@ -14,13 +14,13 @@ -const uint32_t MODBUS_BAUD = 1200; +const uint32_t MODBUS_BAUD = 9600; const uint16_t MODBUS_TIMEOUT = 10000; const uint16_t MODBUS_SCANRATE = 1000; const uint8_t MODBUS_RETRY_COUNT = 25; const uint8_t MODBUS_TX_ENABLE_PIN = 2; const uint8_t ZEROING_PIN = 3; - +const uint8_t MODBUS_ADDRESS = 1; // void modbusAppBegin(Mudbus *mb); void modbusAppBegin(); @@ -28,7 +28,7 @@ void modbusAppExec(); float getVoltage(); float getCurrent(); -float getFrequency(); +float getCosPhi(); float getPower(); float getEnergy(); float getNewEnergy(); diff --git a/SimpleModbusMaster.cpp b/SimpleModbusMaster.cpp index 61017e2..bb02781 100644 --- a/SimpleModbusMaster.cpp +++ b/SimpleModbusMaster.cpp @@ -201,12 +201,15 @@ void waiting_for_turnaround() // get the serial data from the buffer void waiting_for_reply() { + // Serial.println("A0"); if ((*ModbusPort).available()) // is there something to check? { + Serial.println("A1"); unsigned char overflowFlag = 0; buffer = 0; while ((*ModbusPort).available()) { + Serial.println("A2"); // The maximum number of bytes is limited to the serial buffer size // of BUFFER_SIZE. If more bytes is received than the BUFFER_SIZE the // overflow flag will be set and the serial buffer will be read until @@ -220,7 +223,7 @@ void waiting_for_reply() overflowFlag = 1; frame[buffer] = (*ModbusPort).read(); - // Serial.print("R: "); Serial.println(frame[buffer], 16); + Serial.print("R: "); Serial.println(frame[buffer], 16); buffer++; } // This is not 100% correct but it will suffice. @@ -504,7 +507,7 @@ void sendPacket(unsigned char bufferSize) digitalWrite(TxEnablePin, HIGH); for (unsigned char i = 0; i < bufferSize; i++) { - // Serial.print("S: "); Serial.println(frame[i],16); + Serial.print("S: "); Serial.println(frame[i],16); (*ModbusPort).write(frame[i]); } diff --git a/WiModbusGateway.cpp b/WiModbusGateway.cpp index 8dcb172..9a0a832 100644 --- a/WiModbusGateway.cpp +++ b/WiModbusGateway.cpp @@ -39,6 +39,9 @@ Metro minute = Metro(60000); Metro second = Metro(1000); uint32_t uptime; +static bool wifiEnabled = false; + + void callback(char* topic, byte* payload, unsigned int length) { // handle message arrived } @@ -78,46 +81,46 @@ void setup() { lcd.print("Starting ..."); + if (wifiEnabled) { + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + lcd.setCursor(0, 1); + lcd.print("WiFi shield not present"); + // don't continue: + while(true); + } - // check for the presence of the shield: - if (WiFi.status() == WL_NO_SHIELD) { - Serial.println("WiFi shield not present"); - lcd.setCursor(0, 1); - lcd.print("WiFi shield not present"); - // don't continue: - while(true); + int status = WL_IDLE_STATUS; + while ( status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + lcd.setCursor(0, 1); + lcd.print("Trying: "); + lcd.print(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + + // wait 10 seconds for connection: + delay(10000); + } + Serial.println("Connected."); + lcd.setCursor(0, 2); + lcd.print("Connected."); + + printWifiStatus(); + + // if (! client.connect("WiFiPowerMeter")) { + // Serial.println("MQTT broker not found"); + // lcd.home(); + // lcd.clear(); + // lcd.print("MQTT broker not found"); + // while (true); + // } else { + // lcd.print(" *"); + // } } - int status = WL_IDLE_STATUS; - while ( status != WL_CONNECTED) { - Serial.print("Attempting to connect to SSID: "); - Serial.println(ssid); - lcd.setCursor(0, 1); - lcd.print("Trying: "); - lcd.print(ssid); - // Connect to WPA/WPA2 network. Change this line if using open or WEP network: - status = WiFi.begin(ssid, pass); - - // wait 10 seconds for connection: - delay(10000); - } - Serial.println("Connected."); - lcd.setCursor(0, 2); - lcd.print("Connected."); - - printWifiStatus(); - - // if (! client.connect("WiFiPowerMeter")) { - // Serial.println("MQTT broker not found"); - // lcd.home(); - // lcd.clear(); - // lcd.print("MQTT broker not found"); - // while (true); - // } else { - // lcd.print(" *"); - // } - - delay(1000); lcd.home(); lcd.clear(); @@ -160,18 +163,20 @@ void updateDisplay() { lcd.print(days); lcd.print("/"); lcd.print(hours); lcd.print(":"); lcd.print(minutes); lcd.print(":"); lcd.print(seconds); lcd.print(" "); - long rssi = WiFi.RSSI(); - lcd.print(rssi); lcd.print(" "); - uint8_t wifiStatus = WiFi.status(); - lcd.print(wifiStatus); - lcd.print(disconnectState); + if (wifiEnabled) { + long rssi = WiFi.RSSI(); + lcd.print(rssi); lcd.print(" "); + uint8_t wifiStatus = WiFi.status(); + lcd.print(wifiStatus); + lcd.print(disconnectState); + } lcd.setCursor(0, 1); lcd.print(getVoltage()); lcd.print("V"); lcd.setCursor(10, 1); lcd.print(getCurrent()); lcd.print("A"); lcd.setCursor(0, 2); - lcd.print(getFrequency()); lcd.print("Hz"); + lcd.print(getCosPhi()); lcd.print(""); lcd.setCursor(10, 2); lcd.print(getPower()); lcd.print("W"); lcd.setCursor(0, 3); @@ -188,67 +193,61 @@ void loop() { modbusAppExec(); // Mb.Run(); - if ((disconnectState == 0) && (! client.loop())) { - disconnectState = 1; - } - - - - switch (disconnectState) { - case 0: - // Serial.println("discState 0"); - // everything fine - break; - case 1: - Serial.println("discState 1"); - client.disconnect(); - disconnectTime = millis(); - disconnectState = 2; - break; - case 2: - Serial.println("discState 3"); - if (disconnectTime + 2000 < millis()) { - disconnectState = 3; - } - break; - case 3: - Serial.println("discState 3"); - if (client.connect("WiFiPowerMeter")) { - disconnectTime = millis(); - disconnectState = 0; - } else { + if (wifiEnabled) { + if ((disconnectState == 0) && (! client.loop())) { disconnectState = 1; } - break; - default: - disconnectState = 0; - break; - } - - - - - if (minute.check() == 1) { - char strbuf[256]; - memset(strbuf, sizeof(strbuf), 0); - PString buf = PString(strbuf, sizeof(strbuf)); - buf << "{ \"metadata\": { \"device\": \"WiFiPowerMeter\" }, " << - "\"data\": {" << - "\"voltage\": " << getVoltage() << ", " << - "\"current\": " << getCurrent() << ", " << - "\"frequency\": " << getFrequency() << ", " << - "\"power\": " << getPower() << ", " << - "\"energy\": " << getEnergy() << ", " << - "\"newEnergy\": " << getNewEnergy() << ", " << - "\"uptime\": " << uptime << - "}" << - "}" << endl; - if (disconnectState == 0) { - client.publish("IoT/WiFiPowerMeter/Measurement", strbuf); + switch (disconnectState) { + case 0: + // Serial.println("discState 0"); + // everything fine + break; + case 1: + Serial.println("discState 1"); + client.disconnect(); + disconnectTime = millis(); + disconnectState = 2; + break; + case 2: + Serial.println("discState 3"); + if (disconnectTime + 2000 < millis()) { + disconnectState = 3; + } + break; + case 3: + Serial.println("discState 3"); + if (client.connect("WiFiPowerMeter")) { + disconnectTime = millis(); + disconnectState = 0; + } else { + disconnectState = 1; + } + break; + default: + disconnectState = 0; + break; } - + if (minute.check() == 1) { + char strbuf[256]; + memset(strbuf, sizeof(strbuf), 0); + PString buf = PString(strbuf, sizeof(strbuf)); + buf << "{ \"metadata\": { \"device\": \"WiFiPowerMeter\" }, " << + "\"data\": {" << + "\"voltage\": " << getVoltage() << ", " << + "\"current\": " << getCurrent() << ", " << + "\"cosphi\": " << getCosPhi() << ", " << + "\"power\": " << getPower() << ", " << + "\"energy\": " << getEnergy() << ", " << + "\"newEnergy\": " << getNewEnergy() << ", " << + "\"uptime\": " << uptime << + "}" << + "}" << endl; + if (disconnectState == 0) { + client.publish("IoT/WiFiPowerMeter/Measurement", strbuf); + } + } } if (second.check() == 1) { @@ -256,11 +255,12 @@ void loop() { Serial.println("tick"); - String msg = String("{ \"metadata\": { \"device\": \"WiFiPowerMeter\" }, \"data\": { \"uptime\": ") + uptime + String("}}"); - if (disconnectState == 0) { - client.publish("IoT/WiFiPowerMeter/Heartbeat", (char*)msg.c_str()); + if (wifiEnabled) { + String msg = String("{ \"metadata\": { \"device\": \"WiFiPowerMeter\" }, \"data\": { \"uptime\": ") + uptime + String("}}"); + if (disconnectState == 0) { + client.publish("IoT/WiFiPowerMeter/Heartbeat", (char*)msg.c_str()); + } } - } }