Skip to content

Commit dff5136

Browse files
committed
update ESP lib; add API endpoint; optimize code
1 parent d99a60d commit dff5136

File tree

2 files changed

+78
-45
lines changed

2 files changed

+78
-45
lines changed

platformio.ini

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
; https://docs.platformio.org/page/projectconf.html
1010

1111
[env:esp32dev]
12-
platform = espressif32@3.4.0
12+
platform = espressif32@3.5.0
1313
framework = arduino
1414

1515
board = esp32doit-devkit-v1
@@ -32,6 +32,8 @@ lib_deps =
3232
https://github.com/marvinroger/async-mqtt-client.git#v0.9.0
3333
tobiasschuerg/MH-Z CO2 Sensors @ ^1.4.0
3434
bblanchon/ArduinoJson @ ^6.19.4
35+
bblanchon/StreamUtils @ ^1.6.3
3536
juerd/ESP-WiFiSettings @ ^3.8.0
3637
adafruit/Adafruit SSD1306 @ ^2.5.6
3738
plerup/EspSoftwareSerial @ ^6.16.1
39+
ottowinter/ESPAsyncWebServer-esphome @ ^2.1.0

src/main.cpp

Lines changed: 75 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
#include <ArduinoOTA.h>
44
#include <AsyncMqttClient.h>
55
#include <ArduinoJson.h>
6+
#include <StreamUtils.h>
67
#include <SPIFFS.h>
78
#include <WiFiSettings.h>
89
#include <MHZ.h>
910
#include <Adafruit_GFX.h>
1011
#include <Adafruit_SSD1306.h>
1112
#include <Adafruit_I2CDevice.h>
13+
#include <ESPAsyncWebServer.h>
1214
#include <SoftwareSerial.h>
1315

1416
#include "config.h"
@@ -30,7 +32,7 @@ extern "C"
3032
#define DEVICE_ID (Sprintf("%06" PRIx64, ESP.getEfuseMac() >> 24)) // unique device ID
3133
#define uS_TO_S_FACTOR 1000000 // Conversion factor for micro seconds to seconds
3234

33-
String version = "1.1.3";
35+
String version = "1.2.0";
3436

3537
AsyncMqttClient mqttClient;
3638

@@ -40,6 +42,7 @@ TimerHandle_t wifiReconnectTimer;
4042

4143
MHZ co2Sensor(&Serial2, MHZ14A);
4244
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
45+
AsyncWebServer server(80);
4346

4447
// states
4548
bool isUpdating = false;
@@ -134,7 +137,8 @@ const char *getMqttTopic(String part)
134137
return topic.c_str();
135138
}
136139

137-
void sendInfo()
140+
// TODO change to StaticJsonDocument<>
141+
DynamicJsonDocument getInfoJson()
138142
{
139143
DynamicJsonDocument doc(1024);
140144
doc["version"] = version;
@@ -157,10 +161,15 @@ void sendInfo()
157161
co2Meter["temperature"] = lastTemperature;
158162
co2Meter["ppm"] = lastCo2Value > 0 ? lastCo2Value : 0;
159163

160-
String JS;
161-
serializeJson(doc, JS);
164+
return doc;
165+
}
166+
167+
void sendInfo()
168+
{
169+
StringStream stream;
170+
serializeJson(getInfoJson(), stream);
162171

163-
mqttClient.publish(getMqttTopic("out/info"), 1, false, JS.c_str());
172+
mqttClient.publish(getMqttTopic("out/info"), 1, false, stream.str().c_str());
164173

165174
lastInfoSend = millis();
166175
}
@@ -290,27 +299,27 @@ void connectToWifi()
290299
WiFiSettings.connect(true, 30);
291300
}
292301

293-
void setupTimers()
302+
void setupWebserver()
294303
{
295-
mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
296-
wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)1, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));
297-
}
304+
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
305+
{ request->send(200, "text/plain", "Hi! This is a sample response."); });
298306

299-
void setupDisplay()
300-
{
301-
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
307+
server.on("/api/info", HTTP_GET, [](AsyncWebServerRequest *request)
308+
{
309+
auto infoJson = getInfoJson();
302310

303-
delay(1000);
311+
StringStream stream;
312+
auto size = serializeJson(infoJson, stream);
304313

305-
display.clearDisplay();
314+
request->send(stream, "application/json", size); });
306315

307-
// demo output
308-
display.setTextColor(WHITE);
309-
display.setTextSize(1);
310-
display.setCursor(0, 0);
311-
display.print(">> co2 meter <<");
316+
server.begin();
317+
}
312318

313-
display.display();
319+
void setupTimers()
320+
{
321+
mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
322+
wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)1, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));
314323
}
315324

316325
void setupOTA()
@@ -391,6 +400,50 @@ void setupOTA()
391400
.begin();
392401
}
393402

403+
void setupWifiSettings()
404+
{
405+
WiFi.onEvent(onWiFiEvent);
406+
407+
WiFiSettings.secure = true;
408+
WiFiSettings.hostname = "co2-meter-"; // will auto add device ID
409+
WiFiSettings.password = PASSWORD;
410+
411+
// Set callbacks to start OTA when the portal is active
412+
WiFiSettings.onPortal = []()
413+
{
414+
isPortalActive = true;
415+
416+
Serial.println("WiFi config portal active");
417+
418+
setupOTA();
419+
};
420+
WiFiSettings.onPortalWaitLoop = []()
421+
{
422+
ArduinoOTA.handle();
423+
};
424+
WiFiSettings.onConfigSaved = []()
425+
{
426+
ESP.restart();
427+
};
428+
}
429+
430+
void setupDisplay()
431+
{
432+
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
433+
434+
delay(1000);
435+
436+
display.clearDisplay();
437+
438+
// demo output
439+
display.setTextColor(WHITE);
440+
display.setTextSize(1);
441+
display.setCursor(0, 0);
442+
display.print(">> co2 meter <<");
443+
444+
display.display();
445+
}
446+
394447
void detect_wakeup_reason()
395448
{
396449
esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
@@ -437,30 +490,8 @@ void setup()
437490
// SPIFFS.format(); // TODO reset config on connection MQTT fail
438491

439492
setupTimers();
440-
441-
WiFi.onEvent(onWiFiEvent);
442-
443-
WiFiSettings.secure = true;
444-
WiFiSettings.hostname = "co2-meter-"; // will auto add device ID
445-
WiFiSettings.password = PASSWORD;
446-
447-
// Set callbacks to start OTA when the portal is active
448-
WiFiSettings.onPortal = []()
449-
{
450-
isPortalActive = true;
451-
452-
Serial.println("WiFi config portal active");
453-
454-
setupOTA();
455-
};
456-
WiFiSettings.onPortalWaitLoop = []()
457-
{
458-
ArduinoOTA.handle();
459-
};
460-
WiFiSettings.onConfigSaved = []()
461-
{
462-
ESP.restart();
463-
};
493+
setupWifiSettings();
494+
setupWebserver();
464495

465496
// define custom settings
466497
mqtt_host = WiFiSettings.string("mqtt_host", "192.168.1.1");

0 commit comments

Comments
 (0)