Subversion Repositories ESP32_P1_Meter

Rev

Rev 4 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4 Rev 5
Line -... Line 1...
-
 
1
////////////////////////////////  Include libraries  /////////////////////////////////////////
-
 
2
#include <Arduino.h>
1
#include <ArduinoOTA.h>
3
#include <ArduinoOTA.h>
2
#include <EEPROM.h>
4
#include <EEPROM.h>
3
#include <Ticker.h>
5
#include <Ticker.h>
4
#include <MQTTRemote.h>
-
 
5
 
-
 
6
#include <FS.h>
6
#include <FS.h>
7
#include <LittleFS.h>
7
#include <LittleFS.h>
-
 
8
#include <ezButton.h>
-
 
9
#include <PubSubClient.h>              // https://github.com/knolleary/pubsubclient/
8
#include <AsyncFsWebServer.h>  //https://github.com/cotestatnt/async-esp-fs-webserver
10
#include <AsyncFsWebServer.h>          //https://github.com/cotestatnt/async-esp-fs-webserver
9
 
-
 
10
 
11
 
11
// * Include settings
12
////////////////////////////////  Include settings  /////////////////////////////////////////
12
#include "settings.h"
13
#include "settings.h"
13
 
14
 
-
 
15
////////////////////////////////  Define constants  /////////////////////////////////////////
14
// * Initiate led blinker library
16
#ifndef LED_BUILTIN
15
Ticker ticker;
17
#define LED_BUILTIN 2
16
 
18
#endif
17
#define FILESYSTEM LittleFS
19
#define FILESYSTEM LittleFS
18
bool captiveRun = false;
-
 
19
 
-
 
20
// AsyncFsWebServer server(80, FILESYSTEM, "esphost");
20
#define MYTZ "CET-1CEST,M3.5.0,M10.5.0/3"          // Timezone definition to get properly time from NTP server
21
AsyncFsWebServer server(80, FILESYSTEM);
-
 
22
 
-
 
23
#ifndef Default_MQTT_Port
21
#ifndef Default_MQTT_Port
24
#define Default_MQTT_Port 1883
22
  #define Default_MQTT_Port "1883"
25
#endif
23
#endif
26
 
-
 
27
#define BTN_SAVE  5
24
#define BTN_SAVE  5
-
 
25
// added labels for /setup webpage
-
 
26
#define USER_LABEL "Username"
-
 
27
#define PASSWORD_LABEL "Password"
-
 
28
#define EXTERNAL_ANTENNA_LABEL "External (Extra Internal) Antenna"
28
 
29
 
29
// Test "options" values
-
 
30
uint16_t MQTT_Port = Default_MQTT_Port;
-
 
31
bool MQTT_Enabled = false;
-
 
32
String MQTT_Client = "ESP32_P1_Meter";
-
 
33
String MQTT_Server = "";
-
 
34
String MQTT_User = "";
-
 
35
String MQTT_Password = "";
-
 
36
String MQTT_Prefix = "";
-
 
37
 
-
 
38
// Var labels (in /setup webpage)
-
 
39
#define MQTT_ENABLED_LABEL "MQTT Enabled"
30
#define MQTT_ENABLED_LABEL "MQTT Enabled"
40
#define MQTT_CLIENT_LABEL "MQTT Client"
31
#define MQTT_CLIENT_LABEL "MQTT Client"
41
#define MQTT_SERVER_LABEL "MQTT Server"
32
#define MQTT_SERVER_LABEL "MQTT Server"
42
#define MQTT_PORT_LABEL "MQTT Server Port"
33
#define MQTT_PORT_LABEL "MQTT Server Port"
43
#define MQTT_USER_LABEL "MQTT User"
34
#define MQTT_USER_LABEL "MQTT User"
44
#define MQTT_PASSWORD_LABEL "MQTT Password"
35
#define MQTT_PASSWORD_LABEL "MQTT Password"
45
#define MQTT_PREFIX_LABEL "MQTT Prefix"
36
#define MQTT_TOPIC_LABEL "MQTT Topic"
46
 
37
 
-
 
