Adafruit Library
ws_uart_drv_pm25aqi.h
Go to the documentation of this file.
1 
15 #ifndef WS_UART_DRV_PM25AQI_H
16 #define WS_UART_DRV_PM25AQI_H
17 
18 #include "Wippersnapper.h"
19 #include "ws_uart_drv.h"
20 #include <Adafruit_PM25AQI.h>
21 
22 /**************************************************************************/
26 /**************************************************************************/
28 public:
29 #ifdef USE_SW_UART
30  /*******************************************************************************/
38  /*******************************************************************************/
39  ws_uart_drv_pm25aqi(SoftwareSerial *swSerial, int32_t interval)
40  : ws_uart_drv(swSerial, interval) {
41  _swSerial = swSerial;
42  pollingInterval = (unsigned long)interval;
43  };
44 #else
45  /*******************************************************************************/
53  /*******************************************************************************/
54  ws_uart_drv_pm25aqi(HardwareSerial *hwSerial, int32_t interval)
55  : ws_uart_drv(hwSerial, interval) {
56  _hwSerial = hwSerial;
57  pollingInterval = (unsigned long)interval;
58  };
59 #endif // USE_SW_UART
60 
61  /*******************************************************************************/
65  /*******************************************************************************/
67  delete _aqi;
68 #ifdef USE_SW_UART
69  _swSerial = nullptr;
70 #else
71  _hwSerial = nullptr;
72 #endif
73  }
74 
75  /*******************************************************************************/
81  /*******************************************************************************/
82  bool begin() override {
83  _aqi = new Adafruit_PM25AQI();
84 #ifdef USE_SW_UART
85  if (!_aqi->begin_UART(
86  _swSerial)) { // connect to the sensor over software serial
87  return false;
88  }
89 #else
90  if (!_aqi->begin_UART(
91  _hwSerial)) { // connect to the sensor over hardware serial
92  return false;
93  }
94 #endif
95  return true;
96  }
97 
98  /*******************************************************************************/
103  /*******************************************************************************/
104  bool read_data() override {
105  Serial.println("[UART, PM25] Reading data...");
106  // Attempt to read the PM2.5 Sensor
107  if (!_aqi->read(&_data)) {
108  Serial.println("[UART, PM25] Data not available.");
109  delay(500);
110  return false;
111  }
112  Serial.println("[UART, PM25] Read data OK");
113  Serial.println();
114  Serial.println(F("---------------------------------------"));
115  Serial.println(F("Concentration Units (standard)"));
116  Serial.println(F("---------------------------------------"));
117  Serial.print(F("PM 1.0: "));
118  Serial.print(_data.pm10_standard);
119  Serial.print(F("\t\tPM 2.5: "));
120  Serial.print(_data.pm25_standard);
121  Serial.print(F("\t\tPM 10: "));
122  Serial.println(_data.pm100_standard);
123  Serial.println(F("Concentration Units (environmental)"));
124  Serial.println(F("---------------------------------------"));
125  Serial.print(F("PM 1.0: "));
126  Serial.print(_data.pm10_env);
127  Serial.print(F("\t\tPM 2.5: "));
128  Serial.print(_data.pm25_env);
129  Serial.print(F("\t\tPM 10: "));
130  Serial.println(_data.pm100_env);
131  Serial.println(F("---------------------------------------"));
132 
133  return true;
134  }
135 
136  /*******************************************************************************/
140  /*******************************************************************************/
141  void send_data() override {
142  // Create a new UART response message
143  wippersnapper_signal_v1_UARTResponse msgUARTResponse =
144  wippersnapper_signal_v1_UARTResponse_init_zero;
145  msgUARTResponse.which_payload =
146  wippersnapper_signal_v1_UARTResponse_resp_uart_device_event_tag;
147  strcpy(msgUARTResponse.payload.resp_uart_device_event.device_id,
148  getDriverID());
149 
150  // check if driverID is pm1006
151  if (strcmp(getDriverID(), "pm1006") == 0) {
152  // PM1006 returns only PM2.5_ENV readings
153  msgUARTResponse.payload.resp_uart_device_event.sensor_event_count = 1;
154  packUARTResponse(&msgUARTResponse, 0,
155  wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM25_ENV,
156  (float)_data.pm25_env);
157  } else {
158  msgUARTResponse.payload.resp_uart_device_event.sensor_event_count = 6;
159  packUARTResponse(&msgUARTResponse, 0,
160  wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM10_STD,
161  (float)_data.pm10_standard);
162 
163  packUARTResponse(&msgUARTResponse, 1,
164  wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM25_STD,
165  (float)_data.pm25_standard);
166 
167  packUARTResponse(&msgUARTResponse, 2,
168  wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM100_STD,
169  (float)_data.pm100_standard);
170 
171  packUARTResponse(&msgUARTResponse, 3,
172  wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM10_ENV,
173  (float)_data.pm10_env);
174 
175  packUARTResponse(&msgUARTResponse, 4,
176  wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM25_ENV,
177  (float)_data.pm25_env);
178 
179  packUARTResponse(&msgUARTResponse, 5,
180  wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM100_ENV,
181  (float)_data.pm100_env);
182  }
183 
184  // Encode message data
185  uint8_t mqttBuffer[512] = {0};
186  pb_ostream_t ostream =
187  pb_ostream_from_buffer(mqttBuffer, sizeof(mqttBuffer));
188  if (!ws_pb_encode(&ostream, wippersnapper_signal_v1_UARTResponse_fields,
189  &msgUARTResponse)) {
190  Serial.println("[ERROR, UART]: Unable to encode device response!");
191  return;
192  }
193 
194  // Publish message to IO
195  size_t msgSz;
196  pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_UARTResponse_fields,
197  &msgUARTResponse);
198  Serial.print("[UART] Publishing event to IO..");
199  mqttClient->publish(uartTopic, mqttBuffer, msgSz, 1);
200  Serial.println("Published!");
201 
202  setPrvPollTime(millis());
203  }
204 
205 protected:
206  Adafruit_PM25AQI *_aqi = nullptr;
207  PM25_AQI_Data _data;
208 #ifdef USE_SW_UART
209  SoftwareSerial *_swSerial = nullptr;
210 #else
211  HardwareSerial *_hwSerial = nullptr;
212 #endif
213 };
214 
215 #endif // WS_UART_DRV_PM25AQI_H
const char * getDriverID()
Gets the UART device&#39;s unique identifier.
Definition: ws_uart_drv.h:92
void send_data() override
Packs and sends the device&#39;s event data to Adafruit IO.
Definition: ws_uart_drv_pm25aqi.h:141
bool read_data() override
Attempts to read data from the PM25AQI sensor.
Definition: ws_uart_drv_pm25aqi.h:104
PM25_AQI_Data _data
PM25AQI sensor data struct.
Definition: ws_uart_drv_pm25aqi.h:207
unsigned long pollingInterval
UART device&#39;s polling interval, in milliseconds.
Definition: ws_uart_drv.h:168
const char * uartTopic
UART device&#39;s MQTT topic.
Definition: ws_uart_drv.h:165
Adafruit_PM25AQI * _aqi
Pointer to PM25AQI sensor object.
Definition: ws_uart_drv_pm25aqi.h:206
ws_uart_drv_pm25aqi(HardwareSerial *hwSerial, int32_t interval)
Initializes the PM25AQI UART device driver.
Definition: ws_uart_drv_pm25aqi.h:54
~ws_uart_drv_pm25aqi()
Destructor for a PM25AQI sensor.
Definition: ws_uart_drv_pm25aqi.h:66
Class that provides an interface for a PM25 AQI UART sensor.
Definition: ws_uart_drv_pm25aqi.h:27
bool begin() override
Initializes a PM25AQI sensor.
Definition: ws_uart_drv_pm25aqi.h:82
ws_uart_drv(HardwareSerial *hwSerial, int32_t interval)
Initializes a UART device driver.
Definition: ws_uart_drv.h:59
Adafruit_MQTT * mqttClient
Pointer to MQTT client object.
Definition: ws_uart_drv.h:166
void setPrvPollTime(unsigned long curTime)
Sets the last time a UART device driver was polled.
Definition: ws_uart_drv.h:84
void packUARTResponse(wippersnapper_signal_v1_UARTResponse *msgUARTResponse, int event_index, wippersnapper_i2c_v1_SensorType sensor_type, float sensor_value)
Packs the UART device&#39;s data into a UARTResponse message.
Definition: ws_uart_drv.h:148
HardwareSerial * _hwSerial
Pointer to Hardware UART interface.
Definition: ws_uart_drv_pm25aqi.h:211
Base class for UART Device Drivers.
Definition: ws_uart_drv.h:36