Compare commits

...

3 Commits

Author SHA1 Message Date
Andrew Woodlee c34c62da31 fixes
3 months ago
Andrew Woodlee c8abafe9c3 fix temp sensor calls in ISR
3 months ago
Andrew Woodlee b8d05740aa more work on data queues
3 months ago

@ -5,7 +5,7 @@ wifi:
# Your WiFi SSID
ssid: "Your-WiFi-SSID"
# Your WiFi Password
passwd: Your-Secret-WiFi-Password
password: "Your-Secret-WiFi-Password"
mqtt:
# Your MQTT server
server: your.mqtt-broker.tld

@ -85,42 +85,36 @@ ATM90E36_IC SetupEic(ctLine, ic);
String client_id = "xformermon-";
// GPIO where the DS18B20 is connected to
const int oilTempBus = 4;
const int cabinetTempBus = 9;
const int tempBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire cabinetTempBusOneWire(cabinetTempBus);
OneWire oilTempBusOneWire(oilTempBus);
OneWire tempBusOneWire(tempBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature cabinetTemp(&cabinetTempBusOneWire);
DallasTemperature oilTemp(&oilTempBusOneWire);
DallasTemperature tempSensors(&tempBusOneWire);
struct tempSensors { // Structure declaration
DallasTemperature cabinet; // Cabinet Temp (DallasTemperature variable)
DallasTemperature oil; // Oil Temp (DallasTemperature variable)
};
tempSensors monitorTempSensors{cabinetTemp, oilTemp};
StaticJsonDocument<256> dataStore[60];
time_t now;
// Data structs for queue
struct tempData {
float cabinetTemp, oilTemp;
};
struct powerData {
float activePower, passivePower;
};
struct xformerMonitorData {
unsigned short SysStatus, meterStatus;
double activeCurrent, passiveCurrent, lineCurrent, lineVoltage,
activePower, passivePower, importEnergy, exportEnergy;
tm *timeInfo;
tempData temps;
powerData power;
};
// End data structs for queue
// Global to be used in ISR
xformerMonitorData sensorData;
@ -137,27 +131,14 @@ QueueHandle_t eicDataQueue;
void readEICData( void * pvParameters );
void sendSensorDataOverMQTT( void * pvParameters );
void IRAM_ATTR ReadData(){
// Get the current time and store it in a variable
time(&now);
sensorData.timeInfo = gmtime(&now);
// Obtain DS18B20 sensor data
monitorTempSensors.cabinet.requestTemperatures();
monitorTempSensors.oil.requestTemperatures();
// Get temp data in Celsius and Fahrenheit
float cabinetTemperatureC = monitorTempSensors.cabinet.getTempCByIndex(0);
float cabinetTemperatureF = monitorTempSensors.cabinet.getTempFByIndex(0);
// set {"time":"2021-05-04T13:13:04Z"}
sensorData.lineVoltage = eic.GetLineVoltage();
sensorData.temps.cabinetTemp = monitorTempSensors.cabinet.getTempCByIndex(0);
sensorData.temps.oilTemp = monitorTempSensors.oil.getTempCByIndex(0);
xQueueSend(eicDataQueue, &sensorData, portMAX_DELAY);
}
void IRAM_ATTR ReadData();
struct xformerMonConfigData {
char *wifiSsid;
char *wifiPass;
char *mqttName;
char *mqttServerHost;
char *mqttUserName;
char *mqttPassword;
uint16_t mqttServerPort;
} monitorConfig;

@ -54,8 +54,67 @@ void ATM90E36_IC::begin(){
ap = eic->GetActivePowerB();
break;
case 'C':
ap = this->eic->GetActivePowerC();
ap = eic->GetActivePowerC();
break;
}
return ap;
}
double ATM90E36_IC::GetVHarm()
{
double vh;
switch (ctLine)
{
case 'A':
vh = eic->GetVHarmA();
break;
case 'B':
vh = eic->GetVHarmB();
break;
case 'C':
vh = eic->GetVHarmC();
break;
}
return vh;
}
double ATM90E36_IC::GetCHarm()
{
double ch;
switch (ctLine)
{
case 'A':
ch = eic->GetVHarmA();
break;
case 'B':
ch = eic->GetVHarmB();
break;
case 'C':
ch = eic->GetVHarmC();
break;
}
return ch;
}
double ATM90E36_IC::GetPowerFactor()
{
double pf;
switch (ctLine)
{
case 'A':
pf = eic->GetPowerFactorA();
break;
case 'B':
pf = eic->GetPowerFactorB();
break;
case 'C':
pf = eic->GetPowerFactorC();
break;
}
return pf;
}
double ATM90E36_IC::GetApparentPower()
{
return eic->GetTotalApparentPower();
}