38
#define SHORT_PRESS_TIME_MIN 1000 // 1 second
47
// Timezone definition to get properly time from NTP server
39
#define SHORT_PRESS_TIME_MAX 2500 // 2.5 seconds
48
#define MYTZ "CET-1CEST,M3.5.0,M10.5.0/3"
40
#define LONG_PRESS_TIME  10000 // 10 seconds
-
 
41
 
-
 
42
const uint8_t logo_png[] PROGMEM = {
-
 
43
  0x89, 0x50, 0x4E, 0x47, /* ... */
-
 
44
};
-
 
45
 
-
 
46
////////////////////////////////  Create Objects  /////////////////////////////////////////
49
struct tm Time;
47
struct tm Time;
-
 
48
Ticker ticker;
-
 
49
AsyncFsWebServer server(FILESYSTEM, 80, "P1_Meter");
-
 
50
ezButton button(9); // create ezButton object that attach to pin GPIO9
50
 
51
 
51
static const char save_btn_htm[] PROGMEM = R"EOF(
-
 
52
<div class="btn-bar">
-
 
53
  <a class="btn" id="reload-btn">Reload options</a>
-
 
54
</div>
-
 
55
)EOF";
-
 
56
 
-
 
57
static const char button_script[] PROGMEM = R"EOF(
-
 
58
/* Add click listener to button */
-
 
59
document.getElementById('reload-btn').addEventListener('click', reload);
-
 
60
function reload() {
-
 
61
  console.log('Reload configuration options');
-
 
62
  fetch('/reload')
-
 
63
  .then((response) => {
-
 
64
    if (response.ok) {
-
 
65
      openModalMessage('Options loaded', 'Options was reloaded from configuration file');
-
 
66
      return;
-
 
67
    }
-
 
68
    throw new Error('Something goes wrong with fetch');
-
 
69
  })
-
 
70
  .catch((error) => {
-
 
71
    openModalMessage('Error', 'Something goes wrong with your request');
-
 
72
  });
-
 
73
}
-
 
74
)EOF";
-
 
75
 
52
 
-
 
53
// * Define variables
-
 
54
bool captiveRun = false;
-
 
55
// Setup Settings
-
 
56
String Username = "admin";
-
 
57
String Password = "admin";
-
 
58
bool External_Antenna = true;
-
 
59
// MQTT Settings
-
 
60
bool MQTT_Enabled = false;
-
 
61
String MQTT_Client = "ESP32_P1_Meter";
-
 
62
String MQTT_Server = "";
-
 
63
//uint16_t MQTT_Port = Default_MQTT_Port;
-
 
64
String MQTT_Port = Default_MQTT_Port;
-
 
65
String MQTT_User = "";
-
 
66
String MQTT_Password = "";
-
 
67
String MQTT_Topic = "P1_Meter";
-
 
68
int LEDSpeed = 0;
-
 
69
 
-
 
70
bool isPressing = false;
-
 
71
unsigned long pressedTime  = 0;
-
 
72
unsigned long releasedTime = 0;
76
 
73
 
77
////////////////////////////////  Filesystem  /////////////////////////////////////////
74
////////////////////////////////  Filesystem  /////////////////////////////////////////
78
bool startFilesystem() {
75
bool startFilesystem() {
79
  if (FILESYSTEM.begin()){
76
  if (FILESYSTEM.begin()){
80
    server.printFileList(FILESYSTEM, "/", 2);
77
    server.printFileList(FILESYSTEM, "/", 2), Serial;
81
    return true;
78
    return true;
82
  }
79
  }
83
  else {
80
  else {
84
    Serial.println("ERROR on mounting filesystem. It will be reformatted!");
81
    Serial.println("ERROR on mounting filesystem. It will be reformatted!");
85
    FILESYSTEM.format();
82
    FILESYSTEM.format();
86
    ESP.restart();
83
    ESP.restart();
87
  }
84
  }
88
  return false;
85
  return false;
89
}
86
}
90
 
-
 
91
/*
87
/*
92
* Getting FS info (total and free bytes) is strictly related to
88
* Getting FS info (total and free bytes) is strictly related to
93
* filesystem library used (LittleFS, FFat, SPIFFS etc etc) and ESP framework
89
* filesystem library used (LittleFS, FFat, SPIFFS etc etc) and ESP framework
94
*/
90
*/
95
#ifdef ESP32
91
#ifdef ESP32
Line 98... Line 94...
98
	fsInfo->totalBytes = LittleFS.totalBytes();
