mirror of
https://github.com/ckaczor/HomeMonitor.git
synced 2026-01-14 09:59:13 -05:00
162 lines
3.3 KiB
C++
162 lines
3.3 KiB
C++
#include <WiFiNINA.h>
|
|
#include <ArduinoMqttClient.h>
|
|
|
|
#include "arduino_secrets.h"
|
|
|
|
char ssid[] = SECRET_SSID;
|
|
char pass[] = SECRET_PASS;
|
|
|
|
WiFiClient wifiClient;
|
|
MqttClient mqttClient(wifiClient);
|
|
|
|
const char broker[] = "172.23.10.3";
|
|
int port = 1883;
|
|
|
|
const long interval = 500; // Interval for sending messages (milliseconds)
|
|
unsigned long previousMilliseconds = 0;
|
|
|
|
int washerPin = 0;
|
|
int dryerPin = 1;
|
|
|
|
int lastWasherValue = -1;
|
|
int lastDryerValue = -1;
|
|
|
|
const char washerTopic[] = "washer";
|
|
const char dryerTopic[] = "dryer";
|
|
|
|
void connectNetwork() {
|
|
Serial.print("Attempting to connect to WPA SSID: ");
|
|
Serial.println(ssid);
|
|
|
|
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
|
|
Serial.print(".");
|
|
delay(5000);
|
|
}
|
|
|
|
Serial.println("Connected to the network");
|
|
Serial.println();
|
|
}
|
|
|
|
bool checkNetwork() {
|
|
if (WiFi.status() != WL_CONNECTED) {
|
|
WiFi.disconnect();
|
|
|
|
Serial.print("Attempting to reconnect to WPA SSID: ");
|
|
Serial.println(ssid);
|
|
|
|
if (!WiFi.begin(ssid, pass) != WL_CONNECTED) {
|
|
Serial.println("Network reconnection failed");
|
|
return false;
|
|
}
|
|
|
|
Serial.println("Network reconnected");
|
|
return true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void connectBroker() {
|
|
Serial.print("Attempting to connect to the MQTT broker: ");
|
|
Serial.println(broker);
|
|
|
|
while (!mqttClient.connect(broker, port)) {
|
|
Serial.print(".");
|
|
delay(5000);
|
|
}
|
|
|
|
Serial.print("Connected to the MQTT broker: ");
|
|
Serial.println(broker);
|
|
}
|
|
|
|
bool checkBroker() {
|
|
if (!mqttClient.connected()) {
|
|
Serial.print("Attempting to reconnect to the MQTT broker: ");
|
|
Serial.println(broker);
|
|
|
|
if (!mqttClient.connect(broker, port)) {
|
|
Serial.println("Broker reconnection failed");
|
|
return false;
|
|
}
|
|
|
|
Serial.println("Broker reconnected");
|
|
|
|
outputValue(washerTopic, lastWasherValue);
|
|
outputValue(dryerTopic, lastDryerValue);
|
|
|
|
return true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void setupDevices() {
|
|
pinMode(washerPin, INPUT_PULLUP);
|
|
pinMode(dryerPin, INPUT_PULLUP);
|
|
|
|
lastWasherValue = digitalRead(washerPin);
|
|
lastDryerValue = digitalRead(dryerPin);
|
|
|
|
outputValue(washerTopic, lastWasherValue);
|
|
outputValue(dryerTopic, lastDryerValue);
|
|
}
|
|
|
|
void outputValue(char topic[], int value) {
|
|
Serial.print("Sending message to topic: ");
|
|
Serial.print(topic);
|
|
Serial.print(" ");
|
|
Serial.println(value == 1 ? 0 : 1);
|
|
|
|
mqttClient.beginMessage(topic);
|
|
mqttClient.print(value == 1 ? 0 : 1);
|
|
mqttClient.endMessage();
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(9600);
|
|
|
|
while (!Serial) {
|
|
; // wait for serial port to connect. Needed for native USB port only
|
|
}
|
|
|
|
connectNetwork();
|
|
connectBroker();
|
|
|
|
setupDevices();
|
|
|
|
Serial.println();
|
|
}
|
|
|
|
void loop() {
|
|
mqttClient.poll();
|
|
|
|
unsigned long currentMilliseconds = millis();
|
|
|
|
if (currentMilliseconds - previousMilliseconds >= interval) {
|
|
previousMilliseconds = currentMilliseconds;
|
|
|
|
if (!checkNetwork()) {
|
|
return;
|
|
}
|
|
|
|
if (!checkBroker()) {
|
|
return;
|
|
}
|
|
|
|
int washerValue = digitalRead(washerPin);
|
|
|
|
if (washerValue != lastWasherValue) {
|
|
lastWasherValue = washerValue;
|
|
|
|
outputValue(washerTopic, washerValue);
|
|
}
|
|
|
|
int dryerValue = digitalRead(dryerPin);
|
|
|
|
if (dryerValue != lastDryerValue) {
|
|
lastDryerValue = dryerValue;
|
|
|
|
outputValue(dryerTopic, dryerValue);
|
|
}
|
|
}
|
|
} |