master
Andrew Woodlee 2 weeks ago
parent 0ce8b4e34b
commit fbbb0313b3

@ -49,8 +49,8 @@
//********* GPIO PINS ************* //
// pins for UART
#define PIN_SerialATM_RX 19 //RX pin, CHANGE IT according to your board
#define PIN_SerialATM_TX 13 //TX pin, CHANGE IT according to your board
#define PIN_SerialATM_RX 19 //RX pin for AdaFruit Huzzah32
#define PIN_SerialATM_TX 13 //TX pin for AdaFruit Huzzah32
// GPIO pins where the DS18B20 sensors are connected
const int oilTempBus = 4;
@ -60,7 +60,6 @@ const int cabinetTempBus = 9;
void messageReceived(String &topic, String &payload);
WiFiClientSecure wifiClient;
PubSubClient mqttClient;
@ -71,7 +70,6 @@ ATM90E26_UART eic(&ATMSerial);
// we are using the transformer's name to provide a unique ID
char* client_id = "al-xformer-592";
struct tempSensors {
DallasTemperature oil, cabinet;
};
@ -131,7 +129,6 @@ QueueHandle_t eicDataQueue;
// Functions for tasks
void readEICData( void * pvParameters );
void sendSensorDataOverMQTT( void * pvParameters );
// End functions for tasks
// Timer variable and function