94
	fsInfo->totalBytes = LittleFS.totalBytes();
99
	fsInfo->usedBytes = LittleFS.usedBytes();
95
	fsInfo->usedBytes = LittleFS.usedBytes();
100
}
96
}
101
#endif
97
#endif
102
 
98
 
-
 
99
////////////////////////////////   WebSocket Handler  /////////////////////////////
-
 
100
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){
-
 
101
  switch (type) {
-
 
102
    case WS_EVT_DISCONNECT:
-
 
103
      Serial.print("WebSocket client disconnected!\n");
-
 
104
      break;
-
 
105
    case WS_EVT_CONNECT:  {
-
 
106
        IPAddress ip = client->remoteIP();
-
 
107
        Serial.printf("WebSocket client %d.%d.%d.%d connected.\n", ip[0], ip[1], ip[2], ip[3]);
-
 
108
        client->printf("%s", "{\"Connected\": true}");
-
 
109
      }
-
 
110
      break;
-
 
111
    default:
-
 
112
        break;
-
 
113
  }
-
 
114
}
-
 
115
 
-
 
116
////////////////////////////////  NTP Time  /////////////////////////////////////
-
 
117
void getUpdatedtime(const uint32_t timeout)
-
 
118
{
-
 
119
  uint32_t start = millis();
-
 
120
  Serial.print("Sync time...");
-
 
121
  while (millis() - start < timeout  && Time.tm_year <= (1970 - 1900)) {
-
 
122
    time_t now = time(nullptr);
-
 
123
    Time = *localtime(&now);
-
 
124
    delay(5);
-
 
125
  }
-
 
126
  Serial.println(" done.");
-
 
127
}
-
 
128
 
103
////////////////////  Load application options from filesystem  ////////////////////
129
////////////////////  Load application options from filesystem  ////////////////////
104
bool loadOptions() {
130
bool loadOptions() {
105
  if (FILESYSTEM.exists(server.getConfiFileName())) {
131
  if (FILESYSTEM.exists(server.getConfiFileName())) {
-
 
132
    server.getOptionValue(USER_LABEL, Username);
-
 
133
    server.getOptionValue(PASSWORD_LABEL, Password);
-
 
134
    server.getOptionValue(EXTERNAL_ANTENNA_LABEL, External_Antenna);
-
 
135
 
106
    server.getOptionValue(MQTT_ENABLED_LABEL, MQTT_Enabled);
136
    server.getOptionValue(MQTT_ENABLED_LABEL, MQTT_Enabled);
107
    server.getOptionValue(MQTT_CLIENT_LABEL, MQTT_Client);
137
    server.getOptionValue(MQTT_CLIENT_LABEL, MQTT_Client);
108
    server.getOptionValue(MQTT_SERVER_LABEL, MQTT_Server);
138
    server.getOptionValue(MQTT_SERVER_LABEL, MQTT_Server);
109
    server.getOptionValue(MQTT_PORT_LABEL, MQTT_Port);
139
    server.getOptionValue(MQTT_PORT_LABEL, MQTT_Port);
110
    server.getOptionValue(MQTT_USER_LABEL, MQTT_User);
140
    server.getOptionValue(MQTT_USER_LABEL, MQTT_User);
111
    server.getOptionValue(MQTT_PASSWORD_LABEL, MQTT_Password);
141
    server.getOptionValue(MQTT_PASSWORD_LABEL, MQTT_Password);
112
    server.getOptionValue(MQTT_PREFIX_LABEL, MQTT_Prefix);
142
    server.getOptionValue(MQTT_TOPIC_LABEL, MQTT_Topic);
113
 
143
 
114
    Serial.println("\nThis are the current values stored: \n");
144
    Serial.println("\nThis are the current values stored: \n");
115
    Serial.printf("MQTT Enabled: %s\n", MQTT_Enabled ? "true" : "false");
145
    Serial.printf("MQTT Enabled: %s\n", MQTT_Enabled ? "true" : "false");
116
    Serial.printf("MQTT Client: %s\n", MQTT_Client.c_str());
146
    Serial.printf("MQTT Client: %s\n", MQTT_Client.c_str());
117
    Serial.printf("MQTT Server: %s\n", MQTT_Server.c_str());
147
    Serial.printf("MQTT Server: %s\n", MQTT_Server.c_str());
118
    Serial.printf("MQTT Server Port: %d\n", MQTT_Port);
148
//    Serial.printf("MQTT Server Port: %d\n", MQTT_Port);
-
 
149
    Serial.printf("MQTT Server Port: %s\n", MQTT_Port.c_str());
119
    Serial.printf("MQTT User: %s\n", MQTT_User.c_str());
150
    Serial.printf("MQTT User: %s\n", MQTT_User.c_str());
120
    Serial.printf("MQTT password: %s\n", MQTT_Password.c_str());
151
    Serial.printf("MQTT password: %s\n", MQTT_Password.c_str());
121
    Serial.printf("MQTT Prefix: %s\n", MQTT_Prefix.c_str());
152
    Serial.printf("MQTT Topic: %s\n", MQTT_Topic.c_str());
122
    return true;
153
    return true;
123
  }
154
  }
124
  else
155
  else
125
    Serial.println(F("Config file not exist"));
156
    Serial.println(F("Config file not exist"));
126
  return false;
157
  return false;
127
}
158
}
128
 
