Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: true

- name: Install Arduino CLI
uses: arduino/setup-arduino-cli@81d310742121c928ea9c8bbd407b4217b432ae02 # v2.0.0
Expand All @@ -22,18 +24,11 @@ jobs:
arduino-cli config init
arduino-cli core update-index

- name: Install required board core
run: arduino-cli core install arduino:avr@1.8.7 # např. pro Arduino Uno

- name: Install custom library
run: |
arduino-cli lib install "MQTTESP8266@5.1.2"

- name: Set configs
run: |
cp config_default.h config.h
cp secret_default.h secret.h

- name: Compile Arduino project
run: |
arduino-cli compile --fqbn arduino:avr:uno ./
arduino-cli compile --profile LSSensor_Uno ./
15 changes: 4 additions & 11 deletions .github/workflows/deployment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,13 @@ jobs:

- name: Checkout repository
uses: actions/checkout@v6
with:
submodules: true

- name: Initialize Arduino CLI
run: |
& "$Env:RUNNER_TOOL_CACHE\arduino-cli\arduino-cli.exe" --config-file config.yaml core update-index

- name: Install required board core
run: |
& "$Env:RUNNER_TOOL_CACHE\arduino-cli\arduino-cli.exe" --config-file config.yaml core install arduino:avr@1.8.7

- name: Install custom Arduino libraries (Windows)
shell: powershell
run: |
& "$Env:RUNNER_TOOL_CACHE\arduino-cli\arduino-cli.exe" --config-file config.yaml lib install "MQTTESP8266@5.1.2"

- name: Set configs (Windows)
shell: powershell
env:
Expand Down Expand Up @@ -72,7 +65,7 @@ jobs:

- name: Compile Arduino project
run: |
& "$Env:RUNNER_TOOL_CACHE\arduino-cli\arduino-cli.exe" --config-file config.yaml compile --fqbn arduino:avr:uno ./ --output-dir build
& "$Env:RUNNER_TOOL_CACHE\arduino-cli\arduino-cli.exe" --config-file config.yaml compile --profile LSSensor_Uno ./ --output-dir build

- name: Upload firmware to Arduino
env:
Expand All @@ -82,4 +75,4 @@ jobs:
Write-Error "Invalid serial port format: $env:SERIAL_PORT"
exit 1
}
& "$Env:RUNNER_TOOL_CACHE\arduino-cli\arduino-cli.exe" --config-file config.yaml upload --fqbn arduino:avr:uno --port $env:SERIAL_PORT --input-dir build
& "$Env:RUNNER_TOOL_CACHE\arduino-cli\arduino-cli.exe" --config-file config.yaml upload --profile LSSensor_Uno --port $env:SERIAL_PORT --input-dir build
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[submodule "MQTTESP8266"]
path = MQTTESP8266
url = https://github.com/Zefek/MQTTESP8266.git
branch = 6.0
85 changes: 72 additions & 13 deletions LSSensor.ino
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,43 @@
#include <avr/wdt.h>

#define LSSensorPIN1 2
#define LSSensorPIN2 3
#define SENDINTERVAL 5 * 60 * 1000 //5 minut

void MQTTMessageReceive(char* topic, uint8_t* payload, uint16_t length) { }
void OnBusy(uint8_t count);
void DataTimeout();
MQTTConnectData mqttConnectData = { MQTTHost, 1883, "WattMeter", MQTTUsername, MQTTPassword, "", 0, false, "", false, 0x0F };

SoftwareSerial serial(4, 5);
EspDrv espDrv(&serial);
MQTTClient mqttClient(&espDrv, MQTTMessageReceive);
char data[32];

int wattMetter1Counter = 0;
int wattMetter2Counter = 0;
unsigned long lastSendToMQTT = 0;

unsigned long lastTime = 0;
bool closeRequired = false;

#pragma pack(push, 1)
struct DiagData {
uint32_t uptime;
uint16_t freeRam;
uint16_t wifiReconn;
uint16_t mqttFailCount;
uint8_t resetReason;
uint16_t loopMaxMs;
};
#pragma pack(pop)

DiagData currentDiagData;

extern int __heap_start, *__brkval;
int freeRam() {
int v;
return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
}

