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
14 changes: 4 additions & 10 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: true

- name: Install Arduino CLI
uses: arduino/setup-arduino-cli@81d310742121c928ea9c8bbd407b4217b432ae02 # v2.0.0
Expand All @@ -24,20 +26,12 @@ jobs:
run: |
arduino-cli config init
arduino-cli core update-index

- name: Install required board core
run: arduino-cli core install arduino:avr@1.8.7

- name: Install libraries
run: |
arduino-cli lib install "AM2302-Sensor@1.4.0"
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 Garage_UNO ./
18 changes: 5 additions & 13 deletions .github/workflows/deployment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,12 @@ jobs:

- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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"
& "$Env:RUNNER_TOOL_CACHE\arduino-cli\arduino-cli.exe" --config-file config.yaml lib install "AM2302-Sensor@1.4.0"
& "$Env:RUNNER_TOOL_CACHE\arduino-cli\arduino-cli.exe" --config-file "$Env:RUNNER_TOOL_CACHE\arduino-cli\config.yaml" core update-index

- name: Generate configs from secrets repo
shell: powershell
Expand Down Expand Up @@ -77,7 +69,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 "$Env:RUNNER_TOOL_CACHE\arduino-cli\config.yaml" compile --profile Garage_UNO ./ --output-dir build

- name: Upload firmware to Arduino
env:
Expand All @@ -87,4 +79,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 "$Env:RUNNER_TOOL_CACHE\arduino-cli\config.yaml" upload --profile Garage_UNO --port $env:SERIAL_PORT --input-dir build
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
config.h
secret.h
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: 84 additions & 1 deletion Garage.ino
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,21 @@
#define TEMPERATURE_SENSOR_PIN 7

void MQTTMessageReceive(char* topic, uint8_t* payload, uint16_t length);
void OnBusy(uint8_t count);
void DataTimeout();

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

unsigned long doorChangeTime = 0;
int doorState = LOW;
Expand All @@ -22,14 +37,23 @@ bool doorSignal = false;
SoftwareSerial serial(RX_PIN, TX_PIN);
EspDrv espDrv(&serial);
MQTTClient mqttClient(&espDrv, MQTTMessageReceive);
MQTTConnectData mqttConnectData = { MQTTHost, 1883, "Garage", MQTTUsername, MQTTPassword, "", 0, false, "", false, 0x0 };
MQTTConnectData mqttConnectData = { MQTTHost, 1883, "Garage", MQTTUsername, MQTTPassword, "", 0, false, "", false, 0x0 };
unsigned long mqttConnectionTimeout = 0;
unsigned long mqttLastConnectionTry = 0;
unsigned long currentMillis = 0;
unsigned long temperatureHumidityReadMillis = 0;
AM2302::AM2302_Sensor am2302{ TEMPERATURE_SENSOR_PIN };
char temperatureData[10];
bool doorMoveDetected = false;
bool closeRequired = false;
DiagData currentDiagData = { 0, 0, 0, 0, 0, 0, 0, 0 };
unsigned long lastDiagSendMillis = 0;

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

void MQTTMessageReceive(char* topic, uint8_t* payload, uint16_t length)
{
Expand All @@ -39,6 +63,19 @@ void MQTTMessageReceive(char* topic, uint8_t* payload, uint16_t length)
}
}

void DataTimeout()
{
closeRequired = true;
}

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