159
 
129
MQTTRemote _mqtt_remote(MQTT_Client.c_str(), MQTT_Server.c_str(), MQTT_Port.c_str(), MQTT_User.c_str(), MQTT_Password.c_str(),
-
 
130
                        {.rx_buffer_size = 2048, .tx_buffer_size = 2048, .keep_alive_s = 10});
-
 
131
 
-
 
132
bool _was_connected = false;
160
bool _was_connected = false;
133
void saveOptions() {
161
void saveOptions() {
134
  // server.saveOptionValue(LED_LABEL, ledPin);
162
   server.saveOptionValue(USER_LABEL, Username);
135
  // server.saveOptionValue(BOOL_LABEL, boolVar);
163
   server.saveOptionValue(PASSWORD_LABEL, Password);
-
 
164
   server.saveOptionValue(EXTERNAL_ANTENNA_LABEL, External_Antenna);
-
 
165
 
-
 
166
   server.saveOptionValue(MQTT_ENABLED_LABEL, MQTT_Enabled);
136
  // server.saveOptionValue(LONG_LABEL, longVar);
167
   server.saveOptionValue(MQTT_CLIENT_LABEL, MQTT_Client);
-
 
168
   server.saveOptionValue(MQTT_SERVER_LABEL, MQTT_Server);
137
  // server.saveOptionValue(FLOAT_LABEL, floatVar);
169
   server.saveOptionValue(MQTT_PORT_LABEL, MQTT_Port);
138
  // server.saveOptionValue(STRING_LABEL, stringVar);
170
   server.saveOptionValue(MQTT_USER_LABEL, MQTT_User);
-
 
171
   server.saveOptionValue(MQTT_PASSWORD_LABEL, MQTT_Password);
139
  // server.saveOptionValue(DROPDOWN_LABEL, dropdownSelected);
172
   server.saveOptionValue(MQTT_TOPIC_LABEL, MQTT_Topic);
140
  Serial.println(F("Application options saved."));
173
  Serial.println(F("Application options saved."));
141
}
174
}
142
 
175
 
143
////////////////////////////  HTTP Request Handlers  ////////////////////////////////////
176
////////////////////////////  HTTP Request Handlers  ////////////////////////////////////
144
void handleLoadOptions(AsyncWebServerRequest *request) {
177
void handleLoadOptions(AsyncWebServerRequest *request) {
Line 146... Line 179...
146
  loadOptions();
179
  loadOptions();
147
  Serial.println("Application option loaded after web request");
180
  Serial.println("Application option loaded after web request");
148
}
181
}
149
 
182
 
150
 
183
 
-
 
184
 
-
 
185
 
-
 
186
// * ==========================================================================================
-
 
187
// * = HIERONDER NOG NETJES MAKEN == HIERONDER NOG NETJES MAKEN == HIERONDER NOG NETJES MAKEN =
-
 
188
// * ==========================================================================================
-
 
189
 
-
 
190
//MQTT_Port_String = String(MQTT_Port);
-
 