@ -12,9 +12,20 @@ public:
ATM90E36_IC(const char ctLineLetter, ATM90E36 ic);
void begin();
double GetLineVoltage();
double GetActivePower();
double GetSysStatus();
double GetPassivePower();
double GetLineCurrent();
double GetLineCurrentN();
double GetApparentPower();
double GetPowerFactor();
double GetVHarm();
double GetCHarm();
};

@ -7,6 +7,9 @@
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[platformio]
default_envs = store-creds, dev
[env]
platform = espressif32
@ -25,7 +28,11 @@ lib_deps =
bblanchon/ArduinoJson @ ^6.21.3
paulstoffregen/OneWire@^2.3.8
milesburton/DallasTemperature@^3.11.0
build_src_filter = +<*> -<.git/> -<.svn/> -<tests/>
build_src_filter = +<transformerMonitor.cpp> -<.git/> -<.svn/> -<tests/>
[env:store-creds]
build_flags = -D DEV ${env.build_flags}
build_src_filter = -<*> +<store-config.cpp> -<.git/> -<.svn/> -<tests/>
[env:dev-ATM90E36]
build_flags = -D DEV ${env.build_flags}

@ -0,0 +1,70 @@
#include <Preferences.h>
struct xformerMonConfigData {
char *wifiSsid;
char *wifiPass;
char *mqttName;
char *mqttServerHost;
char *mqttUserName;
char *mqttPassword;
uint16_t mqttServerPort;
};
// Turn build flags (Macros) into strings
#define ST(A) #A
#define STR(A) ST(A)
// extract the WiFi SSID from its macro
#ifdef TM_WIFI_SSID
char *wifiSsid = STR(TM_WIFI_SSID);
#endif
// extract the WiFi Password from its macro
#ifdef TM_WIFI_PASSWD
char *wifiPassword = STR(TM_WIFI_PASSWD);
#endif
// extract the MQTT Port from its macro
#ifdef TM_MQTT_PORT
uint16_t mqttPort = (uint16_t) strtoul(STR(TM_MQTT_PORT), NULL, 10);
#endif
// extract the MQTT server hostname from its macro
#ifdef TM_MQTT_SVR
char *mqttServer = STR(TM_MQTT_SVR);
#endif
// extract the MQTT username from its macro
#ifdef TM_MQTT_USER
char *mqttUser = STR(TM_MQTT_USER);
#endif
// extract the MQTT password from its macro
#ifdef TM_MQTT_PASSWD
char *mqttPass = STR(TM_MQTT_PASSWD);
#endif
Preferences preferences;
Preferences mqttPreferences;
xformerMonConfigData monitorConfig;
void setup() {
Serial.begin(115200);
Serial.println();
monitorConfig.wifiSsid = wifiSsid;
preferences.begin("wifi", false);
mqttPreferences.begin("mqtt", false);
preferences.putBytes("config", &monitorConfig, sizeof(monitorConfig));
preferences.putString("password", wifiPassword);
Serial.println("Network Credentials Saved using Preferences");
preferences.end();
}
void loop() {
}

