start of O3 code

This commit is contained in:
Yunhorn 2025-01-13 20:56:48 +08:00
parent 4bf6dcb620
commit 411db1b7d4
7 changed files with 64 additions and 4 deletions

View File

@ -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;

View File

@ -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;

View File

@ -49,7 +49,7 @@
<InvalidFlash>1</InvalidFlash>
</TargetStatus>
<OutputDirectory>AirQuality\</OutputDirectory>
<OutputName>AirQuality</OutputName>
<OutputName>STS_E2_9IN1</OutputName>
<CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib>
<CreateHexFile>1</CreateHexFile>

View File

@ -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;

View File

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

View File

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

View File

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