TA的每日心情 | 开心 2016-2-19 11:45 |
---|
签到天数: 17 天 连续签到: 1 天 [LV.4]偶尔看看III
|
本帖最后由 USin 于 2015-10-10 18:41 编辑
今天发第三篇使用贴,我的问题机智云人员还未帮我搞定,时间缘故,就来发帖了。
本次是通过云端添加数据点用来转发MQ2产生的电压,设备端通过STM32F103C8自带的ADC,实现读取MQ2的模拟电压输出。
本次出现了一个小插曲就是云端分辨率一旦设为小数,APP端就好像数据大部分损坏,全不显示,至今未找到原因,如有知道怎么解决的,非常希望留下方法。
不废话了,下面就说说我的步骤:
第一部分:设备端代码的修改
这一部分,我参考了原子的初始化ADC的代码,和读取ADC所得到的值的代码.
Hal_MQ2.c- #include "include.h"
- void MQ2_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(OLED_CS_PORT, &GPIO_InitStructure);
- }
- void MQ2_Init(void)
- {
- MQ2_GPIO_Init();
- ADC_Config();
- }
- void ADC_Config(void)
- {
- ADC_InitTypeDef ADC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE );
- RCC_ADCCLKConfig(RCC_PCLK2_Div6);
-
- ADC_DeInit(ADC1);
-
- 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);
- ADC_ResetCalibration(ADC1);
- while(ADC_GetResetCalibrationStatus(ADC1));
- ADC_StartCalibration(ADC1);
- while(ADC_GetCalibrationStatus(ADC1));
-
- }
- u16 Get_Adc(u8 ch)
- {
- ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
- return ADC_GetConversionValue(ADC1);
- }
- u16 Get_Adc_Average(u8 ch,u8 times)
- {
- u32 temp_val=0;
- u8 t;
- for(t=0;t<times;t++)
- {
- temp_val+=Get_Adc(ch);
- Delay_ms(5);
- }
- return temp_val/times;
- }
复制代码 Hal_MQ2.h- #ifndef _HAL_MQ2
- #define _HAL_MQ2
- #include <stdio.h>
- #include <stm32f10x.h>
- void MQ2_GPIO_Init(void);
- void ADC_Config(void);
- u16 Get_Adc(u8 ch);
- u16 Get_Adc_Average(u8 ch,u8 times);
- void MQ2_Init(void);
- #endif
复制代码 接着在Hal_init函数添加MQ2_Init函数,接着在只读设备结构体添加uint16_t Mq2;还有Pro_D2W_ReportDevStatusHandle函数添加Pro_D2W_ReportStatusStruct.Device_All.Device_Read.Mq2 = Device_ReadStruct.Mq2;
这样,再在while里加入- adcx = Get_Adc_Average(ADC_Channel_0,10);
- Device_ReadStruct.Mq2 = adcx*(33.0/4096);
复制代码 由于小数显示有点问题,所以电压值扩大了10倍显示。
第二部分:云端设置
云端设置官方有很详细的步骤了,再此不再多说,就是加上Mq2数据点,类型选数值,分辨率为1.
第三部分:图片展示
|
-
|