Refactoring, web server enabled, 1st service calls created.
This commit is contained in:
245
src/main.cpp
245
src/main.cpp
@@ -2,6 +2,8 @@
|
||||
*/
|
||||
|
||||
#define COMPDATE __DATE__ __TIME__
|
||||
#define APP_VERSION "0.2.18"
|
||||
|
||||
// Button pin on the esp for selecting modes. 0 for Generic devices!
|
||||
#define MODEBUTTON D3
|
||||
#define RELAY1_PIN D1
|
||||
@@ -12,8 +14,8 @@
|
||||
#define VERTICAL_BAR_STARTS_TOP false
|
||||
#define DEBUG_RELAYS false
|
||||
#define DEBUG_DISPLAY false
|
||||
#define STARTUP1_ANIMATION_DURATION_ms 15000
|
||||
#define STARTUP2_ANIMATION_DURATION_ms 45000
|
||||
#define STARTUP1_ANIMATION_DURATION_ms 2000
|
||||
#define STARTUP2_ANIMATION_DURATION_ms 33000
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <IOTAppStory.h>
|
||||
@@ -24,6 +26,10 @@
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <WiFiUdp.h>
|
||||
#include "MD_RobotEyes.h"
|
||||
#include <FS.h>
|
||||
#include <ESPAsyncTCP.h> // https://github.com/me-no-dev/AsyncTCP
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include "Relays.h"
|
||||
|
||||
IOTAppStory IAS(COMPDATE, MODEBUTTON);
|
||||
String deviceName = "wemosMatrixDisplay";
|
||||
@@ -52,9 +58,11 @@ Your hardware matches the setting for FC-16 modules. Please set FC16_HW.
|
||||
// Arbitrary output pins
|
||||
MD_Parola P = MD_Parola(HARDWARE_TYPE, DISPLAY_DATA_PIN, DISPLAY_CLK_PIN, DISPLAY_CS_PIN, MAX_DEVICES);
|
||||
MD_RobotEyes E;
|
||||
Relays R;
|
||||
|
||||
WiFiUDP ntpUDP;
|
||||
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);
|
||||
AsyncWebServer server(80);
|
||||
|
||||
// Field default values
|
||||
char *clockName = "FREMO";
|
||||
@@ -64,9 +72,7 @@ char *relay1Pin_String = "D1";
|
||||
char *relay2Pin_String = "D2";
|
||||
int relay1Pin = D1, relay2Pin = D2;
|
||||
char *relayHoldTime_ms_String = "200";
|
||||
unsigned int relayHoldTime_ms = 200;
|
||||
char *relayMinOffTime_ms_String = "100";
|
||||
unsigned int relayMinOffTime_ms = 100;
|
||||
unsigned int displayRefresh_ms = 200;
|
||||
|
||||
// Clock Display Config Parameter
|
||||
@@ -74,7 +80,12 @@ static char * displayClockNameEvery_ms_String = "16000";
|
||||
static char * displayClockNameDuration_ms_String = "1200";
|
||||
static uint32_t displayClockNameEvery_ms = 16000;
|
||||
static uint32_t displayClockNameDuration_ms = 1200;
|
||||
static uint32_t doNotShowClockNameBeforeAndAfterMinuteChange_s = 2;
|
||||
static uint16_t doNotShowClockNameBeforeAndAfterMinuteChange_s = 2;
|
||||
|
||||
static uint16_t hours, minutes, seconds;
|
||||
static char minuteProgressIndicator;
|
||||
static char timeBuffer[10];
|
||||
|
||||
|
||||
void setupIAS(void) {
|
||||
#if defined ESP8266
|
||||
@@ -87,7 +98,7 @@ void setupIAS(void) {
|
||||
// preset deviceName this is also your MDNS responder: http://deviceName.local
|
||||
IAS.preSetDeviceName(deviceName);
|
||||
IAS.preSetAppName(F("Wemos2RelaysMatrixDisplays"));
|
||||
IAS.preSetAppVersion(F("0.2.1"));
|
||||
IAS.preSetAppVersion(F(APP_VERSION));
|
||||
IAS.preSetAutoUpdate(true);
|
||||
|
||||
// define fields
|
||||
@@ -154,8 +165,8 @@ void setupIAS(void) {
|
||||
clockSpeed_modelMsPerRealSec = atoi(clockSpeed_modelMsPerRealSec_String);
|
||||
relay1Pin = IAS.dPinConv(relay1Pin_String);
|
||||
relay2Pin = IAS.dPinConv(relay2Pin_String);
|
||||
relayHoldTime_ms = atoi(relayHoldTime_ms_String);
|
||||
relayMinOffTime_ms = atoi(relayMinOffTime_ms_String);
|
||||
R.setHoldTime_ms(atoi(relayHoldTime_ms_String));
|
||||
R.setMinOffTime_ms(atoi(relayMinOffTime_ms_String));
|
||||
displayClockNameEvery_ms = atoi(displayClockNameEvery_ms_String);
|
||||
displayClockNameDuration_ms = atoi(displayClockNameDuration_ms_String);
|
||||
|
||||
@@ -163,20 +174,13 @@ void setupIAS(void) {
|
||||
Serial.print(F("Relay1 Pin: ")); Serial.println(relay1Pin);
|
||||
Serial.print(F("Relay2 Pin: ")); Serial.println(relay2Pin);
|
||||
Serial.print(F("Clock speed: ")); Serial.print(clockSpeed_modelMsPerRealSec); Serial.println(F(" model ms per real sec"));
|
||||
Serial.print(F("Relay hold time (ms): ")); Serial.println(relayHoldTime_ms);
|
||||
Serial.print(F("Relay min off time (ms): ")); Serial.println(relayMinOffTime_ms);
|
||||
Serial.print(F("Relay hold time (ms): ")); Serial.println(relayHoldTime_ms_String);
|
||||
Serial.print(F("Relay min off time (ms): ")); Serial.println(relayMinOffTime_ms_String);
|
||||
Serial.print(F("Clock speed (model ms per real time s): ")); Serial.println(clockSpeed_modelMsPerRealSec);
|
||||
Serial.print(F("Show clock name every (ms): ")); Serial.println(displayClockNameEvery_ms);
|
||||
Serial.print(F("Show clock name for (ms): ")); Serial.println(displayClockNameDuration_ms);
|
||||
}
|
||||
|
||||
void setupRelays(int relay1Pin, int relay2Pin) {
|
||||
pinMode(relay1Pin, OUTPUT);
|
||||
pinMode(relay2Pin, OUTPUT);
|
||||
digitalWrite(relay1Pin, LOW);
|
||||
digitalWrite(relay2Pin, LOW);
|
||||
}
|
||||
|
||||
static MD_MAX72XX *graphicDisplay = NULL;
|
||||
|
||||
void setupDisplay() {
|
||||
@@ -224,15 +228,118 @@ void setupDisplay() {
|
||||
P.print(intro);
|
||||
}
|
||||
|
||||
//called when the url is not defined here return 404
|
||||
void onRequest(AsyncWebServerRequest *request){
|
||||
//Handle Unknown Request
|
||||
request->send(404);
|
||||
}
|
||||
|
||||
void setupFS() {
|
||||
if(!SPIFFS.begin()){
|
||||
Serial.println(F(" SPIFFS Mount Failed"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void setupWebServer() {
|
||||
server.on("/fwd", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
Serial.println(F("\n WebApp button pressed -- move clock forward"));
|
||||
|
||||
R.toggle();
|
||||
|
||||
// create json return
|
||||
String json = "{";
|
||||
json += "\"result\":\"OK\",";
|
||||
json += "\"clockName\":\"" + String(clockName) + "\",";
|
||||
json += "\"hours\":\"" + String(hours) + "\",";
|
||||
json += "\"minutes\":\"" + String(minutes) + "\",";
|
||||
json += "\"seconds\":\"" + String(seconds) + "\"";
|
||||
json += "}";
|
||||
|
||||
// return json to WebApp
|
||||
request->send(200, F("text/json"), json);
|
||||
json = String();
|
||||
});
|
||||
|
||||
server.on("/clock", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
// create json return
|
||||
String json = "{";
|
||||
json += "\"clockName\":\""+String(clockName)+"\",";
|
||||
json += "\"clockSpeed\":\""+String(clockSpeed_modelMsPerRealSec)+"\",";
|
||||
json += "\"relayHoldTime_ms\":\""+String(R.getHoldTime_ms())+"\",";
|
||||
json += "\"relayMinOffTime_ms\":\""+String(R.getMinOffTime_ms())+"\",";
|
||||
json += "\"displayRefresh_ms\":\""+String(displayRefresh_ms)+"\",";
|
||||
json += "\"displayClockNameEvery_ms\":\""+String(displayClockNameEvery_ms)+"\",";
|
||||
json += "\"displayClockNameDuration_ms\":\""+String(displayClockNameDuration_ms)+"\",";
|
||||
json += "\"doNotShowClockNameBeforeAndAfterMinuteChange_s\":\""+String(doNotShowClockNameBeforeAndAfterMinuteChange_s)+"\",";
|
||||
json += "\"real_hours\":\""+String(hours)+"\",";
|
||||
json += "\"real_minutes\":\""+String(minutes)+"\",";
|
||||
json += "\"real_seconds\":\""+String(seconds)+"\",";
|
||||
json += "\"model_hours\":\""+String(hours)+"\",";
|
||||
json += "\"model_minutes\":\""+String(minutes)+"\",";
|
||||
json += "\"model_seconds\":\""+String(seconds)+"\"";
|
||||
json += "}";
|
||||
|
||||
// return json to WebApp
|
||||
request->send(200, F("text/json"), json);
|
||||
json = String();
|
||||
});
|
||||
|
||||
server.on("/setDT", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
String h, m, message;
|
||||
Serial.println(F("\n Setting displayed time of clock"));
|
||||
|
||||
message = "";
|
||||
if (request->hasParam("h")) {
|
||||
h = request->getParam("h")->value();
|
||||
} else {
|
||||
message += "Parameter h for hours missing. ";
|
||||
}
|
||||
if (request->hasParam("m")) {
|
||||
m = request->getParam("m")->value();
|
||||
} else {
|
||||
message += "Parameter m for minutes missing. ";
|
||||
}
|
||||
|
||||
R.setDisplayedTime(h.toInt(), m.toInt());
|
||||
h = String();
|
||||
m = String();
|
||||
|
||||
// create json return
|
||||
String json = "{";
|
||||
if (message.length() > 0) {
|
||||
json += "\"result\":\"Error\",";
|
||||
json += "\"message\": \"" + message + "\"";
|
||||
} else {
|
||||
json += "\"result\":\"OK\"";
|
||||
}
|
||||
json += "}";
|
||||
|
||||
// return json to WebApp
|
||||
request->send(200, F("text/json"), json);
|
||||
json = String();
|
||||
});
|
||||
|
||||
server.serveStatic("/", SPIFFS, "/");
|
||||
server.onNotFound(onRequest);
|
||||
|
||||
// start the HTTP server
|
||||
server.begin();
|
||||
Serial.print(F("HTTP server started at: "));
|
||||
Serial.println(WiFi.localIP());
|
||||
Serial.println("");
|
||||
}
|
||||
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.println(F("setup():"));
|
||||
setupDisplay();
|
||||
setupIAS();
|
||||
setupFS();
|
||||
setupWebServer();
|
||||
delay(200);
|
||||
setupRelays(relay1Pin, relay2Pin);
|
||||
|
||||
R.begin(relay1Pin, relay2Pin);
|
||||
timeClient.begin();
|
||||
Serial.println(F("setup() finished"));
|
||||
}
|
||||
@@ -242,51 +349,6 @@ static bool timeClientInitialized = false;
|
||||
static unsigned long lastTimeOutput_ms = 0;
|
||||
#define TIME_BETWEEN_REALTIME_UPDATE_ms 60000
|
||||
|
||||
static unsigned long last_relay_off_ts=0, last_relay_hold_ts=0;
|
||||
enum RelayState { RELAY_STATE_OFF=0, RELAY_STATE_ON_EVEN_MINUTE, RELAY_STATE_ON_ODD_MINUTE };
|
||||
static RelayState relaysState = RELAY_STATE_OFF;
|
||||
static RelayState lastRelayOnState = RELAY_STATE_ON_EVEN_MINUTE;
|
||||
static bool relayCanSwitch=true;
|
||||
|
||||
void toggleRelays() {
|
||||
if (relayCanSwitch) {
|
||||
if (lastRelayOnState == RELAY_STATE_ON_EVEN_MINUTE) {
|
||||
digitalWrite(relay1Pin, HIGH);
|
||||
digitalWrite(relay2Pin, LOW);
|
||||
relaysState = RELAY_STATE_ON_ODD_MINUTE;
|
||||
// P.print("R-OEv");
|
||||
} else {
|
||||
digitalWrite(relay1Pin, LOW);
|
||||
digitalWrite(relay2Pin, HIGH);
|
||||
relaysState = RELAY_STATE_ON_EVEN_MINUTE;
|
||||
// P.print("R-OOd");
|
||||
}
|
||||
lastRelayOnState = relaysState;
|
||||
} // else P.print("R-OErr");
|
||||
relayCanSwitch = false;
|
||||
last_relay_hold_ts = millis();
|
||||
Serial.println(F("Toggle Relays"));
|
||||
}
|
||||
|
||||
void relaysOff(void) {
|
||||
digitalWrite(relay1Pin, LOW);
|
||||
digitalWrite(relay2Pin, LOW);
|
||||
last_relay_off_ts = millis();
|
||||
relaysState = RELAY_STATE_OFF;
|
||||
// P.print("R-Off");
|
||||
}
|
||||
|
||||
void loopRelays(void) {
|
||||
if (relaysState == RELAY_STATE_OFF) {
|
||||
if (millis() - last_relay_off_ts > relayMinOffTime_ms) {
|
||||
relayCanSwitch = true;
|
||||
}
|
||||
} else {
|
||||
if (millis() - last_relay_hold_ts > relayHoldTime_ms) {
|
||||
relaysOff();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -330,6 +392,7 @@ void loopStartupAnimation() {
|
||||
index++;
|
||||
if (index >= ARRAY_SIZE(eSeq))
|
||||
index = 0;
|
||||
P.displayClear();
|
||||
#if DISPLAY_ANIM_NAME
|
||||
E.setText(eSeq[index].name);
|
||||
#endif
|
||||
@@ -363,14 +426,26 @@ void loopStartupAnimation() {
|
||||
}
|
||||
}
|
||||
|
||||
void reInitializeDisplay() {
|
||||
static unsigned long last_reinit_ts = 0;
|
||||
#define REINIT_AFTER_ms 5000
|
||||
#define AVOID_REINIT_BEFORE_AND_AFTER_FULLMINUTE_FOR_s 3
|
||||
|
||||
if (last_reinit_ts == 0) last_reinit_ts = millis();
|
||||
|
||||
if (millis() - last_reinit_ts > REINIT_AFTER_ms
|
||||
&& seconds < 60 - AVOID_REINIT_BEFORE_AND_AFTER_FULLMINUTE_FOR_s
|
||||
&& seconds > AVOID_REINIT_BEFORE_AND_AFTER_FULLMINUTE_FOR_s) {
|
||||
P.begin();
|
||||
last_reinit_ts = millis();
|
||||
}
|
||||
}
|
||||
|
||||
void loop(void)
|
||||
{
|
||||
int currentDisplayState;
|
||||
int hours, minutes, seconds;
|
||||
char minuteProgressIndicator;
|
||||
static int lastMinutes = 0;
|
||||
static int lastSeconds = 0;
|
||||
static char timeBuffer[10];
|
||||
#define MsgSize 10
|
||||
static char debugMsg[MsgSize+1];
|
||||
static int recentDisplayState = -1;
|
||||
@@ -415,32 +490,6 @@ void loop(void)
|
||||
if (minuteProgressIndicator > 9) minuteProgressIndicator = 9;
|
||||
snprintf(timeBuffer, 10, "%c %2d:%02d", minuteProgressIndicator, hours, minutes);
|
||||
|
||||
//P.displayAnimate();
|
||||
//P.displayClear();
|
||||
/* DEBUG */
|
||||
#if DEBUG_RELAYS
|
||||
if (seconds != lastSeconds) {
|
||||
switch (seconds % 4) {
|
||||
case 0:
|
||||
digitalWrite(relay1Pin, HIGH);
|
||||
break;
|
||||
case 1:
|
||||
digitalWrite(relay1Pin, LOW);
|
||||
break;
|
||||
case 2:
|
||||
digitalWrite(relay2Pin, HIGH);
|
||||
break;
|
||||
case 3:
|
||||
digitalWrite(relay2Pin, LOW);
|
||||
break;
|
||||
}
|
||||
Serial.print("Rel dbg: "); Serial.println(seconds, HEX);
|
||||
delay(5);
|
||||
}
|
||||
#endif
|
||||
/* END DEBUG */
|
||||
|
||||
|
||||
// standard procedure to display
|
||||
static uint32_t last_clock_refresh = 0;
|
||||
static uint32_t lastTimeClockNameShown = 0;
|
||||
@@ -455,7 +504,8 @@ void loop(void)
|
||||
if ((millis() - lastTimeClockNameShown > displayClockNameEvery_ms)
|
||||
&& (seconds < 60-doNotShowClockNameBeforeAndAfterMinuteChange_s)
|
||||
&& (seconds > doNotShowClockNameBeforeAndAfterMinuteChange_s)) {
|
||||
P.begin(); // re-initialize, that fixes display problems due to electrical relais feedbacks
|
||||
//P.begin(); // re-initialize, that fixes display problems due to electrical relais feedbacks
|
||||
reInitializeDisplay();
|
||||
P.setIntensity(2);
|
||||
P.print(clockName);
|
||||
lastTimeClockNameShown = millis();
|
||||
@@ -463,7 +513,8 @@ void loop(void)
|
||||
} else {
|
||||
// showing clock
|
||||
if (millis() - last_clock_refresh > displayRefresh_ms) {
|
||||
//P.displayClear();
|
||||
// P.begin(); // re-initialize, that fixes display problems due to electrical relais feedbacks
|
||||
reInitializeDisplay();
|
||||
P.setIntensity(1);
|
||||
P.print(timeBuffer);
|
||||
last_clock_refresh = millis();
|
||||
@@ -473,10 +524,10 @@ void loop(void)
|
||||
|
||||
// toggle relays
|
||||
if (lastMinutes != minutes) {
|
||||
toggleRelays();
|
||||
R.toggle();
|
||||
lastMinutes = minutes;
|
||||
}
|
||||
lastSeconds = seconds;
|
||||
|
||||
loopRelays();
|
||||
R.loop();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user