stm32f103c8t6与mq-7传感器与oled现实co浓度
时间: 2023-09-30 17:05:40 浏览: 107
STM32 ADC双路采集
5星 · 资源好评率100%
要实现这个功能,需要进行以下步骤:
1. 硬件连接
将MQ-7传感器的VCC接到STM32F103C8T6的3.3V电源引脚,将GND接到GND引脚,将OUT引脚接到STM32F103C8T6的PA0引脚。将OLED的VCC接到STM32F103C8T6的3.3V电源引脚,将GND接到GND引脚,将SCL引脚接到STM32F103C8T6的PB10引脚,将SDA引脚接到STM32F103C8T6的PB11引脚。
2. 程序设计
在程序中需要用到ADC模块和I2C模块。
首先,需要初始化ADC模块和I2C模块,代码如下:
```
// 初始化ADC
void ADC_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
}
// 初始化I2C
void I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
```
然后,需要编写读取MQ-7传感器数值和显示CO浓度值的函数,代码如下:
```
// 读取MQ-7传感器数值
u16 MQ7_Read(void)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_71Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
// 显示CO浓度值
void OLED_Show_CO(u16 co)
{
char str[6];
sprintf(str, "%d", co);
OLED_ShowString(0, 0, "CO:");
OLED_ShowString(16, 0, str);
OLED_ShowString(72, 0, "ppm");
}
```
最后,在main函数中循环读取MQ-7传感器数值并显示CO浓度值,代码如下:
```
int main(void)
{
ADC_Init();
I2C_Init();
OLED_Init();
while (1)
{
u16 mq7_value = MQ7_Read();
u16 co = mq7_value * 5 / 1024;
OLED_Clear();
OLED_Show_CO(co);
delay_ms(1000);
}
}
```
其中,MQ7_Read函数中的ADC_Channel_0对应PA0引脚,ADC_SampleTime_71Cycles5表示采样时间为71.5个周期,可以根据实际情况进行调整。co的计算公式为:co = mq7_value * 5 / 1024,其中5表示MQ-7传感器的工作电压为5V,1024表示ADC的分辨率为10位。delay_ms函数用于延时1秒钟,可以根据实际情况进行调整。
需要注意的是,MQ-7传感器需要预热一段时间才能正常工作,预热时间一般为1-2分钟。在读取MQ-7传感器数值时,可以先进行一次空读取,将预热时间计算在内。
阅读全文