arduino-sketches

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 15  →  ?path2? @ 17
/arduinoPinToggle/arduinoPinToggle.ino
@@ -1,7 +1,9 @@
/*************************************************************************/
/* Copyright (C) 2022 Wizardry and Steamworks - License: GNU GPLv3 */
/* Copyright (C) 2023 Wizardry and Steamworks - License: GNU GPLv3 */
/*************************************************************************/
 
// Removing comment for debugging over the first serial port.
// #define DEBUG 1
// The AP to connect to via Wifi.
#define STA_SSID ""
// The AP Wifi password.
@@ -29,7 +31,7 @@
#if defined(ARDUINO_ARCH_ESP8266)
#define GET_CHIP_ID() (ESP.getChipId())
#elif defined(ARDUINO_ARCH_ESP32)
#define GET_CHIP_ID() ((uint16_t)(ESP.getEfuseMac()>>32))
#define GET_CHIP_ID() ((uint16_t)(ESP.getEfuseMac() >> 32))
#endif
 
// Miscellaneous defines.
@@ -54,15 +56,6 @@
#include <SPIFFS.h>
#endif
 
const char *sta_ssid = STA_SSID;
const char *sta_psk = STA_PSK;
const char *mqtt_host = MQTT_HOST;
const char *mqtt_username = MQTT_USERNAME;
const char *mqtt_password = MQTT_PASSWORD;
const int mqtt_port = MQTT_PORT;
const char *ota_password = OTA_PASSWORD;
const int ota_port = OTA_PORT;
 
WiFiClient espClient;
PubSubClient mqttClient(espClient);
 
@@ -73,8 +66,7 @@
int PINS[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 21, 22,
23, 25, 26, 27, 32, 33, 34, 35, 36, 37,
38, 39
};
38, 39 };
#endif
 
String mqttSerialize(StaticJsonDocument<256> msg) {
@@ -88,14 +80,20 @@
// payload is not null terminated and casting will not work
char msgPayload[length + 1];
snprintf(msgPayload, length + 1, "%s", payload);
#ifdef DEBUG
Serial.println("Message received on topic: " + String(topic) + " with payload: " + String(msgPayload));
#endif
 
// Parse the payload sent to the MQTT topic as a JSON document.
StaticJsonDocument<256> doc;
#ifdef DEBUG
Serial.println("Deserializing message....");
#endif
DeserializationError error = deserializeJson(doc, msgPayload);
if (error) {
#ifdef DEBUG
Serial.println("Failed to parse MQTT payload as JSON: " + String(error.c_str()));
#endif
return;
}
 
@@ -105,79 +103,94 @@
}
 
