SP8EBC-ParaTNC/system/src/dust_sensor/sds011.c

46 wiersze
811 B
C
Czysty Zwykły widok Historia

2022-09-17 05:50:35 +00:00
/*
* sds011.c
*
* Created on: Sep 16, 2022
* Author: mateusz
*/
#include "dust_sensor/sds011.h"
int sds011_get_pms(uint8_t * data, uint16_t data_ln, uint16_t * pm_10, uint16_t * pm_2_5) {
if (pm_10 == 0 || pm_2_5 == 0) {
return -1;
}
uint16_t local_checksum = 0;
// values received from sensor
uint8_t head = *(data + 0);
uint8_t command_id = *(data + 1);
2022-09-18 04:59:53 +00:00
uint8_t checksum = *(data + 8);
2022-09-17 05:50:35 +00:00
2022-09-18 04:59:53 +00:00
if (command_id == 0xC0) {
// calculate checksum
for (int i = 2; i < 8; i++) {
local_checksum += *(data + i);
}
2022-09-17 05:50:35 +00:00
2022-09-18 04:59:53 +00:00
if ((local_checksum & 0xFF) != checksum) {
return -2;
}
2022-09-17 05:50:35 +00:00
2022-09-18 04:59:53 +00:00
local_checksum = *(data + 2) | (*(data + 3) << 8);
*pm_2_5 = local_checksum;
2022-09-17 05:50:35 +00:00
2022-09-18 04:59:53 +00:00
local_checksum = *(data + 4) | (*(data + 5) << 8);
*pm_10 = local_checksum;
2022-09-17 05:50:35 +00:00
2022-09-18 04:59:53 +00:00
return 0;
}
else {
return -3;
}
2022-09-17 05:50:35 +00:00
}