Receive power value from MQTT and set output
This commit is contained in:
parent
123b4acaf4
commit
ee3a392d5a
176
firmware/firmware.ino
Normal file
176
firmware/firmware.ino
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
// Board: Wemos D1 Mini
|
||||||
|
|
||||||
|
#include <ArduinoMqttClient.h>
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <ESP8266WebServer.h>
|
||||||
|
#include <ElegantOTA.h> // v2.2.9
|
||||||
|
|
||||||
|
#include "secrets.h"
|
||||||
|
|
||||||
|
WiFiClient wc;
|
||||||
|
MqttClient mqttClient(wc);
|
||||||
|
ESP8266WebServer server(80);
|
||||||
|
|
||||||
|
#define OUTPUT_PIN 4
|
||||||
|
|
||||||
|
|
||||||
|
const char broker[] = "192.168.69.106";
|
||||||
|
int port = 1883;
|
||||||
|
const char topic[] = "iot/airmega/speed";
|
||||||
|
#define QOS_2 2
|
||||||
|
|
||||||
|
void (* resetFunc) (void) = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
pinMode(OUTPUT_PIN, OUTPUT);
|
||||||
|
digitalWrite(OUTPUT_PIN, LOW);
|
||||||
|
analogWriteFreq(120);
|
||||||
|
|
||||||
|
Serial.begin(115200);
|
||||||
|
Serial.println("");
|
||||||
|
Serial.println("");
|
||||||
|
Serial.println("===== BOOT UP =====");
|
||||||
|
|
||||||
|
static int error_count = 0;
|
||||||
|
|
||||||
|
WiFi.hostname("airmega");
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
WiFi.begin(SECRET_SSID, SECRET_PASS);
|
||||||
|
|
||||||
|
Serial.print("[WIFI] Attempting to connect to wifi");
|
||||||
|
while (WiFi.status() != WL_CONNECTED) {
|
||||||
|
error_count += 1;
|
||||||
|
delay(500);
|
||||||
|
Serial.print(".");
|
||||||
|
|
||||||
|
if (error_count > 20) {
|
||||||
|
Serial.println("");
|
||||||
|
Serial.println("[WIFI] Unable to connect, resetting...");
|
||||||
|
resetFunc();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("");
|
||||||
|
Serial.println("[WIFI] Connected to the network");
|
||||||
|
Serial.println();
|
||||||
|
|
||||||
|
Serial.print("[WIFI] Connected to: ");
|
||||||
|
Serial.print(SECRET_SSID);
|
||||||
|
Serial.print(", IP address: ");
|
||||||
|
Serial.println(WiFi.localIP());
|
||||||
|
|
||||||
|
// Synchronize time using NTP. This is necessary to verify that
|
||||||
|
// the TLS certificates offered by the server are currently valid.
|
||||||
|
Serial.print("[TIME] Setting time using NTP");
|
||||||
|
configTime(8 * 3600, 0, "pool.ntp.org", "time.nist.gov");
|
||||||
|
time_t now = time(nullptr);
|
||||||
|
while (now < 8 * 3600 * 2) {
|
||||||
|
delay(500);
|
||||||
|
Serial.print(".");
|
||||||
|
now = time(nullptr);
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
struct tm timeinfo;
|
||||||
|
gmtime_r(&now, &timeinfo);
|
||||||
|
Serial.print("[TIME] Current time: ");
|
||||||
|
Serial.print(asctime(&timeinfo));
|
||||||
|
Serial.println(" UTC");
|
||||||
|
|
||||||
|
server.on("/", []() {
|
||||||
|
server.send(200, "text/html", "<i>SEE YOU STEEL COWBOY...</i>");
|
||||||
|
});
|
||||||
|
|
||||||
|
ElegantOTA.begin(&server); // Start ElegantOTA
|
||||||
|
server.begin();
|
||||||
|
Serial.println("[HTTP] server started");
|
||||||
|
|
||||||
|
mqttClient.setId("airmega");
|
||||||
|
|
||||||
|
Serial.print("[MQTT] Attempting to connect to the MQTT broker: ");
|
||||||
|
Serial.println(broker);
|
||||||
|
|
||||||
|
if (!mqttClient.connect(broker, port)) {
|
||||||
|
Serial.print("MQTT connection failed! Error code = ");
|
||||||
|
Serial.println(mqttClient.connectError());
|
||||||
|
Serial.println("Reseting...");
|
||||||
|
resetFunc();
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("[MQTT] Connected to the MQTT broker.");
|
||||||
|
|
||||||
|
mqttClient.onMessage(onMqttMessage);
|
||||||
|
|
||||||
|
Serial.print("[MQTT] Subscribing to topic: ");
|
||||||
|
Serial.println(topic);
|
||||||
|
|
||||||
|
mqttClient.subscribe(topic, QOS_2);
|
||||||
|
|
||||||
|
Serial.println("[MQTT] Waiting for messages.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
static int error_count = 0;
|
||||||
|
|
||||||
|
if (WiFi.status() != WL_CONNECTED) {
|
||||||
|
error_count += 1;
|
||||||
|
Serial.println("[WIFI] Lost connection. Reconnecting...");
|
||||||
|
WiFi.begin(SECRET_SSID, SECRET_PASS);
|
||||||
|
delay(5000);
|
||||||
|
} else if (!mqttClient.connected()) {
|
||||||
|
error_count += 1;
|
||||||
|
Serial.print("[MQTT] Not connected! Error code = ");
|
||||||
|
Serial.println(mqttClient.connectError());
|
||||||
|
Serial.println("[MQTT] Reconnecting...");
|
||||||
|
mqttClient.connect(broker, port);
|
||||||
|
delay(5000);
|
||||||
|
|
||||||
|
Serial.print("[MQTT] Subscribing to topic: ");
|
||||||
|
Serial.println(topic);
|
||||||
|
mqttClient.subscribe(topic, QOS_2);
|
||||||
|
} else {
|
||||||
|
error_count = 0;
|
||||||
|
mqttClient.poll();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error_count > 10) {
|
||||||
|
Serial.println("Over 10 errors, resetting...");
|
||||||
|
resetFunc();
|
||||||
|
}
|
||||||
|
|
||||||
|
server.handleClient();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void onMqttMessage(int messageSize) {
|
||||||
|
String msgTopic = mqttClient.messageTopic();
|
||||||
|
Serial.print("[MQTT] Received a message with topic '");
|
||||||
|
Serial.print(msgTopic);
|
||||||
|
Serial.print("', length ");
|
||||||
|
Serial.print(messageSize);
|
||||||
|
Serial.println(" bytes:");
|
||||||
|
|
||||||
|
String message = "";
|
||||||
|
|
||||||
|
while (mqttClient.available()) {
|
||||||
|
message += (char)mqttClient.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println(message);
|
||||||
|
|
||||||
|
if (msgTopic != topic) {
|
||||||
|
Serial.println("[MQTT] Invalid topic, returning.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t num = message.toInt();
|
||||||
|
processControlCommand(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
void processControlCommand(int64_t num) {
|
||||||
|
static int64_t prev_num = 0;
|
||||||
|
|
||||||
|
Serial.print("[MEGA] Setting power: ");
|
||||||
|
Serial.println(num);
|
||||||
|
|
||||||
|
analogWrite(OUTPUT_PIN, num);
|
||||||
|
}
|
2
firmware/secrets.h.example
Normal file
2
firmware/secrets.h.example
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#define SECRET_SSID ""
|
||||||
|
#define SECRET_PASS ""
|
Loading…
Reference in New Issue
Block a user