@ -151,8 +151,8 @@ void ATM90E26_UART::InitEnergyIC() {
// Set metering calibration values
CommEnergyIC(0, CalStart, 0x5678); // Metering calibration startup command.
// Register 21 to 2B need to be set
CommEnergyIC(0, PLconstH, 0x00B9); // PL Constant MSB
CommEnergyIC(0, PLconstL, 0xC1F3); // PL Constant LSB
CommEnergyIC(0, PLconstH, 0x005A); // PL Constant MSB
CommEnergyIC(0, PLconstL, 0x9F11); // PL Constant LSB
CommEnergyIC(0, Lgain, 0x1D39); // Line calibration gain
CommEnergyIC(0, Lphi, 0x0000); // Line calibration angle
CommEnergyIC(0, PStartTh, 0x08BD); // Active Startup Power Threshold
@ -172,7 +172,7 @@ void ATM90E26_UART::InitEnergyIC() {
CommEnergyIC(
0, AdjStart,
0x5678); // Measurement calibration startup command, registers 31-3A
CommEnergyIC(0, Ugain, 0xD464); // Voltage rms gain
CommEnergyIC(0, Ugain, 0x34E2); // Voltage rms gain
CommEnergyIC(0, IgainL, 0x6E49); // L line current gain
CommEnergyIC(0, Uoffset, 0x0000); // Voltage offset
CommEnergyIC(0, IoffsetL, 0x0000); // L line current offset

@ -62,5 +62,8 @@ void loop() {
delay(10);
Serial.print("p.f.:");
Serial.println(eic.GetPowerFactor());
delay(10);
Serial.print("freq:");
Serial.println(eic.GetFrequency());
delay(1000);
}

@ -12,9 +12,9 @@ unsigned long lastMillis = 0;
void setup()
{
// set LED pins
pinMode(PIN_RED, OUTPUT);
pinMode(PIN_RED, OUTPUT);
pinMode(PIN_GREEN, OUTPUT);
pinMode(PIN_BLUE, OUTPUT);
pinMode(PIN_BLUE, OUTPUT);
// set LED to Red - FF0000
setLEDColor(255, 0, 0);
@ -22,7 +22,7 @@ void setup()
Serial.begin(9600);
// create data queue
eicDataQueue = xQueueCreate( 50, sizeof( xformerMonitorData ) );
eicDataQueue = xQueueCreate(50, sizeof(xformerMonitorData));
if (eicDataQueue == 0)
{
printf("Failed to create queue= %p\n", eicDataQueue);
@ -40,48 +40,37 @@ void setup()
#endif
// Start the DS18B20 sensors
monitorTempSensors.cabinet.begin();
monitorTempSensors.oil.begin();
// monitorTempSensors.cabinet.begin();
// monitorTempSensors.oil.begin();
// Get each DS18B20 sensors' address
monitorTempSensors.oil.getAddress(oilTempSensorAddr, 0);
monitorTempSensors.cabinet.getAddress(cabinetTempSensorAddr, 0);
// monitorTempSensors.oil.getAddress(oilTempSensorAddr, 0);
// monitorTempSensors.cabinet.getAddress(cabinetTempSensorAddr, 0);
setupMQTTClient();
setupEnergyMonitor();
// set LED color
setLEDColor(0, 0, 255);
// BaseType_t test = xTaskCreatePinnedToCore(
// sendSensorDataOverMQTT, /* Function to implement the task */
// "Send sensor data over MQTT", /* Name of the task */
// 50000, /* Stack size in words */
// NULL, /* Task input parameter */
// 0, /* Priority of the task */
// &taskSendData, /* Task handle. */
// 0); /* Core where the task should run */
// Serial.println(test);
connect();
delay(500);
BaseType_t eicTask = xTaskCreatePinnedToCore(
readEICData, /* Function to implement the task */
"Read EIC data", /* Name of the task */
20000, /* Stack size in words */
NULL, /* Task input parameter */
0, /* Priority of the task */
&taskReadEIC, /* Task handle. */
0); /* Core where the task should run */
Serial.println(eicTask);
BaseType_t eicTask = xTaskCreatePinnedToCore(
readEICData, /* Function to implement the task */
"Read EIC data", /* Name of the task */
40000, /* Stack size in words */
NULL, /* Task input parameter */
0, /* Priority of the task */
&taskReadEIC, /* Task handle. */
0); /* Core where the task should run */
}
// connect connects to the WiFi and restarts it
// TODO: set LED red when not connected, green when connected
void connect()
{
// connect to the WiFi network
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
@ -98,7 +87,6 @@ void connect()
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("Username: ");
Serial.println(mqttUser);
@ -134,8 +122,6 @@ void messageReceived(String &topic, String &payload)
void loop()
{
Serial.print("Task1 running on core ");
Serial.println(xPortGetCoreID());
delay(3000);
StaticJsonDocument<512> mqttJsonData;
JsonObject tempObj = mqttJsonData.createNestedObject("temps");
@ -146,7 +132,6 @@ void loop()
int emptySpaces = uxQueueSpacesAvailable(eicDataQueue);
for (;;)
{
if (messagesWaiting > 2)
{
xQueueReceive(eicDataQueue, &mqttSensorData, portMAX_DELAY);
@ -155,13 +140,14 @@ void loop()
if (mqttSensorData.sysStatus == 0xFFFF)
{
// Sensor is not working - set LED red
setLEDColor(255,0,0);
} else {
setLEDColor(255, 0, 0);
}
else
{
// Sensor is working - set LED green
setLEDColor(0,255,0);
setLEDColor(0, 255, 0);
}
mqttJsonData["deviceId"] = client_id;
mqttJsonData["time"] = timeBuffer;
mqttJsonData["meterStatus"] = mqttSensorData.meterStatus;
@ -173,10 +159,10 @@ void loop()
powerObj["apparent"] = mqttSensorData.power.apparent;
powerObj["factor"] = mqttSensorData.power.factor;
powerObj["reactive"] = mqttSensorData.power.reactive;
tempObj["oil"] = mqttSensorData.temps.oil;
tempObj["cabinet"] = mqttSensorData.temps.cabinet;
energyObj["export"] = mqttSensorData.energy.exp;
energyObj["import"] = mqttSensorData.energy.import;
@ -214,73 +200,109 @@ void setupEnergyMonitor()
{
// Buad rate for UART serial
// Serial config
// Serial RX pin
// Serial RX pin
// Serial TX pin
ATMSerial.begin(9600, SERIAL_8N1, PIN_SerialATM_RX, PIN_SerialATM_TX);
eic.InitEnergyIC();
delay(1000);
}
// readEICData: reads the EIC and inserts data into queue
void readEICData(void *pvParameters)
{
Serial.print("Task0 running on core ");
Serial.println(xPortGetCoreID());
vTaskDelay(2000);
// Attach interrupt for reading data every one second
readEICTimer = timerBegin(0, 80, true);
timerAttachInterrupt(readEICTimer, &ReadData, true);
timerAlarmWrite(readEICTimer, 1000000, true);
timerAlarmEnable(readEICTimer); // Just Enable
// readEICTimer = timerBegin(0, 80, true);
// timerAttachInterrupt(readEICTimer, &ReadData, true);
// timerAlarmWrite(readEICTimer, 1000000, true);
// timerAlarmEnable(readEICTimer); // Just Enable
for (;;)
{
}
}
// vTaskDelay(3000);
static int timesEnteredISR = 1;
timesEnteredISR++;
// Read temperature data every 60 seconds
// Obtain DS18B20 sensor data
if (timesEnteredISR == 60)
{
timesEnteredISR = 0;
monitorTempSensors.cabinet.requestTemperatures();
monitorTempSensors.oil.requestTemperatures();
// get cabinet temp sensor data
sensorData.temps.cabinet = monitorTempSensors.cabinet.getTempC(cabinetTempSensorAddr);
// get oil temp sensor data
sensorData.temps.oil = monitorTempSensors.oil.getTempC(oilTempSensorAddr);
}
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)
{
timesEnteredISR = 0;
monitorTempSensors.cabinet.requestTemperatures();
monitorTempSensors.oil.requestTemperatures();
// get cabinet temp sensor data
sensorData.temps.cabinet = monitorTempSensors.cabinet.getTempC(cabinetTempSensorAddr);
// get oil temp sensor data
sensorData.temps.oil = monitorTempSensors.oil.getTempC(oilTempSensorAddr);
// Get the current time and store it in a variable
time(&now);
// set {"time":"2021-05-04T13:13:04Z"}
delay(10);
sensorData.timeInfo = gmtime(&now);
// in hex
delay(10);
sensorData.meterStatus = eic.GetMeterStatus();
delay(10);
sensorData.sysStatus = eic.GetSysStatus();
delay(10);
sensorData.lineVoltage = eic.GetLineVoltage();
delay(10);
sensorData.lineCurrent = eic.GetLineCurrent();
// convert lineVoltage and lineCurrent to floats
delay(10);
sensorData.power.factor = eic.GetPowerFactor();
xQueueSend(eicDataQueue, &sensorData, portMAX_DELAY);
// Serial.println("hello from ISR");
}
// Get the current time and store it in a variable
time(&now);
// set {"time":"2021-05-04T13:13:04Z"}
sensorData.timeInfo = gmtime(&now);
// in hex
sensorData.meterStatus = eic.GetMeterStatus();
sensorData.sysStatus = eic.GetSysStatus();
sensorData.lineVoltage = eic.GetLineVoltage();
sensorData.lineCurrent = eic.GetLineCurrent();
// convert lineVoltage and lineCurrent to floats
sensorData.power.factor = eic.GetPowerFactor();
}
xQueueSend(eicDataQueue, &sensorData, portMAX_DELAY);
Serial.println("hello from ISR");
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)
// {
// // timesEnteredISR = 0;
// // monitorTempSensors.cabinet.requestTemperatures();
// // monitorTempSensors.oil.requestTemperatures();
// // // get cabinet temp sensor data
// // sensorData.temps.cabinet = monitorTempSensors.cabinet.getTempC(cabinetTempSensorAddr);
// // // get oil temp sensor data
// // sensorData.temps.oil = monitorTempSensors.oil.getTempC(oilTempSensorAddr);
// }
// // Get the current time and store it in a variable
// time(&now);
// // set {"time":"2021-05-04T13:13:04Z"}
// sensorData.timeInfo = gmtime(&now);
// // in hex
// sensorData.meterStatus = eic.GetMeterStatus();
// sensorData.sysStatus = eic.GetSysStatus();
// sensorData.lineVoltage = eic.GetLineVoltage();
// sensorData.lineCurrent = eic.GetLineCurrent();
// // convert lineVoltage and lineCurrent to floats
// sensorData.power.factor = eic.GetPowerFactor();
// xQueueSend(eicDataQueue, &sensorData, portMAX_DELAY);
// // Serial.println("hello from ISR");
}
void setLEDColor(int R, int G, int B) {
analogWrite(PIN_RED, R);
analogWrite(PIN_GREEN, G);
analogWrite(PIN_BLUE, B);
void setLEDColor(int R, int G, int B)
{
// analogWrite(PIN_RED, R);
// analogWrite(PIN_GREEN, G);
// analogWrite(PIN_BLUE, B);
}
Loading…
Cancel
Save