From 30dda4427d70d350d8e1df0a0550ff9a34cc4e10 Mon Sep 17 00:00:00 2001 From: Sam Rolfe Date: Fri, 25 Sep 2026 20:39:35 +1000 Subject: [PATCH] Initial commit (secrets isolated) --- .gitignore | 8 +++ LoraMqttWatering.ino | 116 +++++++++++++++++++++++++++++++++++++++++++ secrets.h.example | 9 ++++ 3 files changed, 133 insertions(+) create mode 100644 .gitignore create mode 100755 LoraMqttWatering.ino create mode 100644 secrets.h.example diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d7f308a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +secrets.h +.pio/ +build/ +.vscode/ +.idea/ +*.bin +*.elf +*.hex diff --git a/LoraMqttWatering.ino b/LoraMqttWatering.ino new file mode 100755 index 0000000..2fb5dfd --- /dev/null +++ b/LoraMqttWatering.ino @@ -0,0 +1,116 @@ +#include "secrets.h" +#include +#include +#include + +// WiFi Credentials +const char* ssid = SECRET_WIFI_SSID; +const char* password = SECRET_WIFI_PASS; + +// MQTT Broker +const char* mqtt_server = "192.168.20.30"; +const char* mqtt_user = SECRET_MQTT_USER; +const char* password = SECRET_WIFI_PASS; + +// MQTT Topics +const char* mqtt_topic = "homeassistant/ESP32/control"; + +WiFiClient espClient; +PubSubClient client(espClient); + +// Define different Serial port for LoRa communication +#define LORA_UART Serial2 +#define LORA_TX_PIN 17 // GPIO17 for TX +#define LORA_RX_PIN 16 // GPIO16 for RX + +void setup_wifi() { + delay(10); + Serial.println(); + Serial.print("Connecting to "); + Serial.println(ssid); + + WiFi.begin(ssid, password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + + Serial.println(""); + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); +} + +void callback(char* topic, byte* message, unsigned int length) { + Serial.print("Message arrived on topic: "); + Serial.print(topic); + Serial.print(". Message: "); + String messageTemp; + + for (int i = 0; i < length; i++) { + Serial.print((char)message[i]); + messageTemp += (char)message[i]; + } + Serial.println(); + + // Handle incoming MQTT messages and send via LoRa + if (String(topic) == mqtt_topic) { + LORA_UART.print(messageTemp); + Serial.println("Sent via LoRa: " + messageTemp); + } +} + +void reconnect() { + while (!client.connected()) { + Serial.print("Attempting MQTT connection..."); + if (client.connect("ESP32Client", mqtt_user, mqtt_password)) { + Serial.println("connected"); + client.subscribe(mqtt_topic); + } else { + Serial.print("failed, rc="); + Serial.print(client.state()); + Serial.println(" try again in 5 seconds"); + delay(5000); + } + } +} + +void setup() { + Serial.begin(115200); // Main serial for debugging + LORA_UART.begin(9600, SERIAL_8N1, LORA_RX_PIN, LORA_TX_PIN); // Initialize UART for LoRa + + if (LORA_UART) { + Serial.println("LoRa Transmitter Initialized"); + } else { + Serial.println("LoRa Transmitter Initialization Failed"); + } + + setup_wifi(); + client.setServer(mqtt_server, 1883); + client.setCallback(callback); +} + +void loop() { + if (!client.connected()) { + reconnect(); + } + client.loop(); + + // Check for Serial Monitor command + if (Serial.available()) { + String command = Serial.readStringUntil('\n'); + command.trim(); // Remove any extra whitespace + + if (command == "restart") { + Serial.println("Restarting Transmitter..."); + delay(1000); // Give time for message to print + ESP.restart(); + } else { + LORA_UART.print(command); + Serial.println("Sent via LoRa: " + command); + } + } + + delay(1000); // Add a delay to avoid watchdog timer reset +} diff --git a/secrets.h.example b/secrets.h.example new file mode 100644 index 0000000..5ff32d1 --- /dev/null +++ b/secrets.h.example @@ -0,0 +1,9 @@ +#ifndef SECRETS_H +#define SECRETS_H + +#define SECRET_WIFI_SSID "YOUR_WIFI_SSID" +#define SECRET_WIFI_PASS "YOUR_WIFI_PASSWORD" +#define SECRET_MQTT_USER "YOUR_MQTT_USERNAME" +#define SECRET_MQTT_PASS "YOUR_MQTT_PASSWORD" + +#endif