void WattMetter1Received()
{
unsigned long time = millis();
Expand Down Expand Up @@ -49,14 +71,20 @@ bool Connect()
if(wifiStatus == WL_DISCONNECTED || wifiStatus == WL_IDLE_STATUS)
{
wifiConnected = espDrv.Connect(WifiSSID, WifiPassword);
if(currentDiagData.wifiReconn < 65535)
{
currentDiagData.wifiReconn++;
}
}
if(wifiConnected)
{

bool isConnected = mqttClient.IsConnected();
if(!isConnected)
{
return mqttClient.Connect(mqttConnectData);
bool ok = mqttClient.Connect(mqttConnectData);
if(!ok && currentDiagData.mqttFailCount < 65535) currentDiagData.mqttFailCount++;
return ok;
}
else
{
Expand All @@ -66,41 +94,72 @@ bool Connect()
return false;
}

void DataTimeout()
{
closeRequired = true;
}
void OnBusy(uint8_t count)
{
if(count > 10)
{
closeRequired = true;
}
}

void setup() {
currentDiagData.resetReason = MCUSR;
MCUSR = 0;
// put your setup code here, to run once:
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(LSSensorPIN1, INPUT);
pinMode(LSSensorPIN2, INPUT);
Serial.begin(57600);
serial.begin(57600);
espDrv.Init(16);
espDrv.OnBusy = OnBusy;
espDrv.DataTimeout = DataTimeout;
espDrv.Connect(WifiSSID, WifiPassword);
attachInterrupt(digitalPinToInterrupt(2), WattMetter1Received, RISING);
attachInterrupt(digitalPinToInterrupt(3), WattMetter2Received, RISING);
attachInterrupt(digitalPinToInterrupt(LSSensorPIN1), WattMetter1Received, RISING);
attachInterrupt(digitalPinToInterrupt(LSSensorPIN2), WattMetter2Received, RISING);
Serial.println("Setup OK");
wdt_enable(WDTO_8S);
}

void loop() {
unsigned long currentMillis = millis();
wdt_reset();
if(closeRequired)
{
espDrv.Close();
closeRequired = false;
}
mqttClient.Loop();
unsigned long currentMillis = millis();
if(currentMillis - lastSendToMQTT >= 300000)
{
detachInterrupt(digitalPinToInterrupt(2));
detachInterrupt(digitalPinToInterrupt(3));
detachInterrupt(digitalPinToInterrupt(LSSensorPIN1));
detachInterrupt(digitalPinToInterrupt(LSSensorPIN2));
if(Connect())
{
sprintf(data, "{\"V\":%d,\"S\":%d}", 0, 0);
mqttClient.Publish(ELCONSUMPTION, data);
sprintf(data, "{\"V\":%d,\"S\":%d}", wattMetter1Counter, wattMetter2Counter);
mqttClient.Publish(ELCONSUMPTION, data);
mqttClient.Disconnect();

wattMetter1Counter = 0;
wattMetter2Counter = 0;

currentDiagData.uptime = currentMillis / 60000UL;
currentDiagData.freeRam = freeRam();
mqttClient.Publish(LSSENSOR_DIAG, (const uint8_t*)&currentDiagData, sizeof(DiagData), false);
currentDiagData.loopMaxMs = 0;
mqttClient.Disconnect();
}
lastSendToMQTT = currentMillis;
attachInterrupt(digitalPinToInterrupt(2), WattMetter1Received, RISING);
attachInterrupt(digitalPinToInterrupt(3), WattMetter2Received, RISING);
attachInterrupt(digitalPinToInterrupt(LSSensorPIN1), WattMetter1Received, RISING);
attachInterrupt(digitalPinToInterrupt(LSSensorPIN2), WattMetter2Received, RISING);
}
unsigned long iterDur = millis() - currentMillis;
if(iterDur > currentDiagData.loopMaxMs)
{
currentDiagData.loopMaxMs = (iterDur > 65535UL) ? 65535 : (uint16_t)iterDur;
}
}
1 change: 1 addition & 0 deletions MQTTESP8266
Submodule MQTTESP8266 added at 0fc63a
1 change: 1 addition & 0 deletions config_default.h
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
#define ELCONSUMPTION "ELCONSUMPTION"
#define LSSENSOR_DIAG "LSSENSOR_DIAG"
8 changes: 8 additions & 0 deletions sketch.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
profiles:
LSSensor_Uno:
fqbn: arduino:avr:uno
platforms:
- platform: arduino:avr (1.8.7)
libraries:
- dir: MQTTESP8266
default_profile: LSSensor_Uno
Loading