diff --git a/AirQuality/Inc/main.h b/AirQuality/Inc/main.h index 8c318f6..cc8e904 100644 --- a/AirQuality/Inc/main.h +++ b/AirQuality/Inc/main.h @@ -52,6 +52,7 @@ extern "C" { #define H2S_USART USART5 #define CO2_USART USART6 #define LORA_USART USART8 +#define O3_USART USART6 #define NH3_BIT (1 << 0) #define H2S_BIT (1 << 1) @@ -59,7 +60,9 @@ extern "C" { #define CH2O_BIT (1 << 3) #define CO2_BIT (1 << 4) #define LORA_BIT (1 << 5) -#define BIT_ALL (NH3_BIT | H2S_BIT | PM25_BIT | CH2O_BIT | CO2_BIT | LORA_BIT ) +#define O3_BIT (1 << 6) + +#define BIT_ALL (NH3_BIT | H2S_BIT | PM25_BIT | CH2O_BIT | CO2_BIT | LORA_BIT | O3_BIT) extern volatile uint8_t SENSOR_CTRL; diff --git a/AirQuality/Inc/sensor.h b/AirQuality/Inc/sensor.h index 7bdea9a..1ea0773 100644 --- a/AirQuality/Inc/sensor.h +++ b/AirQuality/Inc/sensor.h @@ -12,6 +12,7 @@ #define PM2D5_DATA_LENGTH 32 #define CH2O_DATA_LENGTH 9 #define CO2_DATA_LENGTH 9 +#define O3_DATA_LENGTH 9 enum DEVICE_TYPE @@ -21,6 +22,7 @@ enum DEVICE_TYPE PM25_TYPE, CH2O_TYPE, CO2_TYPE, + O3_TYPE }; typedef struct sensor_parse_control_st{ //osSemaphoreId recvBinarySemHandle; @@ -41,6 +43,7 @@ typedef struct float nh3; float h2s; float ch2o; + int o3; int co2; int tvoc; int pm25; @@ -60,6 +63,9 @@ typedef struct uint8_t co21; uint8_t co22; + + uint8_t o31; + uint8_t o32; uint8_t tvoca; uint8_t tvocb; @@ -80,6 +86,7 @@ extern sensor_parse_ctrl_t h2s; extern sensor_parse_ctrl_t co2; extern sensor_parse_ctrl_t pm25; extern sensor_parse_ctrl_t ch2o; +extern sensor_parse_ctrl_t o3; extern SensorDataTypeDef sensorData; diff --git a/AirQuality/MDK-ARM/AirQuality.uvprojx b/AirQuality/MDK-ARM/AirQuality.uvprojx index e70b644..545da5f 100644 --- a/AirQuality/MDK-ARM/AirQuality.uvprojx +++ b/AirQuality/MDK-ARM/AirQuality.uvprojx @@ -49,7 +49,7 @@ 1 AirQuality\ - AirQuality + STS_E2_9IN1 1 0 1 diff --git a/AirQuality/Src/main.c b/AirQuality/Src/main.c index 7c5cebd..4126223 100644 --- a/AirQuality/Src/main.c +++ b/AirQuality/Src/main.c @@ -142,6 +142,7 @@ int main(void) InitSonsorCtrlData(&ch2o, CH2O_DATA_LENGTH, CH2O_TYPE); InitSonsorCtrlData(&nh3, NH3_DATA_LENGTH, NH3_TYPE); InitSonsorCtrlData(&h2s, H2S_DATA_LENGTH, H2S_TYPE); + InitSonsorCtrlData(&o3, O3_DATA_LENGTH, O3_TYPE); UsartUserConfig(); @@ -204,6 +205,14 @@ int main(void) AnalysisSensorData(&pm25); } + if(SENSOR_CTRL & O3_BIT) + { + SENSOR_CTRL &= ~O3_BIT; + ReadSensorData(&o3); + AnalysisSensorData(&o3); + } + + if(SENSOR_CTRL & LORA_BIT) { SENSOR_CTRL &= ~LORA_BIT; diff --git a/AirQuality/Src/sensor.c b/AirQuality/Src/sensor.c index d35de85..8fa4f84 100644 --- a/AirQuality/Src/sensor.c +++ b/AirQuality/Src/sensor.c @@ -27,11 +27,18 @@ const uint8_t cmd_CH2O_duqu[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00 const uint8_t cmd_CH2O_beidong[9] = {0xFF,0x01,0x78,0x41,0x00,0x00,0x00,0x00,0x46};//设置传感器为应答模式 const uint8_t cmd_CH2O_zhudong[9] = {0xFF,0x01,0x78,0x40,0x00,0x00,0x00,0x00,0x47};//设置传感器为主动上传模式 +//O3命令 +const uint8_t cmd_O3_duqu[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};//主动读取数据 +const uint8_t cmd_O3_beidong[9] = {0xFF,0x01,0x78,0x41,0x00,0x00,0x00,0x00,0x46};//设置传感器为应答模式 +const uint8_t cmd_O3_zhudong[9] = {0xFF,0x01,0x78,0x40,0x00,0x00,0x00,0x00,0x47};//设置传感器为主动上传模式 + + sensor_parse_ctrl_t nh3; sensor_parse_ctrl_t h2s; sensor_parse_ctrl_t co2; sensor_parse_ctrl_t pm25; sensor_parse_ctrl_t ch2o; +sensor_parse_ctrl_t o3; SensorDataTypeDef sensorData; @@ -60,6 +67,9 @@ void InitSonsorData(SensorDataTypeDef *sensorData) sensorData->co21 = 4; sensorData->co22 = 112; + + sensorData->o31 = 0; + sensorData->o32 = 0; sensorData->tvoca = 1; sensorData->tvocb = 1; @@ -105,6 +115,11 @@ void SensorModeInitSet(void) LL_mDelay(50); UsartxSendDataStr(CO2_USART,cmd_co2_liangcheng2,sizeof(cmd_co2_liangcheng2)); + + //O3设置为应答模式 + LL_mDelay(50); + UsartxSendDataStr(O3_USART,cmd_O3_beidong,sizeof(cmd_O3_beidong)); + //init sht3x sensor LL_mDelay(50); SHT3X_Init(0x44); @@ -122,6 +137,10 @@ void GetSensorData(void) LL_mDelay(50); UsartxSendDataStr(CO2_USART, cmd_co2_duqu, sizeof(cmd_co2_duqu)); + //O3发送获取数据命令 + LL_mDelay(50); + UsartxSendDataStr(O3_USART, cmd_O3_duqu, sizeof(cmd_O3_duqu)); + //CH2O发送获取数据命令 LL_mDelay(50); UsartxSendDataStr(CH2O_USART,cmd_CH2O_duqu,sizeof(cmd_CH2O_duqu)); @@ -213,6 +232,12 @@ static void general_data_check(sensor_parse_ctrl_t *sensor_parse_ctrl) sensorData.co21 = ((sensorData.co2)>>8)&0xFF; sensorData.co22 = (sensorData.co2)&0xFF; break; + case O3_TYPE: + sensorData.o3 = (sensor_parse_ctrl->sensorData[2]*256+sensor_parse_ctrl->sensorData[3]); + sensorData.o31 = ((sensorData.o3)>>8)&0xFF; + sensorData.o32 = (sensorData.o3)&0xFF; + break; + case CH2O_TYPE: sensorData.ch2o = (sensor_parse_ctrl->sensorData[6]*256+sensor_parse_ctrl->sensorData[7])/1000.00; sensorData.ch2o1 = ((int)sensorData.ch2o)&0xFF; @@ -273,6 +298,7 @@ void AnalysisSensorData(sensor_parse_ctrl_t *sensor_parse_ctrl) { case H2S_TYPE: case CO2_TYPE: + case O3_TYPE: case NH3_TYPE: case CH2O_TYPE: general_data_check(sensor_parse_ctrl); diff --git a/AirQuality/Src/stm32f0xx_it.c b/AirQuality/Src/stm32f0xx_it.c index c022aea..7d0a131 100644 --- a/AirQuality/Src/stm32f0xx_it.c +++ b/AirQuality/Src/stm32f0xx_it.c @@ -301,6 +301,21 @@ void USART3_8_IRQHandler(void) } + if(LL_USART_IsActiveFlag_ORE(O3_USART)) + { + LL_USART_ClearFlag_ORE(O3_USART); + } + if(LL_USART_IsActiveFlag_RXNE(O3_USART)) + { + Write_RingBuff(&o3.recvRingBuff,LL_USART_ReceiveData8(O3_USART)); + } + if(LL_USART_IsActiveFlag_IDLE(O3_USART)) + { + LL_USART_ClearFlag_IDLE(O3_USART); + SENSOR_CTRL |= O3_BIT; + } + + if(LL_USART_IsActiveFlag_ORE(H2S_USART)) { LL_USART_ClearFlag_ORE(H2S_USART); diff --git a/AirQuality/Src/user_data_send.c b/AirQuality/Src/user_data_send.c index 832a3de..5672554 100644 --- a/AirQuality/Src/user_data_send.c +++ b/AirQuality/Src/user_data_send.c @@ -52,10 +52,10 @@ void SendDate_Lora(SensorDataTypeDef *sensorData) char sendBuffer[64]; uint8_t length = 0; memset(sendBuffer, 0, sizeof(sendBuffer)); - length = snprintf(sendBuffer, sizeof(sendBuffer), "AT+LRSEND=101,0,18,<%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\r\n", + length = snprintf(sendBuffer, sizeof(sendBuffer), "AT+LRSEND=101,0,18,<%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\r\n", sensorData->symbol,sensorData->temperature1,sensorData->temperature2,sensorData->humidity1,sensorData->humidity2,sensorData->nh31, sensorData->nh32,sensorData->h2s1,sensorData->h2s2,sensorData->ch2o1,sensorData->ch2o2,sensorData->co21,sensorData->co22, - sensorData->tvoc,sensorData->pm251,sensorData->pm252,sensorData->pm101,sensorData->pm102); + sensorData->tvoc,sensorData->pm251,sensorData->pm252,sensorData->pm101,sensorData->pm102, sensorData->o31,sensorData->o32); UsartxSendDataStr(LORA_USART, (uint8_t *)sendBuffer, length); }