文章目录

  • 前言
  • 一、ADC转换
    • 1.介绍
    • 2.实现
  • 二、光敏电阻
    • 1.模块介绍
    • 2.功能实现
  • 二、MQ系列气体传感器
    • 1.模块介绍
    • 2.功能实现
  • 三、 DHT11温湿度传感器
  • 四、 主函数实现
  • 总结

前言

这部分主要介绍系统的采集端组成,这里有用到几种传感器,DHT11温湿度传感器,MQ系列气体采集传感器,光敏电阻(用来测量光照强度的),主要用来监测家庭居住环境的相关环境参数。


一、ADC转换

1.介绍

  • AD转换是把离散的模拟量转换为数字量的过程,其原理就是使用单片机的高频率和时钟来采样x轴的点样,根据电压的变化使用曲线函数来获取y轴数字值的过程,我们叫做AD转换。

  • ADC模块读到的数据是12位的数据,STM32读到的ADC值,是从0到4095(111111111111)。当把ADC引脚接了GND,读到的就是0;当把ADC引脚接了VCC,读到的就是4095。单片机在进行AD转换前需要先设置一个参考电压。假如把参考电压设置为5V,5V=4095,0V=0;根据这样的关系,就可以把模拟电压进行数字化了。比如:2V=2/5*4095=1638

  • STM32将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。
    下面是ADC通道所使用的引脚:

2.实现

用ADC1的通道采集外部电压值

  1. 开启PA口时钟和ADC1时钟,设置PA1为模拟输入。调用函数:GPIO_Init();APB2PeriphClockCmd();
  2. 复位ADC1,同时设置ADC1分频因子。调用函数:ADC_DeInit(ADC1);RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  3. 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。调用函数:void ADC_Init();
  4. 使能ADC并校准。调用函数:ADC_Cmd();
  5. 配置规则通道参数。调用函数:ADC_RegularChannelConfig();
  6. 开启软件转换:ADC_SoftwareStartConvCmd(ADC1);
  7. 等待转换完成,读取ADC值。调用函数:ADC_GetConversionValue(ADC1)。
/**************************************************************************
函数名:   ADC1_Init(void)
函数功能:ADC初始化函数
入口参数:无
返回  值:无
**************************************************************************/
//初始化ADC
void ADC1_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef  ADC_InitStructure;/* 1.时钟配置 */    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启PA口的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1的时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);  配置ADC时钟为PCLK2的分频因子6,72M/6=12,ADC最大时间不能超过14M/* 2.GPIO配置 */   //用作ADC采集的IO必须没有复用,否则采集电压会有影响GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN; // 模拟输入                  GPIO_Init(GPIOA, &GPIO_InitStructure);     /* 3.ADC配置 */
//  ADC_DeInit(ADC1);  //复位ADC1  //将外设 ADC1 的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 只使用一个ADC,属于独立模式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;   // 转换通道1个ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1//ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器ADC_Cmd(ADC1,ENABLE); // 开启ADC1 ,并开始转换ADC_ResetCalibration(ADC1);    //使能复位校准while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束ADC_StartCalibration(ADC1);    //开启AD校准while(ADC_GetCalibrationStatus(ADC1));//等待校准结束}
//获取某个通道的值
u16 get_Adc_Value(u8 ch)//通道一采样值  光照强度ADC_Channel_4
{       //ADC转换器                   通道号    采样顺序   采样时间ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5); // 配置 ADC 通道转换顺序和采样时间,ADC1,ADC通道1,采样时间为239.5个周期  ADC_SoftwareStartConvCmd(ADC1,ENABLE);      //使能指定的ADC的软件转换功能,我们的是ADC1   while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));       //检测软件转换是否完成return ADC_GetConversionValue(ADC1);                //返回最后一次读到的AD值。最近一次规则组的转换结果
}

对于读取的模拟量肯定要进行滤波,不然模拟量变化过快无法使用。滤波的作用就是减少噪声与干扰对数据测量的影响。中值滤波的思路就是取一段时间内读取到的数据中间值,可以有效的消去异常值。

//中值平均滤波
#define N 20 //采样个数u16 ADC1_ReadData(u8 ch)
{u16 sum=0;u16 ADC1_ValueBuf[N];for(u8 i=0;i<N;i++){ADC1_ValueBuf[i] = get_Adc_Value(ch);}//从小到大排列(冒泡法)for(u8 j=0;j<N-1;j++) // 趟数 {for(u8 i=0;i<N-1-j;i++) // 一趟比较的次数 {if(ADC1_ValueBuf[i]>ADC1_ValueBuf[i+1]) // 把最大值往后放 {//交换 u16 temp;temp = ADC1_ValueBuf[i];ADC1_ValueBuf[i] = ADC1_ValueBuf[i+1];ADC1_ValueBuf[i+1] = temp;}}}for(u8 i=2;i<N-2;i++) // 去掉最低两位与最高两位{sum+=ADC1_ValueBuf[i];}return sum/(N-4); // 求平均值
}//获取某个通道给定次数采样平均值
u16 ADC_Get_Average(u8 ch,u8 times)
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=get_Adc_Value(ch);delay_ms(5);}return temp_val/times;//得到平均值
}

