42#define CHIP_NAME "PLANTOWER PMSX003"
43#define MANUFACTURER_NAME "PLANTOWER"
44#define SUPPLY_VOLTAGE_MIN 4.5f
45#define SUPPLY_VOLTAGE_MAX 5.5f
46#define MAX_CURRENT 100.0f
47#define TEMPERATURE_MIN -10.0f
48#define TEMPERATURE_MAX 60.0f
49#define DRIVER_VERSION 1000
54#define PMSX003_COMMAND_READ 0xE2
55#define PMSX003_COMMAND_CHANGE_WORKING_MODE 0xE1
56#define PMSX003_COMMAND_CHANGE_CHIP_MODE 0xE4
68static uint8_t a_pmsx003_make_frame(uint8_t command, uint8_t data, uint8_t output[7])
80 for (i = 0; i < 5; i++)
84 output[5] = (lrc >> 8) & 0xFF;
85 output[6] = (lrc >> 0) & 0xFF;
101static uint8_t a_pmsx003_parse_frame(
pmsx003_handle_t *handle, uint8_t input[8], uint8_t command, uint8_t *data)
108 for (i = 0; i < 6; i++)
112 lrc_check = ((uint16_t)input[6] << 8) | input[7];
113 if (lrc != lrc_check)
115 handle->
debug_print(
"pmsx003: lrc check error.\n");
119 if ((input[0] == 0x42) && (input[1] == 0x4D))
123 len = ((uint16_t)input[2] << 8) | input[3];
128 if (input[4] != command)
159 for (i = 0; i < 30; i++)
163 lrc_check = ((uint16_t)input[30] << 8) | input[31];
164 if (lrc != lrc_check)
166 handle->
debug_print(
"pmsx003: lrc check error.\n");
170 if ((input[0] == 0x42) && (input[1] == 0x4D))
174 len = ((uint16_t)input[2] << 8) | input[3];
186 data->
beyond_0p3um = ((uint16_t)input[16] << 8) | input[17];
187 data->
beyond_0p5um = ((uint16_t)input[18] << 8) | input[19];
188 data->
beyond_1p0um = ((uint16_t)input[20] << 8) | input[21];
189 data->
beyond_2p5um = ((uint16_t)input[22] << 8) | input[23];
190 data->
beyond_5p0um = ((uint16_t)input[24] << 8) | input[25];
191 data->
beyond_10um = ((uint16_t)input[26] << 8) | input[27];
227 handle->
debug_print(
"pmsx003: uart_init is null.\n");
233 handle->
debug_print(
"pmsx003: uart_deinit is null.\n");
239 handle->
debug_print(
"pmsx003: uart_read is null.\n");
245 handle->
debug_print(
"pmsx003: uart_flush is null.\n");
251 handle->
debug_print(
"pmsx003: uart_write is null.\n");
257 handle->
debug_print(
"pmsx003: reset_gpio_init is null.\n");
263 handle->
debug_print(
"pmsx003: reset_gpio_deinit is null.\n");
269 handle->
debug_print(
"pmsx003: reset_gpio_write is null.\n");
275 handle->
debug_print(
"pmsx003: set_gpio_init is null.\n");
281 handle->
debug_print(
"pmsx003: set_gpio_deinit is null.\n");
287 handle->
debug_print(
"pmsx003: set_gpio_write is null.\n");
293 handle->
debug_print(
"pmsx003: delay_ms is null.\n");
300 handle->
debug_print(
"pmsx003: reset gpio init failed.\n");
306 handle->
debug_print(
"pmsx003: set gpio init failed.\n");
313 handle->
debug_print(
"pmsx003: uart init failed.\n");
321 handle->
debug_print(
"pmsx003: set gpio write failed.\n");
331 handle->
debug_print(
"pmsx003: set gpio write failed.\n");
341 handle->
debug_print(
"pmsx003: set gpio write failed.\n");
352 handle->
debug_print(
"pmsx003: uart flush failed.\n");
388 handle->
debug_print(
"pmsx003: reset gpio deinit failed.\n");
394 handle->
debug_print(
"pmsx003: set gpio deinit failed.\n");
400 handle->
debug_print(
"pmsx003: uart deinit failed.\n");
432 handle->
debug_print(
"pmsx003: set gpio write failed.\n");
439 handle->
debug_print(
"pmsx003: set gpio write failed.\n");
470 if ((uint8_t)mode != 0)
474 handle->
debug_print(
"pmsx003: set gpio write failed.\n");
483 handle->
debug_print(
"pmsx003: set gpio write failed.\n");
526 handle->
debug_print(
"pmsx003: uart flush failed.\n");
533 handle->
debug_print(
"pmsx003: uart write failed.\n");
541 handle->
debug_print(
"pmsx003: uart read failed.\n");
552 if (data != (uint8_t)mode)
554 handle->
debug_print(
"pmsx003: set mode failed.\n");
558 handle->
mode = (uint8_t)mode;
595 handle->
debug_print(
"pmsx003: uart flush failed.\n");
602 handle->
debug_print(
"pmsx003: uart write failed.\n");
610 handle->
debug_print(
"pmsx003: uart read failed.\n");
621 if (data != (uint8_t)0x00)
660 handle->
debug_print(
"pmsx003: uart flush failed.\n");
667 handle->
debug_print(
"pmsx003: uart write failed.\n");
705 if (handle->
mode != 0)
710 handle->
debug_print(
"pmsx003: uart read failed.\n");
717 handle->
debug_print(
"pmsx003: uart flush failed.\n");
721 res = a_pmsx003_parse_data(handle, input, data);
741 handle->
debug_print(
"pmsx003: uart flush failed.\n");
748 handle->
debug_print(
"pmsx003: uart write failed.\n");
756 handle->
debug_print(
"pmsx003: uart read failed.\n");
760 res = a_pmsx003_parse_data(handle, input, data);
806 handle->
debug_print(
"pmsx003: uart flush failed.\n");
813 handle->
debug_print(
"pmsx003: uart write failed.\n");
846 l = handle->
uart_read((uint8_t *)buf, len);
849 handle->
debug_print(
"pmsx003: uart read failed.\n");
#define PMSX003_COMMAND_CHANGE_CHIP_MODE
#define PMSX003_COMMAND_READ
chip command definition
#define SUPPLY_VOLTAGE_MAX
#define MANUFACTURER_NAME
#define SUPPLY_VOLTAGE_MIN
#define PMSX003_COMMAND_CHANGE_WORKING_MODE
#define CHIP_NAME
chip information definition
driver pmsx003 header file
pmsx003_mode_t
pmsx003 mode enumeration definition
uint8_t pmsx003_set_hard_mode(pmsx003_handle_t *handle, pmsx003_hard_mode_t mode)
set hard mode
uint8_t pmsx003_sleep(pmsx003_handle_t *handle)
sleep
uint8_t pmsx003_read(pmsx003_handle_t *handle, pmsx003_data_t *data)
read the data
struct pmsx003_info_s pmsx003_info_t
pmsx003 information structure definition
uint8_t pmsx003_reset(pmsx003_handle_t *handle)
reset
uint8_t pmsx003_info(pmsx003_info_t *info)
get chip's information
pmsx003_hard_mode_t
pmsx003 hard mode enumeration definition
struct pmsx003_handle_s pmsx003_handle_t
pmsx003 handle structure definition
uint8_t pmsx003_deinit(pmsx003_handle_t *handle)
close the chip
uint8_t pmsx003_init(pmsx003_handle_t *handle)
initialize the chip
struct pmsx003_data_s pmsx003_data_t
pmsx003 data structure definition
uint8_t pmsx003_wake_up(pmsx003_handle_t *handle)
wake up
uint8_t pmsx003_set_mode(pmsx003_handle_t *handle, pmsx003_mode_t mode)
set mode
uint8_t pmsx003_get_buffer(pmsx003_handle_t *handle, uint8_t *buf, uint16_t len)
get buffer
uint8_t pmsx003_set_buffer(pmsx003_handle_t *handle, uint8_t *buf, uint16_t len)
set buffer
uint16_t pm2p5_standard_ug_m3
uint16_t pm10_atmospheric_ug_m3
uint16_t pm1p0_standard_ug_m3
uint16_t pm1p0_atmospheric_ug_m3
uint16_t pm2p5_atmospheric_ug_m3
uint16_t pm10_standard_ug_m3
uint8_t(* uart_flush)(void)
uint8_t(* uart_write)(uint8_t *buf, uint16_t len)
void(* delay_ms)(uint32_t ms)
uint8_t(* uart_deinit)(void)
uint8_t(* set_gpio_init)(void)
uint8_t(* set_gpio_deinit)(void)
uint8_t(* reset_gpio_deinit)(void)
uint8_t(* set_gpio_write)(uint8_t level)
void(* debug_print)(const char *const fmt,...)
uint16_t(* uart_read)(uint8_t *buf, uint16_t len)
uint8_t(* reset_gpio_init)(void)
uint8_t(* uart_init)(void)
uint8_t(* reset_gpio_write)(uint8_t level)
float supply_voltage_max_v
char manufacturer_name[32]
float supply_voltage_min_v