Subversion Repositories ESP8266_P1_Meter

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 raymond 1
#include <Arduino.h>
2
#include <FS.h>
3
#include <LittleFS.h>
4
#include <AsyncFsWebServer.h>   // https://github.com/cotestatnt/async-esp-fs-webserver/
5
 
6
#define FILESYSTEM LittleFS
7
AsyncFsWebServer server(FILESYSTEM, 80, "myserver");
8
 
9
#ifndef LED_BUILTIN
10
#define LED_BUILTIN 2
11
#endif
12
 
13
// In order to set SSID and password open the /setup webserver page
14
// const char* ssid;
15
// const char* password;
16
const char* hostname = "heap-chart";
17
 
18
// Timezone definition to get properly time from NTP server
19
#define MYTZ "CET-1CEST,M3.5.0,M10.5.0/3"
20
struct tm Time;
21
 
22
////////////////////////////////   WebSocket Handler  /////////////////////////////
23
void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){
24
  switch (type) {
25
    case WS_EVT_DISCONNECT:
26
      Serial.print("WebSocket client disconnected!\n");
27
      break;
28
    case WS_EVT_CONNECT:  {
29
        IPAddress ip = client->remoteIP();
30
        Serial.printf("WebSocket client %d.%d.%d.%d connected.\n", ip[0], ip[1], ip[2], ip[3]);
31
        client->printf("%s", "{\"Connected\": true}");
32
      }
33
      break;
34
    default:
35
        break;
36
  }
37
}
38
 
39
 
40
////////////////////////////////  NTP Time  /////////////////////////////////////
41
void getUpdatedtime(const uint32_t timeout)
42
{
43
  uint32_t start = millis();
44
  Serial.print("Sync time...");
45
  while (millis() - start < timeout  && Time.tm_year <= (1970 - 1900)) {
46
    time_t now = time(nullptr);
47
    Time = *localtime(&now);
48
    delay(5);
49
  }
50
  Serial.println(" done.");
51
}
52
 
53
 
54
////////////////////////////////  Filesystem  /////////////////////////////////////////
55
bool startFilesystem() {
56
  if (FILESYSTEM.begin()){
57
    server.printFileList(FILESYSTEM, "/", 2), Serial;
58
    return true;
59
  }
60
  else {
61
    Serial.println("ERROR on mounting filesystem. It will be reformatted!");
62
    FILESYSTEM.format();
63
    ESP.restart();
64
  }
65
  return false;
66
}
67
 
68
 
69
 
70
void setup() {
71
  pinMode(LED_BUILTIN, OUTPUT);
72
  Serial.begin(115200);
73
 
74
  // FILESYSTEM INIT
75
  startFilesystem();
76
 
77
  // Try to connect to WiFi (will start AP if not connected after timeout)
78
  if (!server.startWiFi(10000)) {
79
    Serial.println("\nWiFi not connected! Starting AP mode...");
80
    server.startCaptivePortal("ESP_AP", "123456789", "/setup");
81
  }
82
 
83
  // Enable ACE FS file web editor and add FS info callback function
84
  server.enableFsCodeEditor();
85
 
86
  // Start server with custom websocket event handler
87
  server.init(onWsEvent);
88
  Serial.print(F("ESP Web Server started on IP Address: "));
89
  Serial.println(server.getServerIP());
90
  Serial.println(F(
91
    "This is \"highcharts.ino\" example.\n"
92
    "Open /setup page to configure optional parameters.\n"
93
    "Open /edit page to view, edit or upload example or your custom webserver source files."
94
  ));
95
 
96
}
97
 
98
 
99
void loop() {  
100
  // Send ESP system time (epoch) and heap stats to WS client
101
  static uint32_t sendToClientTime;
102
  if (millis() - sendToClientTime > 1000 ) {
103
    sendToClientTime = millis();
104
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
105
 
106
    time_t now = time(nullptr);
107
    using namespace AsyncFSWebServer;
108
    CJSON::Json doc;
109
    doc.setBool("addPoint", true);
110
    doc.setNumber("timestamp", (double)now);
111
#ifdef ESP32
112
    doc.setNumber("totalHeap", (double)heap_caps_get_free_size(0));
113
    doc.setNumber("maxBlock", (double)heap_caps_get_largest_free_block(0));
114
#elif defined(ESP8266)
115
    uint32_t free;
116
    uint32_t max;
117
    ESP.getHeapStats(&free, &max, nullptr);
118
    doc.setNumber("totalHeap", (double)free);
119
    doc.setNumber("maxBlock", (double)max);
120
#endif
121
    String msg = doc.serialize();
122
    server.wsBroadcast(msg.c_str());
123
  }
124
 
125
}