@ -17,8 +17,9 @@ void setupEnergyMonitor();
// const char* test_client_cert = ""; //to verify the client
void setup()
{
eicDataQueue = xQueueCreate( 50, sizeof( xformerMonitorData ) );
eicDataQueue = xQueueCreate( 50, sizeof( xformerMonitorData ) );
// configure time
// TODO: make dst and timezone configurable
int timezone = 3;
@ -41,7 +42,7 @@ void setup()
xTaskCreatePinnedToCore(
readEICData, /* Function to implement the task */
"Task1", /* Name of the task */
"Read EIC data", /* Name of the task */
10000, /* Stack size in words */
NULL, /* Task input parameter */
0, /* Priority of the task */
@ -50,7 +51,7 @@ void setup()
xTaskCreatePinnedToCore(
sendSensorDataOverMQTT, /* Function to implement the task */
"Task1", /* Name of the task */
"Send sensor data over MQTT", /* Name of the task */
10000, /* Stack size in words */
NULL, /* Task input parameter */
0, /* Priority of the task */
@ -160,7 +161,7 @@ void readEICData(void *pvParameters)
Serial.print("Task1 running on core ");
Serial.println(xPortGetCoreID());
// Attach interrupt
// Attach interrupt for reading data every one second
readEICTimer = timerBegin(0, 80, true);
timerAttachInterrupt(readEICTimer, &ReadData, true);
timerAlarmWrite(readEICTimer, 1000000, true);
@ -176,14 +177,21 @@ void sendSensorDataOverMQTT(void *pvParameters)
{
Serial.print("Task1 running on core ");
Serial.println(xPortGetCoreID());
StaticJsonDocument<512> eicJsonData;
JsonObject temp = eicJsonData.createNestedObject("temps");
xformerMonitorData sensorData;
StaticJsonDocument<512> mqttJsonData;
JsonObject tempObj = mqttJsonData.createNestedObject("temps");
JsonObject powerObj = mqttJsonData.createNestedObject("power");
xformerMonitorData mqttSensorData;
int messagesWaiting = uxQueueMessagesWaiting(eicDataQueue);
int emptySpaces = uxQueueSpacesAvailable(eicDataQueue);
for (;;)
{
xQueueReceive(eicDataQueue, &mqttSensorData, portMAX_DELAY);
char timeBuffer[32];
strftime(timeBuffer, sizeof(timeBuffer), "%FT%TZ", sensorData.timeInfo);
strftime(timeBuffer, sizeof(timeBuffer), "%FT%TZ", mqttSensorData.timeInfo);
powerObj["active"] = eic.GetActivePower();
powerObj["apparent"] = eic.GetApparentPower();
lastMillis = millis();
@ -194,5 +202,38 @@ void sendSensorDataOverMQTT(void *pvParameters)
{
connect();
}
messagesWaiting = uxQueueMessagesWaiting(eicDataQueue);
emptySpaces = uxQueueMessagesWaiting(eicDataQueue);
}
}
void IRAM_ATTR ReadData(){
// Count the number of times the ISR has been entered
static int timesEnteredISR = 1;
timesEnteredISR++;
// Read temperature data every 60 seconds
// Obtain DS18B20 sensor data
if (timesEnteredISR == 60)
{
// TODO: find and hard-code addresses of sensors
tempSensors.requestTemperatures();
// get cabinet temp sensor data
// sensorData.temps.cabinetTemp = tempSensors.getTempC();
// get oil temp sensor data
// sensorData.temps.oilTemp = tempSensors.getTempC();
}
// Get the current time and store it in a variable
time(&now);
// set {"time":"2021-05-04T13:13:04Z"}
sensorData.timeInfo = gmtime(&now);
sensorData.lineVoltage = eic.GetLineVoltage();
xQueueSend(eicDataQueue, &sensorData, portMAX_DELAY);
}
Loading…
Cancel
Save