191
//sprintf(MQTT_Port_String, "%u", MQTT_Port);
-
 
192
//MQTTRemote _mqtt_remote(MQTT_Client.c_str(), MQTT_Server.c_str(), MQTT_Port, MQTT_User.c_str(), MQTT_Password.c_str(),
-
 
193
//                        {.rx_buffer_size = 2048, .tx_buffer_size = 2048, .keep_alive_s = 10});
-
 
194
 
-
 
195
 
-
 
196
////////////////////////////////  SETUP  /////////////////////////////////////////
151
void setup() {
197
void setup() {
152
  Serial.begin(115200);
198
  Serial.begin(115200);
-
 
199
  button.setDebounceTime(50); // set debounce time to 50 milliseconds
153
  pinMode(BTN_SAVE, INPUT_PULLUP);
200
  pinMode(BTN_SAVE, INPUT_PULLUP);
-
 
201
  pinMode(LED_BUILTIN, OUTPUT);
154
 
202
 
-
 
203
  
155
  // FILESYSTEM INIT
204
  // FILESYSTEM INIT
156
  if (startFilesystem()){
205
  if (startFilesystem()){
157
    // Load configuration (if not present, default will be created when webserver will start)
206
    // Load configuration (if not present, default will be created when webserver will start)
158
    if (loadOptions())
207
    if (loadOptions())
159
      Serial.println(F("Application option loaded"));
208
      Serial.println(F("Application option loaded"));
160
    else
209
    else
161
      Serial.println(F("Application options NOT loaded!"));
210
      Serial.println(F("Application options NOT loaded!"));
162
  }
211
  }
163
 
212
 
-
 
213
  server.setSetupPageTitle("Instellingen P1 Meter");
-
 
214
  server.setSetupPageLogo(logo_png, sizeof(logo_png), "image/png", false);
-
 
215
  server.closeSetupConfiguration();
-
 
216
 
164
  // Try to connect to stored SSID, start AP with captive portal if fails after timeout
217
  // Try to connect to stored SSID, start AP with captive portal if fails after timeout
165
  IPAddress myIP = server.startWiFi(15000);
218
  IPAddress myIP = server.startWiFi(15000);
166
  if (!myIP) {
219
  if (!myIP) {
167
    Serial.println("\n\nNo WiFi connection, start AP and Captive Portal\n");
220
    Serial.println("\n\nNo WiFi connection, start AP and Captive Portal\n");
168
    server.startCaptivePortal("ESP_AP", "123456789", "/setup");
221
    server.startCaptivePortal("ESP_AP", "123456789", "/setup");
169
    myIP = WiFi.softAPIP();
222
    myIP = WiFi.softAPIP();
170
    captiveRun = true;
223
    captiveRun = true;
-
 
224
    LEDSpeed = 250;
-
 
225
  } else {
-
 
226
    LEDSpeed = 1000;
171
  }
227
  }
172
 
228
 
173
  // Add custom page handlers to webserver
229
  // Add custom page handlers to webserver
174
  server.on("/reload", HTTP_GET, handleLoadOptions);
230
  server.on("/reload", HTTP_GET, handleLoadOptions);
175
 
231
 
176
  // Configure /setup page and start Web Server
232
  // Configure /setup page and start Web Server
177
  server.addOptionBox("MQTT");
233
  server.addOptionBox("Device Setup");
-
 
234
  server.addOption(USER_LABEL, Username);
-
 
235
  server.addOption(PASSWORD_LABEL, Password);
-
 
236
  server.addOption(EXTERNAL_ANTENNA_LABEL, External_Antenna);
-
 
237
  server.addComment(EXTERNAL_ANTENNA_LABEL, "Restart is necessary after changing values.");
178
 
238
  
-
 
239
  server.addOptionBox("MQTT Setup");
179
  server.addOption(MQTT_ENABLED_LABEL, MQTT_Enabled);
240
  server.addOption(MQTT_ENABLED_LABEL, MQTT_Enabled);
-
 
241
  server.addOption(MQTT_CLIENT_LABEL, MQTT_Client);
180
  server.addOption(MQTT_SERVER_LABEL, MQTT_Server);
242
  server.addOption(MQTT_SERVER_LABEL, MQTT_Server);
181
  server.addOption(MQTT_PORT_LABEL, MQTT_Port);
243
  server.addOption(MQTT_PORT_LABEL, MQTT_Port);
182
  server.addOption(MQTT_USER_LABEL, MQTT_User);
244
  server.addOption(MQTT_USER_LABEL, MQTT_User);
183
  server.addOption(MQTT_PASSWORD_LABEL, MQTT_Password);
245
  server.addOption(MQTT_PASSWORD_LABEL, MQTT_Password);
184
  server.addOption(MQTT_PREFIX_LABEL, MQTT_Prefix);
246
  server.addOption(MQTT_TOPIC_LABEL, MQTT_Topic);
185
  server.addOptionBox(const char *title);
-
 
186
 
-
 
187
  server.addHTML(save_btn_htm, "buttons", /*overwrite*/ false);
247
  server.addComment(MQTT_TOPIC_LABEL, "Restart is necessary after changing values.");
188
  server.addJavascript(button_script, "js", /*overwrite*/ false);
-
 
189
 
248
 
190
  // Enable ACE FS file web editor and add FS info callback function
249
  // Enable ACE FS file web editor and add FS info callback function
191
  server.enableFsCodeEditor();
250
  server.enableFsCodeEditor();
192
  #ifdef ESP32
251
  #ifdef ESP32
193
  server.setFsInfoCallback(getFsInfo);
252
  server.setFsInfoCallback(getFsInfo);
194
  #endif
253
  #endif
195
 
254
 
196
  // set /setup and /edit page authentication
255
  // set /setup and /edit page authentication
197
  server.setAuthentication("admin", "admin");
256
  server.setAuthentication(Username.c_str(), Password.c_str());
198
 
257
 
199
  // Start server
258
   // Start server with custom websocket event handler
200
  server.init();
259
  server.init(onWsEvent);
201
  Serial.print(F("ESP Web Server started on IP Address: "));
260
  Serial.print(F("ESP Web Server started on IP Address: "));
-
 
261
  Serial.println(server.getServerIP());
-
 
262
 
-
 
263
  if (External_Antenna) {
-
 
264
    pinMode(3, OUTPUT);    // RF switch power on
-
 
265
    digitalWrite(3, LOW);
-
 
266
    pinMode(14, OUTPUT);   // select external antenna
-
 
267
    digitalWrite(14, HIGH);
-
 
268
    Serial.println("External antenna selected.");
-
 
269
 } else {
-
 
270
    pinMode(14, INPUT);    // select on-board antenna
-
 
271
    pinMode(3, INPUT);   // RF switch power off
-
 
272
    Serial.println("Internal antenna selected.");
-
 
273
 }
-
 
274
 long rssi = WiFi.RSSI();
-
 
275
 Serial.print("WiFi Strength (RSSI): ");
-
 
276
 if ((rssi <= -30) && (rssi > -50)) {
-
 
277
   Serial.print("***** (");
202
  Serial.println(myIP);
278
   Serial.print(rssi);
-
 
279
   Serial.print("dBm.)");
-
 
280
 } else   if ((rssi <= -50) && (rssi > -60)) {
-
 
281
   Serial.print("****. (");
203
  Serial.println(F(
282
   Serial.print(rssi);
-
 
283
   Serial.print("dBm.)");
204
      "This is \"customOptions.ino\" example.\n"
284
 } else   if ((rssi <= -60) && (rssi > -70)) {
-
 
285
   Serial.print("***.. (");
-
 
286
   Serial.print(rssi);
-
 
287
   Serial.print("dBm.)");
205
      "Open /setup page to configure optional parameters.\n"
288
 } else   if ((rssi <= -70) && (rssi > -80)) {
-
 
289
   Serial.print("**... (");
-
 
290
   Serial.print(rssi);
-
 
291
   Serial.print("dBm.)");
206
      "Open /edit page to view, edit or upload example or your custom webserver source files."
292
 } else   if ((rssi <= -80) && (rssi > -90)) {
-
 
293
   Serial.print("*.... (");
-
 
294
   Serial.print(rssi);
-
 
295
   Serial.print("dBm.)");
-
 
296
 } else   if ((rssi <= -90)) {
-
 
297
   Serial.print("..... (");
-
 
298
   Serial.print(rssi);
-
 
299
   Serial.print("dBm.)");
-
 
300
 }
-
 
301
 
-
 
302
 // if (MQTT_Enabled) {
207
  ));
303
      
-
 
304
 // }
208
 
305
 
209
  if (MQTT_Enabled) {
306
//  if (MQTT_Enabled) {
210
    _mqtt_remote.start([](bool connected) {
307
//    _mqtt_remote.start([](bool connected) {
211
    if (connected) {
308
//    if (connected) {
212
      _mqtt_remote.subscribe(
309
//      _mqtt_remote.subscribe(
213
            _mqtt_remote.publishMessageVerbose(_mqtt_remote.clientId() + "/initial_message", "oh hello!");
310
//            _mqtt_remote.publishMessageVerbose(_mqtt_remote.clientId() + "/initial_message", "oh hello!");
214
          });
311
//          });
215
    }
312
//    };
216
  });
-
 
217
  };
-
 
218
}
313
}
219
 