void PublishDoorState(int state, int movement)
{
//state - HIGH (door closed), LOW (door open)
Expand Down Expand Up @@ -71,13 +108,21 @@ void Connect()
bool wifiConnected = wifiStatus == WL_CONNECTED;
if(wifiStatus == WL_DISCONNECTED || wifiStatus == WL_IDLE_STATUS)
{
if(currentDiagData.wifiReconn < 0xFFFF)
{
currentDiagData.wifiReconn++;
}
wifiConnected = espDrv.Connect(WifiSSID, WifiPassword);
}
if(wifiConnected)
{
bool isConnected = mqttClient.IsConnected();
if(!isConnected)
{
if(currentDiagData.mqttReconn < 0xFFFF)
{
currentDiagData.mqttReconn++;
}
if(mqttClient.Connect(mqttConnectData))
{
PublishDoorState(doorState, moveState);
Expand All @@ -101,7 +146,20 @@ void Connect()
}
}

void sendDiag()
{
currentDiagData.uptime = currentMillis / 60000;
currentDiagData.freeRam = freeRam();
uint8_t buffer[sizeof(DiagData)];
memcpy(buffer, &currentDiagData, sizeof(DiagData));
mqttClient.Publish(GARAGE_DIAG, buffer, sizeof(DiagData), false);
currentDiagData.loopMaxMs = 0;
currentDiagData.sensorErr = 0;
}

void setup() {
currentDiagData.resetReason = MCUSR;
MCUSR = 0;
pinMode(DOORSWITCH_PIN, INPUT_PULLUP);
pinMode(DOORBUTTON_PIN, OUTPUT);
pinMode(DOORFLASH_PIN, INPUT_PULLUP);
Expand All @@ -110,6 +168,8 @@ void setup() {
Serial.begin(57600);
serial.begin(57600);
espDrv.Init(32);
espDrv.OnBusy = OnBusy;
espDrv.DataTimeout = DataTimeout;
espDrv.Connect(WifiSSID, WifiPassword);
doorState = digitalRead(DOORSWITCH_PIN);
if (am2302.begin())
Expand All @@ -123,6 +183,11 @@ void setup() {
void loop() {
wdt_reset();
currentMillis = millis();
if(closeRequired)
{
espDrv.Close();
closeRequired = false;
}
if(!mqttClient.Loop())
{
Connect();
Expand All @@ -136,6 +201,10 @@ void loop() {
int doorValue = digitalRead(DOORSWITCH_PIN);
if(doorValue != doorState || (doorMoveDetected && moveState == HIGH) || (!doorMoveDetected && moveState == LOW))
{
if(doorState == HIGH && doorValue == LOW && currentDiagData.doorCycles < 0xFFFF)
{
currentDiagData.doorCycles++;
}
doorState = doorValue;
moveState = doorMoveDetected? LOW : HIGH;
PublishDoorState(doorState, moveState);
Expand All @@ -153,10 +222,24 @@ void loop() {
if(currentMillis - temperatureHumidityReadMillis > 60000)
{
uint8_t status = am2302.read();
if(status != AM2302::AM2302_READ_OK)
{
currentDiagData.sensorErr |= 0x01;
}
int temperature = (int)(am2302.get_Temperature() * 10);
int humidity = (int)am2302.get_Humidity();
sprintf(temperatureData, "%d;%d", temperature, humidity);
mqttClient.Publish(GARAGE_TEMPERATURE, temperatureData);
temperatureHumidityReadMillis = currentMillis;
}
if(currentMillis - lastDiagSendMillis > 900000UL)
{
sendDiag();
lastDiagSendMillis = currentMillis;
}
uint16_t loopDuration = (uint16_t)(millis() - currentMillis);
if(loopDuration > currentDiagData.loopMaxMs)
{
currentDiagData.loopMaxMs = loopDuration;
}
}
1 change: 1 addition & 0 deletions MQTTESP8266
Submodule MQTTESP8266 added at 0fc63a
9 changes: 1 addition & 8 deletions config_default.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,4 @@
#define WifiSSID "WifiSSID"
#define WifiPassword "WifiPassword"
#define MQTTUsername "MQTTUsername"

#define MQTTPassword "*MQTTPassword"

#define MQTTHost "MQTTHost"

#define GARAGE_STATE "GARAGE_STATE"
#define GARAGE_CMD "GARAGE_CMD"
#define GARAGE_TEMPERATURE "GARAGE_TEMPERATURE"
#define GARAGE_DIAG "GARAGE_DIAG"
9 changes: 9 additions & 0 deletions sketch.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
profiles:
Garage_UNO:
fqbn: arduino:avr:uno
platforms:
- platform: arduino:avr (1.8.7)
libraries:
- AM2302-Sensor (1.4.0)
- dir: MQTTESP8266
default_profile: Garage_UNO
Loading