Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
AirQMon
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jan Grewe
AirQMon
Commits
875b88c1
Commit
875b88c1
authored
Nov 15, 2021
by
Jan Grewe
Browse files
Options
Downloads
Patches
Plain Diff
data acquisition stable
TODO: - UI - websockets - BME680 state
parent
22eae26d
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
platformio.ini
+1
-0
1 addition, 0 deletions
platformio.ini
src/main.cpp
+150
-90
150 additions, 90 deletions
src/main.cpp
with
151 additions
and
90 deletions
platformio.ini
+
1
−
0
View file @
875b88c1
...
...
@@ -26,6 +26,7 @@ lib_deps =
avaldebe/PMSerial
@
^1.1.1
boschsensortec/BSEC
Software
Library
@
^1.6.1480
knolleary/PubSubClient
@
^2.8
spacehuhn/SimpleMap
@
^1.0.0
[env:d1_mini_ota]
extends
=
env:d1_mini
...
...
This diff is collapsed.
Click to expand it.
src/main.cpp
+
150
−
90
View file @
875b88c1
...
...
@@ -11,6 +11,7 @@
#include
<PMserial.h>
#include
<bsec.h>
#include
<PubSubClient.h>
#include
<SimpleMap.h>
#define PMS_TX D3
#define PMS_RX D4
...
...
@@ -24,8 +25,7 @@ Bsec iaqSensor;
PubSubClient
mqttClient
(
wifiClient
);
IPAddress
mqttServer
;
long
checkMillis
=
0
;
long
checkInterval
=
5000
;
// 5s
SimpleMap
<
String
,
double
>
*
sensorData
;
void
logLine
(
String
line
,
bool
newline
=
true
)
{
...
...
@@ -67,6 +67,13 @@ void setupWifi()
}
}
void
setupMDNS
()
{
if
(
!
MDNS
.
begin
(
HOSTNAME
))
{
Serial
.
println
(
"Error setting up MDNS responder!"
);
}
MDNS
.
addService
(
"http"
,
"tcp"
,
80
);
}
String
getContentType
(
String
filename
)
{
// convert the file extension to the MIME type
if
(
filename
.
endsWith
(
".html"
))
...
...
@@ -113,7 +120,8 @@ void setupWebserver()
server
.
begin
();
}
void
messageReceived
(
String
&
topic
,
String
&
payload
)
{
void
messageReceived
(
String
&
topic
,
String
&
payload
)
{
Serial
.
println
(
"incoming: "
+
topic
+
" - "
+
payload
);
}
...
...
@@ -139,6 +147,7 @@ void setupMQTT()
if
(
mqttServer
.
fromString
(
MQTT_HOST
))
{
mqttClient
.
setServer
(
mqttServer
,
1883
);
mqttClient
.
setBufferSize
(
512
);
}
else
{
...
...
@@ -150,7 +159,8 @@ void setupMQTT()
void
setupOTA
()
{
ArduinoOTA
.
setHostname
(
HOSTNAME
);
ArduinoOTA
.
onStart
([]()
{
ArduinoOTA
.
onStart
([]()
{
String
type
;
if
(
ArduinoOTA
.
getCommand
()
==
U_FLASH
)
{
...
...
@@ -163,13 +173,12 @@ void setupOTA()
}
Serial
.
println
(
"Start updating "
+
type
);
});
ArduinoOTA
.
onProgress
([](
unsigned
int
progress
,
unsigned
int
total
)
{
Serial
.
printf
(
"Progress: %u%%
\r
"
,
(
progress
/
(
total
/
100
)));
});
ArduinoOTA
.
onEnd
([]()
{
Serial
.
println
(
"
\n
End"
);
});
ArduinoOTA
.
onError
([](
ota_error_t
error
)
{
ArduinoOTA
.
onProgress
([](
unsigned
int
progress
,
unsigned
int
total
)
{
Serial
.
printf
(
"Progress: %u%%
\r
"
,
(
progress
/
(
total
/
100
)));
});
ArduinoOTA
.
onEnd
([]()
{
Serial
.
println
(
"
\n
End"
);
});
ArduinoOTA
.
onError
([](
ota_error_t
error
)
{
Serial
.
printf
(
"Error[%u]: "
,
error
);
if
(
error
==
OTA_AUTH_ERROR
)
Serial
.
println
(
"Auth Failed"
);
...
...
@@ -187,7 +196,6 @@ void setupOTA()
void
setupPms
()
{
Serial
.
println
(
"Initializing PMS, wait 30 seconds for stable readings..."
);
swSerial
.
begin
(
9600
,
SWSERIAL_8N1
,
PMS_RX
,
PMS_TX
);
pms
.
init
();
}
...
...
@@ -221,8 +229,8 @@ void checkIaqSensorStatus(void)
void
setupBme
()
{
Wire
.
begin
();
iaqSensor
.
begin
(
BME680_I2C_ADDR_PRIMARY
,
Wire
);
logLine
(
"
\n
BSEC library version "
+
String
(
iaqSensor
.
version
.
major
)
+
"."
+
String
(
iaqSensor
.
version
.
minor
)
+
"."
+
String
(
iaqSensor
.
version
.
major_bugfix
)
+
"."
+
String
(
iaqSensor
.
version
.
minor_bugfix
));
checkIaqSensorStatus
();
bsec_virtual_sensor_t
sensorList
[
10
]
=
{
BSEC_OUTPUT_RAW_TEMPERATURE
,
...
...
@@ -243,7 +251,6 @@ void setupBme()
void
setup
()
{
Wire
.
begin
();
Serial
.
begin
(
115200
);
delay
(
10
);
Serial
.
println
();
...
...
@@ -253,23 +260,31 @@ void setup()
setupOTA
();
setupWebserver
();
setupMQTT
();
sensorData
=
new
SimpleMap
<
String
,
double
>
([](
String
&
a
,
String
&
b
)
->
int
{
if
(
a
==
b
)
return
0
;
if
(
a
>
b
)
return
1
;
/*if (a < b)*/
return
-
1
;
});
}
String
readPms
()
void
readPms
()
{
pms
.
read
();
if
(
pms
)
{
// successfull read
Serial
.
printf
(
"PM <= 1µm: %5d µg/m³
\r\n
"
,
pms
.
pm01
);
Serial
.
printf
(
"PM <=2.5µm: %5d µg/m³
\r\n
"
,
pms
.
pm25
);
Serial
.
printf
(
"PM <= 10µm: %5d µg/m³
\r\n
"
,
pms
.
pm10
);
Serial
.
printf
(
"NC >=0.3µm: %5d #/100cm³
\r\n
"
,
pms
.
n0p3
);
Serial
.
printf
(
"NC >=0.5µm: %5d #/100cm³
\r\n
"
,
pms
.
n0p5
);
Serial
.
printf
(
"NC >= 1µm: %5d #/100cm³
\r\n
"
,
pms
.
n1p0
);
Serial
.
printf
(
"NC >=2.5µm: %5d #/100cm³
\r\n
"
,
pms
.
n2p5
);
Serial
.
printf
(
"NC >= 5µm: %5d #/100cm³
\r\n
"
,
pms
.
n5p0
);
Serial
.
printf
(
"NC >= 10µm: %5d #/100cm³
\r\n
"
,
pms
.
n10p0
);
logLine
(
"-----"
);
sensorData
->
put
(
"pm1"
,
pms
.
pm01
);
sensorData
->
put
(
"pm2.5"
,
pms
.
pm25
);
sensorData
->
put
(
"pm10"
,
pms
.
pm10
);
sensorData
->
put
(
"nc0.3"
,
pms
.
n0p3
);
sensorData
->
put
(
"nc0.5"
,
pms
.
n0p5
);
sensorData
->
put
(
"nc1"
,
pms
.
n1p0
);
sensorData
->
put
(
"nc2.5"
,
pms
.
n2p5
);
sensorData
->
put
(
"nc5"
,
pms
.
n5p0
);
sensorData
->
put
(
"nc10"
,
pms
.
n10p0
);
}
else
{
...
...
@@ -303,41 +318,61 @@ String readPms()
break
;
}
}
String
pmData
=
"pm1="
+
String
(
pms
.
data
[
0
])
+
",pm2.5="
+
String
(
pms
.
data
[
1
])
+
",pm10="
+
String
(
pms
.
data
[
2
]);
String
ncData
=
"nc0.3="
+
String
(
pms
.
data
[
3
])
+
",nc0.5="
+
String
(
pms
.
data
[
4
])
+
",nc1="
+
String
(
pms
.
data
[
5
])
+
",nc2.5="
+
String
(
pms
.
data
[
6
])
+
",nc5="
+
String
(
pms
.
data
[
7
])
+
",nc10="
+
String
(
pms
.
data
[
8
]);
return
pmData
+
","
+
ncData
;
}
String
readBme
()
void
logPms
()
{
Serial
.
printf
(
"PM <= 1µm: %5d µg/m³
\r\n
"
,
(
int
)
sensorData
->
get
(
"pm1"
));
Serial
.
printf
(
"PM <=2.5µm: %5d µg/m³
\r\n
"
,
(
int
)
sensorData
->
get
(
"pm2.5"
));
Serial
.
printf
(
"PM <= 10µm: %5d µg/m³
\r\n
"
,
(
int
)
sensorData
->
get
(
"pm10"
));
Serial
.
printf
(
"NC >=0.3µm: %5d #/100cm³
\r\n
"
,
(
int
)
sensorData
->
get
(
"nc0.3"
));
Serial
.
printf
(
"NC >=0.5µm: %5d #/100cm³
\r\n
"
,
(
int
)
sensorData
->
get
(
"nc0.5"
));
Serial
.
printf
(
"NC >= 1µm: %5d #/100cm³
\r\n
"
,
(
int
)
sensorData
->
get
(
"nc1"
));
Serial
.
printf
(
"NC >=2.5µm: %5d #/100cm³
\r\n
"
,
(
int
)
sensorData
->
get
(
"nc2.5"
));
Serial
.
printf
(
"NC >= 5µm: %5d #/100cm³
\r\n
"
,
(
int
)
sensorData
->
get
(
"nc5"
));
Serial
.
printf
(
"NC >= 10µm: %5d #/100cm³
\r\n
"
,
(
int
)
sensorData
->
get
(
"nc10"
));
}
void
readBme
()
{
if
(
iaqSensor
.
run
())
{
// If new data is available
Serial
.
printf
(
"Temperature : %f °C
\r\n
"
,
iaqSensor
.
temperature
);
Serial
.
printf
(
"Humidity : %f %%
\r\n
"
,
iaqSensor
.
humidity
);
Serial
.
printf
(
"Pressure : %f hPa
\r\n
"
,
iaqSensor
.
pressure
);
Serial
.
printf
(
"IAQ : %f
\r\n
"
,
iaqSensor
.
iaq
);
Serial
.
printf
(
"IAQ Accuracy : %d
\r\n
"
,
iaqSensor
.
iaqAccuracy
);
Serial
.
printf
(
"Static IAQ : %f
\r\n
"
,
iaqSensor
.
staticIaq
);
Serial
.
printf
(
"Stat IAQ Acc : %d
\r\n
"
,
iaqSensor
.
staticIaqAccuracy
);
Serial
.
printf
(
"CO2 Equiv : %f
\r\n
"
,
iaqSensor
.
co2Equivalent
);
Serial
.
printf
(
"CO2 Accuracy : %d
\r\n
"
,
iaqSensor
.
co2Accuracy
);
Serial
.
printf
(
"bVOC Equiv : %f
\r\n
"
,
iaqSensor
.
breathVocEquivalent
);
Serial
.
printf
(
"bVOC Accuracy: %d
\r\n
"
,
iaqSensor
.
breathVocAccuracy
);
Serial
.
printf
(
"Gas Percent : %f %%
\r\n
"
,
iaqSensor
.
gasPercentage
);
Serial
.
printf
(
"Gas Per Accur: %d
\r\n
"
,
iaqSensor
.
gasPercentageAcccuracy
);
Serial
.
printf
(
"Raw Temp : %f °C
\r\n
"
,
iaqSensor
.
rawTemperature
);
Serial
.
printf
(
"Raw Rel Humid: %f %%
\r\n
"
,
iaqSensor
.
rawHumidity
);
Serial
.
printf
(
"Gas Resist : %f Ohm
\r\n
"
,
iaqSensor
.
gasResistance
);
sensorData
->
put
(
"temperature"
,
iaqSensor
.
temperature
);
sensorData
->
put
(
"humidity"
,
iaqSensor
.
humidity
);
sensorData
->
put
(
"pressure"
,
iaqSensor
.
pressure
);
sensorData
->
put
(
"iaq"
,
iaqSensor
.
iaq
);
sensorData
->
put
(
"iaq_acc"
,
iaqSensor
.
iaqAccuracy
);
sensorData
->
put
(
"siaq"
,
iaqSensor
.
staticIaq
);
sensorData
->
put
(
"siaq_acc"
,
iaqSensor
.
staticIaqAccuracy
);
sensorData
->
put
(
"eco2"
,
iaqSensor
.
co2Equivalent
);
sensorData
->
put
(
"eco2_acc"
,
iaqSensor
.
co2Accuracy
);
sensorData
->
put
(
"bvoc"
,
iaqSensor
.
breathVocEquivalent
);
sensorData
->
put
(
"bvoc_acc"
,
iaqSensor
.
breathVocAccuracy
);
}
else
{
checkIaqSensorStatus
();
}
return
"temperature="
+
String
(
iaqSensor
.
temperature
)
+
",humidity="
+
String
(
iaqSensor
.
humidity
)
+
",pressure="
+
String
(
iaqSensor
.
pressure
)
+
",iaq="
+
String
(
iaqSensor
.
iaq
)
+
",iaq_acc="
+
String
(
iaqSensor
.
iaqAccuracy
)
+
",s_iaq="
+
String
(
iaqSensor
.
staticIaq
)
+
",s_iaq_acc="
+
String
(
iaqSensor
.
staticIaqAccuracy
)
+
",eco2="
+
String
(
iaqSensor
.
co2Equivalent
)
+
",eco2_acc="
+
String
(
iaqSensor
.
co2Accuracy
)
+
",bvoc="
+
String
(
iaqSensor
.
breathVocEquivalent
)
+
",bvoc_acc="
+
String
(
iaqSensor
.
breathVocAccuracy
);
}
void
logBme
()
{
Serial
.
printf
(
"Temperature : %.2f °C
\r\n
"
,
sensorData
->
get
(
"temperature"
));
Serial
.
printf
(
"Humidity : %.2f %%
\r\n
"
,
sensorData
->
get
(
"humidity"
));
Serial
.
printf
(
"Pressure : %d hPa
\r\n
"
,
(
int
)
sensorData
->
get
(
"pressure"
));
Serial
.
printf
(
"IAQ : %.2f
\r\n
"
,
sensorData
->
get
(
"iaq"
));
Serial
.
printf
(
"IAQ Accuracy : %d
\r\n
"
,
(
int
)
sensorData
->
get
(
"iaq_acc"
));
Serial
.
printf
(
"Static IAQ : %.2f
\r\n
"
,
sensorData
->
get
(
"siaq"
));
Serial
.
printf
(
"Stat IAQ Acc : %d
\r\n
"
,
(
int
)
sensorData
->
get
(
"siaq_acc"
));
Serial
.
printf
(
"CO2 Equiv : %.2f ppm
\r\n
"
,
sensorData
->
get
(
"eco2"
));
Serial
.
printf
(
"CO2 Accuracy : %d
\r\n
"
,
(
int
)
sensorData
->
get
(
"eco2_acc"
));
Serial
.
printf
(
"bVOC Equiv : %.2f ppm
\r\n
"
,
sensorData
->
get
(
"bvoc"
));
Serial
.
printf
(
"bVOC Accuracy: %d
\r\n
"
,
(
int
)
sensorData
->
get
(
"bvoc_acc"
));
//Serial.printf("Gas Percent : %f %%\r\n", iaqSensor.gasPercentage);
//Serial.printf("Gas Per Accur: %d\r\n", iaqSensor.gasPercentageAcccuracy);
//Serial.printf("Raw Temp : %f °C\r\n", iaqSensor.rawTemperature);
//Serial.printf("Raw Rel Humid: %f %%\r\n", iaqSensor.rawHumidity);
//Serial.printf("Gas Resist : %f Ohm\r\n", iaqSensor.gasResistance);
}
void
publishMetric
(
String
metricValues
)
...
...
@@ -350,42 +385,67 @@ void publishMetric(String metricValues)
mqttClient
.
publish
(
MQTT_TOPIC
,
payload
);
}
void
get
SensorData
()
void
read
SensorData
()
{
readPms
();
readBme
();
}
String
pmsData
=
readPms
();
String
bmeData
=
readBme
();
String
metricValues
=
pmsData
+
","
+
bmeData
;
void
sendSensorData
()
{
String
metricValues
;
for
(
int
i
=
0
;
i
<
sensorData
->
size
();
i
++
)
{
metricValues
+=
sensorData
->
getKey
(
i
)
+
"="
+
sensorData
->
getData
(
i
);
if
(
i
<
sensorData
->
size
()
-
1
)
{
metricValues
+=
","
;
}
}
publishMetric
(
metricValues
);
logLine
(
"#####"
);
}
void
logSensorData
()
{
logLine
(
"
\n
----- PMS5003 -----"
);
logPms
();
logLine
(
"
\n
----- BME680 -----"
);
logBme
();
logLine
(
"
\n
#####"
);
}
void
loop
()
{
ArduinoOTA
.
handle
();
server
.
handleClient
();
mdns
.
update
();
MDNS
.
update
();
unsigned
long
currentMillis
=
millis
();
if
(
currentMillis
-
checkMillis
>
checkInterval
)
static
unsigned
long
readTimer
=
millis
();
if
(
millis
()
-
readTimer
>=
1000
)
{
readSensorData
();
readTimer
=
millis
();
}
static
unsigned
long
sendTimer
=
millis
();
if
(
millis
()
-
sendTimer
>=
5000
)
{
if
((
WiFi
.
status
()
!=
WL_CONNECTED
))
{
logLine
(
"Wifi not connected, reconnecting..."
);
WiFi
.
disconnect
();
WiFi
.
reconnect
();
}
if
(
!
mqttClient
.
connected
())
{
logLine
(
"MQTT not connected, reconnecting..."
);
connectMQTT
();
}
checkMillis
=
currentMillis
;
}
mqttClient
.
loop
();
static
unsigned
long
updateTimer
=
millis
();
if
(
millis
()
-
updateTimer
>=
5000
)
{
updateTimer
=
millis
();
getSensorData
();
sendSensorData
();
logSensorData
();
sendTimer
=
millis
();
}
mqttClient
.
loop
();
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment