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);
}