From 5dae491c2b5691489ad84a6ebb9528f3daec0591 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Sun, 18 Sep 2022 06:59:53 +0200 Subject: [PATCH] dust sensor: first working sketch --- .../system/src/davis_vantage/subdir.mk | 9 +++-- .../system/src/davis_vantage/subdir.mk | 9 +++-- src/config_data_default.c | 3 ++ src/config_data_first.c | 4 +++ src/config_data_second.c | 3 ++ src/main.c | 5 ++- system/src/davis_vantage/sds011.c | 35 +++++++++++-------- 7 files changed, 46 insertions(+), 22 deletions(-) diff --git a/STM32F100_ParaTNC/system/src/davis_vantage/subdir.mk b/STM32F100_ParaTNC/system/src/davis_vantage/subdir.mk index 88da1d7..dd71cc9 100644 --- a/STM32F100_ParaTNC/system/src/davis_vantage/subdir.mk +++ b/STM32F100_ParaTNC/system/src/davis_vantage/subdir.mk @@ -5,15 +5,18 @@ # Add inputs and outputs from these tool invocations to the build variables C_SRCS += \ ../system/src/davis_vantage/davis.c \ -../system/src/davis_vantage/davis_parsers.c +../system/src/davis_vantage/davis_parsers.c \ +../system/src/davis_vantage/sds011.c OBJS += \ ./system/src/davis_vantage/davis.o \ -./system/src/davis_vantage/davis_parsers.o +./system/src/davis_vantage/davis_parsers.o \ +./system/src/davis_vantage/sds011.o C_DEPS += \ ./system/src/davis_vantage/davis.d \ -./system/src/davis_vantage/davis_parsers.d +./system/src/davis_vantage/davis_parsers.d \ +./system/src/davis_vantage/sds011.d # Each subdirectory must supply rules for building sources it contributes diff --git a/STM32L476_ParaMETEO/system/src/davis_vantage/subdir.mk b/STM32L476_ParaMETEO/system/src/davis_vantage/subdir.mk index 6918645..5db2f3d 100644 --- a/STM32L476_ParaMETEO/system/src/davis_vantage/subdir.mk +++ b/STM32L476_ParaMETEO/system/src/davis_vantage/subdir.mk @@ -5,15 +5,18 @@ # Add inputs and outputs from these tool invocations to the build variables C_SRCS += \ ../system/src/davis_vantage/davis.c \ -../system/src/davis_vantage/davis_parsers.c +../system/src/davis_vantage/davis_parsers.c \ +../system/src/davis_vantage/sds011.c OBJS += \ ./system/src/davis_vantage/davis.o \ -./system/src/davis_vantage/davis_parsers.o +./system/src/davis_vantage/davis_parsers.o \ +./system/src/davis_vantage/sds011.o C_DEPS += \ ./system/src/davis_vantage/davis.d \ -./system/src/davis_vantage/davis_parsers.d +./system/src/davis_vantage/davis_parsers.d \ +./system/src/davis_vantage/sds011.d # Each subdirectory must supply rules for building sources it contributes diff --git a/src/config_data_default.c b/src/config_data_default.c index 5d10037..1b3859a 100644 --- a/src/config_data_default.c +++ b/src/config_data_default.c @@ -73,6 +73,9 @@ const config_data_mode_t __attribute__((section(".config_section_default.mode")) .wx_umb = 0, #endif +#ifdef _DUST_SDS011_SERIAL + .wx_dust_sensor = WX_DUST_SDS011_SERIAL, +#endif #ifdef _VICTRON .victron = 1, diff --git a/src/config_data_first.c b/src/config_data_first.c index ec5792b..c94e01d 100644 --- a/src/config_data_first.c +++ b/src/config_data_first.c @@ -93,6 +93,10 @@ const config_data_mode_t __attribute__((section(".config_section_first.mode"))) .wx_anemometer_pulses_constant = _ANEMOMETER_PULSES_IN_10SEC_PER_ONE_MS_OF_WINDSPEED, +#ifdef _DUST_SDS011_SERIAL + .wx_dust_sensor = WX_DUST_SDS011_SERIAL, +#endif + #ifdef _DIGI_ONLY_789 .digi_only_ssids = 1, #else diff --git a/src/config_data_second.c b/src/config_data_second.c index faf1967..5057b74 100644 --- a/src/config_data_second.c +++ b/src/config_data_second.c @@ -73,6 +73,9 @@ const config_data_mode_t __attribute__((section(".config_section_second.mode"))) .wx_umb = 0, #endif +#ifdef _DUST_SDS011_SERIAL + .wx_dust_sensor = WX_DUST_SDS011_SERIAL, +#endif #ifdef _VICTRON .victron = 1, diff --git a/src/main.c b/src/main.c index d9e7525..e648344 100644 --- a/src/main.c +++ b/src/main.c @@ -68,6 +68,7 @@ #include "drivers/dallas.h" #include "drivers/i2c.h" #include "drivers/analog_anemometer.h" +#include "dust_sensor/sds011.h" #include "aprs/wx.h" #include "../system/include/modbus_rtu/rtu_serial_io.h" @@ -1126,9 +1127,11 @@ int main(int argc, char* argv[]){ } #endif } - else if ((main_config_data_mode & WX_DUST_SDS011_SERIAL) > 0) { + else if ((main_config_data_mode->wx_dust_sensor & WX_DUST_SDS011_SERIAL) > 0) { if (main_kiss_srl_ctx_ptr->srl_rx_state == SRL_RX_DONE) { + sds011_get_pms(main_kiss_srl_ctx_ptr->srl_rx_buf_pointer, 10, &rte_wx_pm10, &rte_wx_pm2_5); + // restart reception srl_receive_data(main_kiss_srl_ctx_ptr, 10, 0xAA, 0, 0, 0, 0); diff --git a/system/src/davis_vantage/sds011.c b/system/src/davis_vantage/sds011.c index aaa43fd..2aad2aa 100644 --- a/system/src/davis_vantage/sds011.c +++ b/system/src/davis_vantage/sds011.c @@ -18,23 +18,28 @@ int sds011_get_pms(uint8_t * data, uint16_t data_ln, uint16_t * pm_10, uint16_t // values received from sensor uint8_t head = *(data + 0); uint8_t command_id = *(data + 1); - uint8_t checksum = *(data + 9); + uint8_t checksum = *(data + 8); - // calculate checksum - for (int i = 2; i < 9; i++) { - local_checksum += *(data + i); + if (command_id == 0xC0) { + // calculate checksum + for (int i = 2; i < 8; i++) { + local_checksum += *(data + i); + } + + if ((local_checksum & 0xFF) != checksum) { + return -2; + } + + local_checksum = *(data + 2) | (*(data + 3) << 8); + *pm_2_5 = local_checksum; + + local_checksum = *(data + 4) | (*(data + 5) << 8); + *pm_10 = local_checksum; + + return 0; } - - if ((local_checksum & 0xFF) != checksum) { - return -2; + else { + return -3; } - local_checksum = *(data + 1) | (*(data + 2) << 8); - *pm_2_5 = local_checksum; - - local_checksum = *(data + 4) | (*(data + 5) << 8); - *pm_10 = local_checksum; - - return 0; - }