314
 
-
 
315
////////////////////////////////  LOOP  /////////////////////////////////////////
220
void loop() {
316
void loop() {
-
 
317
 
-
 
318
  // Send ESP system time (epoch) and heap stats to WS client
-
 
319
  static uint32_t sendToClientTime;
-
 
320
  if (millis() - sendToClientTime > LEDSpeed ) {
-
 
321
    sendToClientTime = millis();
-
 
322
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
-
 
323
 
-
 
324
    time_t now = time(nullptr);
-
 
325
    using namespace AsyncFSWebServer;
-
 
326
    CJSON::Json doc;
-
 
327
    doc.setBool("addPoint", true);
-
 
328
    doc.setNumber("timestamp", (double)now);
-
 
329
#ifdef ESP32
-
 
330
    doc.setNumber("totalHeap", (double)heap_caps_get_free_size(0));
-
 
331
    doc.setNumber("maxBlock", (double)heap_caps_get_largest_free_block(0));
-
 
332
#elif defined(ESP8266)
-
 
333
    uint32_t free;
-
 
334
    uint32_t max;
-
 
335
    ESP.getHeapStats(&free, &max, nullptr);
-
 
336
    doc.setNumber("totalHeap", (double)free);
-
 
337
    doc.setNumber("maxBlock", (double)max);
-
 
338
#endif
-
 
339
    String msg = doc.serialize();
-
 
340
    server.wsBroadcast(msg.c_str());
-
 
341
  }
-
 
342
 
221
  if (captiveRun)
343
  if (captiveRun)
222
    server.updateDNS();
344
    server.updateDNS();
223
 
345
 
224
  // Savew options also on button click
346
  // Savew options also on button click
225
  if (! digitalRead(BTN_SAVE)) {
347
  if (! digitalRead(BTN_SAVE)) {
226
    saveOptions();
348
    saveOptions();
227
    delay(1000);
349
    delay(1000);
228
  }
350
  }
-
 
351
 
-
 
352
  button.loop(); // MUST call the loop() function first
-
 
353
 
-
 
354
  if (button.isPressed()) {
-
 
355
    pressedTime = millis();
-
 
356
    isPressing = true;
-
 
357
  }
-
 
358
  
-
 
359
  long pressingDuration = millis() - pressedTime;
-
 
360
  
-
 
361
  if ((isPressing == true) && (pressingDuration > LONG_PRESS_TIME))
-
 
362
      digitalWrite(LED_BUILTIN, LOW);
-
 
363
 
-
 
364
  if (button.isReleased()) {
-
 
365
    releasedTime = millis();
-
 
366
    isPressing = false;
-
 
367
 
-
 
368
    long pressDuration = releasedTime - pressedTime;
-
 
369
 
-
 
370
    if ((pressDuration > SHORT_PRESS_TIME_MIN) && (pressDuration < SHORT_PRESS_TIME_MAX)) {
-
 
371
      ESP.restart();
-
 
372
    }
-
 
373
 
-
 
374
    if (pressDuration > LONG_PRESS_TIME) {
-
 
375
      server.clearConfigFile();
-
 
376
      ESP.restart();
-
 
377
    }
-
 
378
  }
229
}
379
}