3回答

0收藏

【GoKit试用体验】MQ2电压读取

机智云GoKit 机智云GoKit 3778 人阅读 | 3 人回复 | 2015-10-07

本帖最后由 USin 于 2015-10-10 18:41 编辑

今天发第三篇使用贴,我的问题机智云人员还未帮我搞定,时间缘故,就来发帖了。
本次是通过云端添加数据点用来转发MQ2产生的电压,设备端通过STM32F103C8自带的ADC,实现读取MQ2的模拟电压输出。
本次出现了一个小插曲就是云端分辨率一旦设为小数,APP端就好像数据大部分损坏,全不显示,至今未找到原因,如有知道怎么解决的,非常希望留下方法。
不废话了,下面就说说我的步骤:
第一部分:设备端代码的修改
这一部分,我参考了原子的初始化ADC的代码,和读取ADC所得到的值的代码.
Hal_MQ2.c
  1. #include "include.h"

  2. void MQ2_GPIO_Init(void)
  3. {
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         
  6.         
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         
  8.          
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.         GPIO_Init(OLED_CS_PORT, &GPIO_InitStructure);
  13. }

  14. void MQ2_Init(void)
  15. {
  16.         MQ2_GPIO_Init();
  17.         ADC_Config();
  18. }

  19. void ADC_Config(void)
  20. {
  21.         ADC_InitTypeDef ADC_InitStructure;
  22.         
  23.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE );
  24.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  25.         
  26.         ADC_DeInit(ADC1);
  27.         
  28.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  29.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  30.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  31.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  32.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  33.         ADC_InitStructure.ADC_NbrOfChannel = 1;
  34.         ADC_Init(ADC1, &ADC_InitStructure);
  35.         
  36.         ADC_Cmd(ADC1, ENABLE);
  37.         ADC_ResetCalibration(ADC1);
  38.         while(ADC_GetResetCalibrationStatus(ADC1));
  39.         ADC_StartCalibration(ADC1);
  40.         while(ADC_GetCalibrationStatus(ADC1));
  41.         
  42. }

  43. u16 Get_Adc(u8 ch)
  44. {
  45.         ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
  46.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  47.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
  48.         return ADC_GetConversionValue(ADC1);
  49. }

  50. u16 Get_Adc_Average(u8 ch,u8 times)
  51. {
  52.         u32 temp_val=0;
  53.         u8 t;
  54.         for(t=0;t<times;t++)
  55.         {
  56.                 temp_val+=Get_Adc(ch);
  57.                 Delay_ms(5);
  58.         }
  59.         return temp_val/times;
  60. }
复制代码
Hal_MQ2.h
  1. #ifndef _HAL_MQ2
  2. #define _HAL_MQ2

  3. #include <stdio.h>
  4. #include <stm32f10x.h>

  5.         void MQ2_GPIO_Init(void);
  6.         void ADC_Config(void);
  7.         u16 Get_Adc(u8 ch);
  8.         u16 Get_Adc_Average(u8 ch,u8 times);
  9.         void MQ2_Init(void);

  10. #endif
复制代码
接着在Hal_init函数添加MQ2_Init函数,接着在只读设备结构体添加uint16_t    Mq2;还有Pro_D2W_ReportDevStatusHandle函数添加Pro_D2W_ReportStatusStruct.Device_All.Device_Read.Mq2 = Device_ReadStruct.Mq2;
这样,再在while里加入
  1. adcx = Get_Adc_Average(ADC_Channel_0,10);
  2.                 Device_ReadStruct.Mq2 = adcx*(33.0/4096);
复制代码
由于小数显示有点问题,所以电压值扩大了10倍显示。
第二部分:云端设置
云端设置官方有很详细的步骤了,再此不再多说,就是加上Mq2数据点,类型选数值,分辨率为1.
第三部分:图片展示


IMG_20151010_181340.jpg.JPG (33.96 KB, 下载次数: 28)

IMG_20151010_181340.jpg.JPG
分享到:
回复

使用道具 举报

回答|共 3 个

正序浏览

地板

肽宰1

发表于 2015-11-11 09:47:38 | 只看该作者


大额红包,来个1111
板凳

Cux

发表于 2015-10-31 00:35:02 | 只看该作者

感谢 分享
沙发

lkl0305

发表于 2015-10-18 22:30:57 | 只看该作者

不错,学习了!!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条