基于stm32+LM2904+esp8266的噪声预警系统(续集)
由于前阵子帮我哥弄毕设,晚更新了一阵子,感觉不是很有意思,后面就没有更新的想法了,本来想着可以做大一点,加入网页可以增加新的元素,语音播报内容的更新,比如对噪音的记录以及语音的识别,然后部署到云服务器(好像还有3个月过期,一直闲置)等等。
一、 模拟量分贝检测LM2904介绍
顾名思义,它是一款输出模拟量的传感器,该模块对震动很敏感,测量时要放在平稳的位置。stm32的adc全称为Analog(模拟量)-to-Digital (数字量)Converter,就是把模拟信号转化为数字信号,使用这种传感器的一般步骤为将ADC模块与某引脚相连,再用该引脚去接入所要测试的地方,ADC模块便可以经过换算得到所要测试部位的电位。模拟量和电位是线性关系,单片机的adcADC是12位逐次逼近型的模拟数字转换器,故其值为0~4095(即000000000000 ~ 111111111111),由于lm2904的供电电压为5v,故输出模拟值为4095时,电压即为5v,按照比例即可通过不同噪声得到输出不同的电压。
得到电压怎么计算出分贝呢,这俩个词语看似毫不相关,卖家提供了一个算法,由于本人c语言基础确实较差,无法将公式写出(咳咳,实际上看了一下就溜了),需要算法可以私聊一下。或者第二种思路,利用excel表格里面那个函数?忘记叫什么了,就是利用数据推公式!对对对!我看到某宝店铺有一个近似计算公式如下:
db=输出信号/(供电电压-1.7)*100+30
二、代码参考
stm32 adc初始化函数用一下正点原子哥的代码,注释乱码了,有需要可以去原子哥那里下载。
#include "adc.h"#include "delay.h"
//
//±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
//ALIENTEK miniSTM32¿ª·¢°å
//ADC ´úÂë
//ÕýµãÔ×Ó@ALIENTEK
//¼¼ÊõÂÛ̳:www.openedv.com
//ÐÞ¸ÄÈÕÆÚ:2012/9/7
//°æ±¾£ºV1.0
//°æȨËùÓУ¬µÁ°æ±Ø¾¿¡£
//Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2009-2019
//All rights reserved
// //³õʼ»¯ADC
//ÕâÀïÎÒÃǽöÒÔ¹æÔòͨµÀΪÀý
//ÎÒÃÇĬÈϽ«¿ªÆôͨµÀ0~3
void Adc_Init(void)
{ ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //ʹÄÜADC1ͨµÀʱÖÓRCC_ADCCLKConfig(RCC_PCLK2_Div6); //ÉèÖÃADC·ÖƵÒò×Ó6 72M/6=12,ADC×î´óʱ¼ä²»Äܳ¬¹ý14M//PA1 ×÷ΪģÄâͨµÀÊäÈëÒý½Å GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //Ä£ÄâÊäÈëÒý½ÅGPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); //¸´Î»ADC1,½«ÍâÉè ADC1 µÄÈ«²¿¼Ä´æÆ÷ÖØÉèΪȱʡֵADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC¹¤×÷ģʽ:ADC1ºÍADC2¹¤×÷ÔÚ¶ÀÁ¢Ä£Ê½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Êý¾ÝÓÒ¶ÔÆëADC_InitStructure.ADC_NbrOfChannel = 1; //˳Ðò½øÐйæÔòת»»µÄADCͨµÀµÄÊýÄ¿ADC_Init(ADC1, &ADC_InitStructure); //¸ù¾ÝADC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèADCxµÄ¼Ä´æÆ÷ ADC_Cmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1ADC_ResetCalibration(ADC1); //ʹÄܸ´Î»Ð£×¼ while(ADC_GetResetCalibrationStatus(ADC1)); //µÈ´ý¸´Î»Ð£×¼½áÊøADC_StartCalibration(ADC1); //¿ªÆôADУ׼while(ADC_GetCalibrationStatus(ADC1)); //µÈ´ýУ׼½áÊø// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ}
//»ñµÃADCÖµ
//ch:ͨµÀÖµ 0~3
u16 Get_Adc(u8 ch)
{//ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼äADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADCͨµÀ,²ÉÑùʱ¼äΪ239.5ÖÜÆÚ ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊøreturn ADC_GetConversionValue(ADC1); //·µ»Ø×î½üÒ»´Î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;
}
main函数如下:
记得提前初始化一下adc以及定义变量
adcx=Get_Adc_Average(ADC_Channel_1,10);temp=(float)adcx*(3.3/4096)/3.3*100+30;adcx=temp;printf("%d",adcx);delay_ms(100);if(adcx>80){location[count]=adcx;//location是自己定义的一维数组count++; //if(count==4) //噪声填满5次,开始警告{count=0; //清空LED0=1; //灯亮,也可以接一下蜂鸣器,达到预警效果即可,需要发出声音可以用web,小爱同学或者其他播报器delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);LED0=0; //没必要一直响}printf("%d ´超过80DB\r\n",adcx);}}
建议:计算采样的平均数,达到5次开始预警也可以保留,但是得写一个计数器,当数组没填满,且里面有相邻时间大于预期的时间(结合现实,不能说早上吵到了,晚上再吵到也算累计五次),清空数组(重置),记得修改延迟频率!。
长太息以掩涕兮,哀民生之多艰。
余虽好修姱以鞿羁兮,謇朝谇而夕替。
既替余以蕙纕兮,又申之以揽茝。
亦余心之所善兮,虽九死其犹未悔。
怨灵修之浩荡兮,终不察夫民心。
众女嫉余之蛾眉兮,谣诼谓余以善淫。
固时俗之工巧兮,偭规矩而改错。
背绳墨以追曲兮,竞周容以为度。
忳郁邑余侘傺兮,吾独穷困乎此时也。
宁溘死以流亡兮,余不忍为此态也。
鸷鸟之不群兮,自前世而固然。
何方圜之能周兮,夫孰异道而相安?
屈心而抑志兮,忍尤而攘诟。
伏清白以死直兮,固前圣之所厚。
基于stm32+LM2904+esp8266的噪声预警系统(续集)相关推荐
- 基于stm32+LM2904+esp8266的噪声预警系统
提示:俩天内更新!! 文章目录 前言 一.时间预算 二.硬件部分· 1.lm2904 2.stm32+esp8266 总结 前言 灵感来源: 宿舍打游戏的人比较多,有时(jingchang)会打扰我睡 ...
- 基于STM32的ESP8266天气时钟(2)--------MCU获取天气数据
前言:上一章节我们通过串口调试助手,成功获取到天气数据,这一节我们将通过MCU的串口发送.接收功能,实现MCU获取天气数据. 传送门:基于STM32F103的网络天气时钟(1)---------通过串 ...
- 基于STM32的ESP8266模块控制多路继电器
基于STM32的ESP8266模块控制多路继电器 1.视频讲解 基于STM32单片机ESP8266物联网阿里云MQTT多路继电器控制 物联网视频教程STM32+ESP8266 2.实物设计 ESP82 ...
- 基于STM32的ESP8266使用教程(一)
关于为什么要写这篇文章,因为之前在做一个项目的时候需要使用WIFI模块.X宝搜WIFI模块的时候推荐ESP8266这个模块,说是价格便宜.使用方便.但是在使用的过程中发现的确使用方便(因为是基于AT指 ...
- 基于STM32的ESP8266使用教程(二)
写在前面:博主懒癌晚期,考研结束之后想着HAPPY一下,结果把这事忘了,开学了又有很多事情要干,直到昨天一博友留言(有邮件提醒),才想起有这么个坑要填,特来填坑.相关软件程序请参考"基于ST ...
- 基于STM32与ESP8266的太空人WiFi天气时钟(代码开源)
前言:本文为手把手教学ESP8266著名开源项目--太空人WiFi天气时钟,不同的是本次项目采用的是STM32作为MCU.两者开发过程中有因为各自芯片的特点(时钟频率,内存大小等),导致开发程序大不相 ...
- 基于STM32+FreeRtos+ESP8266+MQTT连接阿里云
基于STM32+FreeRtos+DHT12+ESP8266+MQTT连接阿里云 1.概述 2.实现步骤 2.1.MQTT.fx模拟器与阿里云通信 2.2.STM32与阿里云通信 3. 搭建云平台 3 ...
- 基于stm32和ESP8266实现wifi模块smartlink功能以及TCP连接
一直想把wifi模块和stm32连接起来,但是网上找了很久,并没有C语言相关的库,只有基于arduino的ESP8266 C++库,这个库是没办法直接给stm32使用的,所以自己动手丰衣足食,自己手动 ...
- 基于STM32的ESP8266获取天气数据(HAL库)
一.介绍 进入主题,下图正是购买的esp8266模块 对于esp01,引脚图如下 二.刷固件 在使用AT指令时,有时候会无法进入AT模式,也就是在串口发送指令,无应答.除了检查引脚和TTL模块是否接错 ...
最新文章
- Linux性能挖潜的隐藏招数:内核CPU亲和性参数调整
- CSS 实现加载动画之五-光盘旋转
- C++ Sets MultiSets
- java中几种基本数据类型之间的转换
- 多个DataTable的合并成一个新表
- linux锁定系统时间设置,Linux时间设置系统时间、硬件时间和时间服务
- pythonos模块_python的io模块和os模块有什么区别
- python实现汉诺塔(递归)
- 微型计算机的字长不一定是字节的整数倍数,2015江苏省全国计算机等级考试二级VB笔试试卷及参考答案考试技巧重点...
- JDY-24M主机使用手册
- 人的思维谬误与心理学效应
- 全球创见者共话企业韧性 金蝶“数字员工”惊艳亮相
- python 球的表面积和体积_[给球的体积算表面积]C语言求球的表面积和体积
- 谷歌账号最后验证身份手机号无法使用
- 微信小程序ios地图标记点无法点击第二次 markertap
- 城市轨道交通信号系统学习笔记(三)继电器
- 4399游戏存档的那些事儿
- Android学习 - Material Design设计规范
- 淘宝店铺涨价如何才能把对店铺的影响降低到最低,涨价小技巧分享
- 改成每天晚上锻炼身体
热门文章
- CSS-选择器的优先级
- 转贴:黑客高手必懂基础内容 (发在这里只为娱乐大家)
- docker镜像使用及连接
- “2021天府金融指数”发布 专家热议绿色金融创新支持低碳转型发展
- 22年5月14日面试随笔
- UnityShader-高斯模糊
- 基于北斗RDSS短报文的海洋浮标在线水质/气象综合监测系统
- 监控html页面数据获取失败,前端异常采集(附实例)
- 如何将项目使用docker分块部署
- python用bbp公式求圆周率_神奇的BBP公式,可独立计算圆周率任何一位数字,曾震惊数学界!...