二、光敏电阻

1.模块介绍

光敏电阻模块的原理图

光敏电阻内部就是一个PN结,光的强弱会引起其导通的变化,从而会引起电流的变化;电路设计方面,主要是利用电流的变化,然后在串联一个电阻,就可以转换成电压的变化,然后在利用ADC来采集电压的变化进行处理。同时光线与电压值成反比。

2.功能实现

//读取光照  0~100 0:最暗;100:最亮;
u16 Light_Data(void)//光照
{u16 ad;
//  ad=ADC_Get_Average(ADC_Channel_4,20);ad=ADC1_ReadData(4);ad=(4095-ad)*100/4095;return ad;
}

二、MQ系列气体传感器

1.模块介绍

MQ2是MQ传感器系列中最常用的气体传感器之一。它是一种金属氧化物半导体(MOS)型气体传感器,也称为化学传感器,因为检测是基于当气体与材料接触时感测材料的电阻变化。使用简单的分压器网络,可以检测到气体浓度。
这里用到的是MQ2烟雾传感器,MQ7一氧化碳传感器,MQ135空气质量传感器。

2.功能实现

u16 MQ7_Data(void)//一氧化碳
{u16 ad;ad=ADC_Get_Average(ADC_Channel_5,20); ad=ad*3.3/4095;return ad;
}u16 MQ135_Data(void)//空气质量
{u16 ad;float volt;ad =    ADC_Get_Average(ADC_Channel_6,20);volt = ad*3.3/4095;ad = pow((3.4880*10*volt)/(5-volt),(1.0/0.3203));return ad;
}u16 MQ2_Data(void)//烟雾  //丁烷300-5000ppm
{u16 ad;ad=ADC_Get_Average(ADC_Channel_7,20);
//  ad=ADC1_ReadData(7);ad=ad*3.3/4095;return ad;
}

三、 DHT11温湿度传感器

