chuxh 发表于 2022-1-3 20:01

烟雾报警器

求大神帮忙,一个基于stm32的烟雾报警器,用蜂鸣器报警,MQ-2的传感器和继电器,主要是源程序,有仿真更好

tian111 发表于 2022-1-3 20:03

可以项目外包啊;

huangchui 发表于 2022-1-3 20:05

就是驱动一个继电器就可以。

kangzj 发表于 2022-1-3 20:07

使用什么芯片呢

yszong 发表于 2022-1-3 20:09

所有的传感器都可以实现的。

chuxh 发表于 2022-1-3 20:11

好像stm32没有仿真的。

dingy 发表于 2022-1-3 20:14

ADC采样MQ-2烟雾传感器

pengf 发表于 2022-1-3 20:16


void adc_init()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;
      
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);
      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;      
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
    GPIO_Init(GPIOC,&GPIO_InitStructure);
      
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//ADC地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue; //内存地址(要传输的变量的指针)
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //方向(从内存到外设)
    DMA_InitStructure.DMA_BufferSize = 1; //传输内容的大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; //内存地址固定
    DMA_InitStructure.DMA_PeripheralDataSize =   
    DMA_PeripheralDataSize_HalfWord ; //外设数据单位
    DMA_InitStructure.DMA_MemoryDataSize =   
    DMA_MemoryDataSize_HalfWord ;    //内存数据单位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA模式:循环传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_High ; //优先级:高
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   //禁止内存到内存的传输
      
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);//配置DMA1的1通道
      
    DMA_Cmd(DMA1_Channel1,ENABLE);
   
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;//禁止扫描方式
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//开启连续转换模式   
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发转换
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1; //要转换的通道数目
    ADC_Init(ADC1, &ADC_InitStructure);
      
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);//配置ADC时钟,为PCLK2的8分频,即9Hz
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);//配置ADC1通道11为55.5个采样周期   
      ADC_DMACmd(ADC1,ENABLE);
    ADC_Cmd(ADC1,ENABLE);

    ADC_ResetCalibration(ADC1);//复位校准寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));//等待校准寄存器复位完成

    ADC_StartCalibration(ADC1);//ADC校准
    while(ADC_GetCalibrationStatus(ADC1));//等待校准完成

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//由于没有采用外部触发,所以使用软件触发ADC转换
}

heweibig 发表于 2022-1-3 20:21

你有什么项目需求吗

hanwe 发表于 2022-1-3 20:25


硬件设计好了吗?            

pangb 发表于 2022-1-3 20:28

源程序是弄个框架吗

chenjunt 发表于 2022-1-3 20:31

具体描述一下你要使用的IO口。

xxmmi 发表于 2022-1-3 20:33

考虑硬件了吗?

zhaoxqi 发表于 2022-1-3 20:35


extern __IO uint16_t ADC_ConvertedValue;   
float ADC_ConvertedValueLocal;   
int main(void)
{   
    adc_init();
    printf_init();
      SysTick_Init();   //配置SysTick为1ms中断一次
    while(1)
    {   
            ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;   
            printf("The current AD value =0x%04X\n",ADC_ConvertedValue);   
            printf("The current AD value =%f V\n",ADC_ConvertedValueLocal);   
      
            Delay_ms(1000);      
      }
      
}

supernan 发表于 2022-1-3 20:38

使用一个比较器就可以实现。

chuxh 发表于 2022-1-3 20:40


三极管就可以完成。

zhanghqi 发表于 2022-1-3 20:42

就是读取数据后直接驱动继电器。

chuxh 发表于 2022-1-3 20:44

这个应该是ADC读取数据吧。

chuxh 发表于 2022-1-3 20:48

只有传感器根本无法实现这个的。

stly 发表于 2022-1-3 20:51

在21ic外包也可以实现。
页: [1] 2 3
查看完整版本: 烟雾报警器