String action = (const char *)doc["action"];
if(action == "set") {
String state = (const char *)doc["state"];
const int pin = (const int)doc["pin"];
if (action == "set") {
String state = (const char *)doc["state"];
const int pin = (const int)doc["pin"];
#ifdef DEBUG
Serial.println("Setting pin: " + String(pin) + " to state: " + String(state));
#endif
pinMode(PINS[pin], OUTPUT);
 
Serial.println("Setting pin: " + String(pin) + " to state: " + String(state));
 
pinMode(PINS[pin], OUTPUT);
 
if (state == "on") {
digitalWrite(PINS[pin], HIGH);
int status = digitalRead(PINS[pin]);
Serial.println("Pin " + String(pin) + " state is now: " + String(status));
return;
}
 
digitalWrite(PINS[pin], LOW);
if (state == "on") {
digitalWrite(PINS[pin], HIGH);
int status = digitalRead(PINS[pin]);
#ifdef DEBUG
Serial.println("Pin " + String(pin) + " state is now: " + String(status));
#endif
return;
}
 
digitalWrite(PINS[pin], LOW);
int status = digitalRead(PINS[pin]);
#ifdef DEBUG
Serial.println("Pin " + String(pin) + " state is now: " + String(status));
#endif
return;
}
 
if(action == "get") {
const int pin = (const int)doc["pin"];
if (action == "get") {
const int pin = (const int)doc["pin"];
#ifdef DEBUG
Serial.println("Getting pin: " + String(pin) + " state.");
#endif
int status = digitalRead(PINS[pin]);
#ifdef DEBUG
Serial.println("Pin " + String(pin) + " state is now: " + String(status));
#endif
// Announce the action.
StaticJsonDocument<256> msg;
msg["pin"] = pin;
switch (status) {
case 1:
msg["state"] = "on";
break;
case 0:
msg["state"] = "off";
break;
default:
msg["state"] = "unknown";
break;
}
 
Serial.println("Getting pin: " + String(pin) + " state.");
 
int status = digitalRead(PINS[pin]);
Serial.println("Pin " + String(pin) + " state is now: " + String(status));
 
// Announce the action.
StaticJsonDocument<256> msg;
msg["pin"] = pin;
switch(status) {
case 1:
msg["state"] = "on";
break;
case 0:
msg["state"] = "off";
break;
default:
msg["state"] = "unknown";
break;
}
 
mqttClient.publish(MQTT_TOPIC().c_str(), mqttSerialize(msg).c_str());
return;
mqttClient.publish(MQTT_TOPIC().c_str(), mqttSerialize(msg).c_str());
return;
}
}
 
bool mqttConnect() {
Serial.println("Attempting to connect to MQTT broker: " + String(mqtt_host));
mqttClient.setServer(mqtt_host, mqtt_port);
#ifdef DEBUG
Serial.println("Attempting to connect to MQTT broker: " + String(MQTT_HOST));
#endif
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
 
StaticJsonDocument<256> msg;
if (mqttClient.connect(MQTT_CLIENT_ID().c_str(), mqtt_username, mqtt_password)) {
if (mqttClient.connect(MQTT_CLIENT_ID().c_str(), MQTT_USERNAME, MQTT_PASSWORD)) {
#ifdef DEBUG
Serial.println("Established connection with MQTT broker using client ID: " + MQTT_CLIENT_ID());
#endif
mqttClient.setCallback(mqttCallback);
msg["action"] = "connected";
mqttClient.publish(MQTT_TOPIC().c_str(), mqttSerialize(msg).c_str());
#ifdef DEBUG
Serial.println("Attempting to subscribe to MQTT topic: " + MQTT_TOPIC());
#endif
if (!mqttClient.subscribe(MQTT_TOPIC().c_str())) {
#ifdef DEBUG
Serial.println("Failed to subscribe to MQTT topic: " + MQTT_TOPIC());
#endif
return false;
}
#ifdef DEBUG
Serial.println("Subscribed to MQTT topic: " + MQTT_TOPIC());
#endif
msg.clear();
msg["action"] = "subscribed";
mqttClient.publish(MQTT_TOPIC().c_str(), mqttSerialize(msg).c_str());
return true;
}
#ifdef DEBUG
Serial.println("Connection to MQTT broker failed with MQTT client state: " + String(mqttClient.state()));
 
#endif
return false;
}
 
@@ -199,7 +212,9 @@
 
void setup() {
Serial.begin(115200);
#ifdef DEBUG
Serial.println("Booted, setting up Wifi in 10s...");
#endif
delay(10000);
 
WiFi.mode(WIFI_STA);
@@ -208,32 +223,38 @@
#elif defined(ARDUINO_ARCH_ESP32)
WiFi.setHostname(HOSTNAME().c_str());
#endif
WiFi.begin(sta_ssid, sta_psk);
WiFi.begin(STA_SSID, STA_PSK);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
#ifdef DEBUG
Serial.println("Failed to connect to Wifi, rebooting in 5s...");
#endif
delay(5000);
ESP.restart();
}
 
#ifdef DEBUG
Serial.print("Connected to Wifi: ");
#endif
Serial.println(WiFi.localIP());
 
#ifdef DEBUG
Serial.println("Setting up OTA in 10s...");
#endif
delay(10000);
 
// Port defaults to 8266
ArduinoOTA.setPort(ota_port);
ArduinoOTA.setPort(OTA_PORT);
 
// Hostname defaults to esp-[ChipID]
ArduinoOTA.setHostname(HOSTNAME().c_str());
 
// Set the OTA password
ArduinoOTA.setPassword(ota_password);
ArduinoOTA.setPassword(OTA_PASSWORD);
 
ArduinoOTA.onStart([]() {
switch (ArduinoOTA.getCommand()) {
case U_FLASH: // Sketch
case U_FLASH: // Sketch
#ifdef DEBUG
Serial.println("OTA start updating sketch.");
#endif
break;
#if defined(ARDUINO_ARCH_ESP8266)
case U_FS:
@@ -240,16 +261,22 @@
#elif defined(ARDUINO_ARCH_ESP32)
case U_SPIFFS:
#endif
#ifdef DEBUG
Serial.println("OTA start updating filesystem.");
#endif
SPIFFS.end();
break;
default:
#ifdef DEBUG
Serial.println("Unknown OTA update type.");
#endif
break;
}
});
ArduinoOTA.onEnd([]() {
#ifdef DEBUG
Serial.println("OTA update complete.");
#endif
SPIFFS.begin();
#if defined(ARDUINO_ARCH_ESP8266)
// For what it's worth, check the filesystem on ESP8266.
@@ -258,28 +285,44 @@
ESP.restart();
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
#ifdef DEBUG
Serial.printf("OTA update progress: %u%%\r", (progress / (total / 100)));
#endif
});
ArduinoOTA.onError([](ota_error_t error) {
#ifdef DEBUG
Serial.printf("OTA update error [%u]: ", error);
#endif
switch (error) {
case OTA_AUTH_ERROR:
#ifdef DEBUG
Serial.println("OTA authentication failed");
#endif
break;
case OTA_BEGIN_ERROR:
#ifdef DEBUG
Serial.println("OTA begin failed");
#endif
break;
case OTA_CONNECT_ERROR:
#ifdef DEBUG
Serial.println("OTA connect failed");
#endif
break;
case OTA_RECEIVE_ERROR:
#ifdef DEBUG
Serial.println("OTA receive failed");
#endif
break;
case OTA_END_ERROR:
#ifdef DEBUG
Serial.println("OTA end failed");
#endif
break;
default:
#ifdef DEBUG
Serial.println("Unknown OTA failure");
#endif
break;
}
ESP.restart();
@@ -287,11 +330,13 @@
ArduinoOTA.begin();
 
// Set up MQTT client.
mqttClient.setServer(mqtt_host, mqtt_port);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
mqttClient.setCallback(mqttCallback);
 
// Touchdown.
#ifdef DEBUG
Serial.println("Setup complete.");
#endif
}
 
void loop() {
@@ -306,11 +351,15 @@
delay(1);
break;
case WL_NO_SHIELD:
#ifdef DEBUG
Serial.println("No Wifi shield present.");
#endif
goto DEFAULT_CASE;
break;
case WL_NO_SSID_AVAIL:
#ifdef DEBUG
Serial.println("Configured SSID not found.");
#endif
goto DEFAULT_CASE;
break;
// Temporary statuses indicating transitional states.
@@ -323,7 +372,9 @@
case WL_CONNECTION_LOST:
case WL_DISCONNECTED:
default:
#ifdef DEBUG
Serial.println("Wifi connection failed with status: " + String(wifiStatus));
#endif
DEFAULT_CASE:
delay(10000);
ESP.restart();