/** 一次完整的数据传输为40bit,高位先出* 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 */
uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
{  /*输出模式*/DHT11_Mode_Out_PP();/*主机拉低*/DHT11_Dout_0;/*延时18ms*/delay_ms(18);/*总线拉高 主机延时30us*/DHT11_Dout_1; delay_us(30);   //延时30us/*主机设为输入 判断从机响应信号*/ DHT11_Mode_IPU();/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   if(DHT11_Dout_IN()==Bit_RESET)     {/*轮询直到从机发出 的80us 低电平 响应信号结束*/  while(DHT11_Dout_IN()==Bit_RESET);/*轮询直到从机发出的 80us 高电平 标置信号结束*/while(DHT11_Dout_IN()==Bit_SET);/*开始接收数据*/   DHT11_Data->humi_int= DHT11_ReadByte();DHT11_Data->humi_deci= DHT11_ReadByte();DHT11_Data->temp_int= DHT11_ReadByte();DHT11_Data->temp_deci= DHT11_ReadByte();DHT11_Data->check_sum= DHT11_ReadByte();/*读取结束,引脚改为输出模式*/DHT11_Mode_Out_PP();/*主机拉高*/DHT11_Dout_1;/*检查读取的数据是否正确*/if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)return SUCCESS;else return ERROR;}elsereturn ERROR;}

四、 主函数实现

u8 buff[30];//参数显示缓存数组
DHT11_Data_TypeDef Dht_Data;    //温湿度
u16 light, mq2, mq7, mq135;//光照、烟雾、CO、空气ADC1_Init();            //ADC初始化
DHT11_Init();  //初始化DTT11
/*************************************************************
*   函数名称:    Get_Data()
*
*   函数功能:    获取传感器数据
*
*   入口参数:    无
*
*   返回参数:    无
*************************************************************/
void Get_Data(void)//获取传感器数据
{DHT11_Read_TempAndHumidity(&Dht_Data);light  = Light_Data();mq2  = MQ2_Data();mq7  = MQ7_Data();mq135 = MQ135_Data();
}

总结

就是对采集端所使用的传感器做一个简单的说明,为以后的系统整合做准备。

WiFi语音智能家居控制系统(二)相关推荐

  1. 基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块+DHT11温湿度采集+MQ系列 烟雾及可燃气体+蜂鸣器+步进电机模拟窗帘+OLED液晶显示+

    ## **基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块(阿里云 或ONENET或局域网)+DHT11温湿度采集+MQ系列 烟雾及可燃气体+ ...

  2. 基于ZigBee和STM32的智能家居控制系统的设计与实现(二)

    基于ZigBee和STM32的智能家居控制系统的设计与实现(二)   上一篇博客中总体介绍智能家居系统的基本实现原理,这篇博客和以后的几篇博客会详细进行相应的介绍.这里首先进行硬件电路的设计. 硬件电 ...

  3. 基于java智能家居,基于JAVA的智能家居控制系统的设计(信息控制端的设计)-论文二稿...

    基于JAVA的智能家居控制系统的设计(信息控制端的设计)-论文二稿 PINGDINGSHAN UNIVERSITY毕业论文 (设计 )题 目:基于 JAVA 的智能家居控制系 统的设计(信息控制端的设 ...

  4. (毕业设计资料)基于STM32的物联网WiFi智能家居控制系统

    092[电路方案]基于STM32的物联网WiFi智能家居控制系统 功能: 1.可以检测环境中温湿度,气压,一氧化碳,空气质量,烟雾浓度和光照强度. 2.将测量的值显示在屏幕上,数据上报机智云平台可以通 ...

  5. 基于ESP32的智能家居控制系统-微信小程序

    一. 课题研究意义.现状及应用分析 1.1课题研究意义及现状 目前,科学技术发展十分迅速,其渗透到各行各业以及生活的方方面面,室内设计和高科技结合便出现了"智能家居".所谓智能家居 ...

  6. 智能家居(13)——智能家居控制系统

    基于树莓派制作智能家居控制系统 一.功能介绍 二.实现思路 三.源代码分析 一.功能介绍 灯光的控制:模拟客厅灯.餐厅灯.二楼灯.卫生间灯.灯光可以通过手机App.语音.控制开关. 家内发生火灾后报警 ...

  7. 树莓派蓝牙ble gattlib c语言,树莓派构建智能家居控制系统 篇三:花花草草智能监测仪接入树莓派Domoticz...

    树莓派构建智能家居控制系统 篇三:花花草草智能监测仪接入树莓派Domoticz 2017-05-22 19:30:08 35点赞 410收藏 31评论 作为工科男,实在对花花草草没太多感觉.家里阳台养 ...

  8. 智能家居控制系统的功能和特点

    说到家居用品,相信大家都比较了解,比如床.沙发.桌子.电视.空调等等.那什么是智能家居控制系统呢?大家可能都比较陌生. 智能家居控制系统是以家庭为平台,主要控制对象为家用电器设备,利用网络通信技术.自 ...

  9. STM32嵌入式实现智能家居控制系统

    本文将讲述如何用STM32嵌入式实现智能家居控制系统,所谓智能就是实时监测自主控制一些因素,如,温度.湿度.光照强度等,当室内光线较暗时自动打开灯,根据光线亮度的不同开灯数量也不同,当室内温度过高时红 ...

最新文章

  1. PCL:英文参考链接
  2. 随机森林RF中的特征重要性的计算公式VIM
  3. torch.squeeze()和unsqueeze()
  4. 在eclipse中如何查看JAVA JDK的源代码
  5. Linux进程状态如何切换,Linux系统如何切换前台进程和后台进程(2)
  6. 字典的增删改查/元组的创建
  7. NTP时间服务器实现Linux时间同步
  8. 云计算(cloud computing)十大问答
  9. Java SSM4——Spring
  10. QQ组件可导致IE10无响应
  11. 信息学奥赛一本通 1074:津津的储蓄计划 | 1835:【04NOIP提高组】津津的储蓄计划 | OpenJudge NOI 1.5 22
  12. Leetcode每日一题:976.largest-perimeter-triangle(三角形的最大周长)
  13. 《面向对象程序设计》作业(四)
  14. python3.7安装步骤-python安装步骤_python 3.7.2安装教程
  15. 计算机网络物理层之物理层的基本概念
  16. c语言11章谭浩强,谭浩强 C语言 第11章 结构体.ppt
  17. 冒泡排序——《图解算法》
  18. 苹果手机设置信任软件
  19. hibernate枚举类型注解 @Enumerated
  20. mapped file has no Team ID and is not a platform binary (signed with custom identity or adhoc?

热门文章

  1. cmake中添加引用动态链接_CMake 添加头文件目录,链接动态、静态库(添加子文件夹)...
  2. gitBash快速清屏,git命令行操作,快速清屏,清屏
  3. oracle 12.2R2 安装GI跑root.sh遇到CLSRSC-400
  4. OpenCV——line、circle、rectangle、ellipse、polylines函数的使用和绘制文本putText函数以及绘制中文的方法。
  5. 计算机组成原理 CPU 结构和功能
  6. Photoshop2021 出现不可恢复的问题,即将退出
  7. group_wait、group_interval、repeat_interval对告警的影响
  8. YOLOV5的数据处理 增强技术
  9. [置顶] 程序员的奋斗史(二十八)——寒门再难出贵子?
  10. 2021-02-02