-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReadSensors.ino
156 lines (128 loc) · 3.15 KB
/
ReadSensors.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "Wire.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define iaqI2CAddress 0x5A
#define SEALEVELPRESSURE_HPA (1013.25)
// Holds data from the BME 280 sensor
struct Bme280Data
{
float tempriture = 0.0F;
float humidity = 0.0F;
float pressure = 0.0F;
};
// Holds data from the IAQ sensor
struct IaqData
{
uint8_t statusCode = 0u;
uint16_t co2Ppm = 0u;
int32_t resistance = 0;
uint16_t tvocPpm = 0u;
};
// Reads data out of the IAQ sensor
// Solution provided by this thread: https://forum.arduino.cc/index.php?topic=350712.0
IaqData GetIaqData()
{
Wire.requestFrom(iaqI2CAddress, 9);
IaqData result;
result.co2Ppm = (Wire.read()<< 8 | Wire.read());
result.statusCode = Wire.read();
result.resistance = (Wire.read()& 0x00)| (Wire.read()<<16)| (Wire.read()<<8| Wire.read());
result.tvocPpm = (Wire.read()<<8 | Wire.read());
return result;
}
// Reads data from the BME 280 sensor
Bme280Data GetBme280Data(Adafruit_BME280 bme)
{
bme.takeForcedMeasurement();
Bme280Data result;
result.tempriture = bme.readTemperature();
result.pressure = bme.readPressure() / 100.0F;
result.humidity = bme.readHumidity();
return result;
}
// The current BME 280 instance
Adafruit_BME280 bme;
// Indicates that the BME 280 is in a good state
bool bmeOkay;
void setup()
{
Serial.begin(9600);
Wire.begin();
// Create BME280 sesor
bmeOkay = bme.begin();
if (bmeOkay)
{
bme.setSampling(Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X16, // temperature
Adafruit_BME280::SAMPLING_X16, // pressure
Adafruit_BME280::SAMPLING_X16, // humidity
Adafruit_BME280::FILTER_OFF);
}
}
bool CheckIfCanSendData()
{
// Wait to recive some data before sending a reading
if (Serial.available() > 0)
{
while (Serial.available() > 0)
{
// Look for a line feed to be sent to us (ASCII 10)
int incomingByte = Serial.read();
if (incomingByte == 10)
{
return true;
}
}
}
else
{
return false;
}
}
void loop()
{
if (!CheckIfCanSendData())
{
return;
}
IaqData iaqData;
Bme280Data bmeData;
iaqData = GetIaqData();
if (bmeOkay)
{
bmeData = GetBme280Data(bme);
}
// Build out the JSON object the hard way
// obj = {
// status: true,
// errorText: '',
// iaQStatus: 0,
// co2: 100,
// tvoc: 200,
// temp: 20,
// humidity: 40,
// pressure: 1000
// };
Serial.print("{");
Serial.print("\"status\":");
Serial.print(bmeOkay);
Serial.print(",");
Serial.print("\"iaQStatus\":");
Serial.print(iaqData.statusCode);
Serial.print(",");
Serial.print("\"co2\":");
Serial.print(iaqData.co2Ppm);
Serial.print(",");
Serial.print("\"tvoc\":");
Serial.print(iaqData.tvocPpm);
Serial.print(",");
Serial.print("\"temp\":");
Serial.print(bmeData.tempriture);
Serial.print(",");
Serial.print("\"humidity\":");
Serial.print(bmeData.humidity);
Serial.print(",");
Serial.print("\"pressure\":");
Serial.print(bmeData.pressure);
Serial.println("}");
}