K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示

| 单片机型号 | 测试条件 | 模块名称 | 代码功能 |
|---|---|---|---|
| STC89C52RC | 晶振11.0592M | MQ2传感模块 | STC89C52RC采集MQ2传感模块参数 串口与OLED0.96双显示 |
| STM32F103C8T6 | 晶振8M/系统时钟72M | MQ2传感模块 | STM32F103C8T6采集MQ2传感模块参数 串口与OLED0.96双显示 |
其他资料目录 直戳跳转
可以用于家庭和工厂的气体泄漏监测装置,适宜于液化气、丁烷、丙烷、 甲烷、 酒精、烟雾等的探测;
灵敏度可调(图中蓝色数字电位器调节)
工作电压 5V 使用前,供电至少预热 2 分钟以上,传感器稍微发烫属于正 常现象;
输出形式:
a 模拟量电压输出
b 数字开关量输出(0 和 1)
| MQ2传感模块 | 引脚说明 |
|---|---|
| VCC | 正极 5V供电 |
| GND | 负极 接GND |
| DO | 数字量输出(默认高电平输出 到阀值输出低电平) |
| AO | 模拟量输出 |
STC89C52RC无ADC所以需要借助外部ADC模块 此处用PCF8591模块进行采集



以51为例
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c()
{
PCF8591_SDA=1; /*发送起始条件的数据信号*/
PCF8591_SCL=1;
IIC_Delay();
PCF8591_SDA=0; /*发送起始信号*/
IIC_Delay();
PCF8591_SCL=0; /*钳住I2C总线,准备发送或接收数据 */
IIC_Delay();
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
{
PCF8591_SDA=0; /*发送结束条件的数据信号*/
PCF8591_SCL=1; /*结束条件建立时间大于4μs*/
IIC_Delay();
PCF8591_SDA=1; /*发送I2C总线结束信号*/
IIC_Delay();
}
/*******************************************************************
字节数据发送函数
函数原型: void SendByte(UCHAR c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void SendByte(uint8_t c)
{
uint8_t BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
if((c<<BitCnt)&0x80)PCF8591_SDA=1; /*判断发送位*/
else PCF8591_SDA=0;
PCF8591_SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
IIC_Delay();
PCF8591_SCL=0;
}
IIC_Delay();
PCF8591_SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
IIC_Delay();
PCF8591_SCL=1;
IIC_Delay();
if(PCF8591_SDA==1)ack=0;
else ack=1; /*判断是否接收到应答信号*/
PCF8591_SCL=0;
IIC_Delay();
}
/*******************************************************************
字节数据接收函数
函数原型: UCHAR RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数应答从机。
********************************************************************/
uint8_t RcvByte()
{
uint8_t retc;
uint8_t BitCnt;
retc=0;
PCF8591_SDA=1; /*置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
PCF8591_SCL=0; /*置时钟线为低,准备接收数据位*/
IIC_Delay();
PCF8591_SCL=1; /*置时钟线为高使数据线上数据有效*/
IIC_Delay();
retc=retc<<1;
if(PCF8591_SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
IIC_Delay();
}
PCF8591_SCL=0;
IIC_Delay();
return(retc);
}
/********************************************************************
应答子函数
函数原型: void Ack_I2c(bit a);
功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(uint8_t a)
{
if(a==0)PCF8591_SDA=0; /*在此发出应答或非应答信号 */
else PCF8591_SDA=1;
IIC_Delay();
PCF8591_SCL=1;
IIC_Delay();
PCF8591_SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
IIC_Delay();
}
采集通道选择:
ISendByte(PCF8591,0x42);
地址:
#define PCF8591 0x90 //PCF8591 地址
需要自定义引脚可在此处更改,STM32要自定义引脚的话也要注意引脚时钟使能的更改
//MQ2传感+PCF8591模块引脚定义
MQ2传感模块---------------------------PCF8591
AO-------------------------------------AIN2
sbit PCF8591_SCL=P1^0; //I2C 时钟
sbit PCF8591_SDA=P1^1; //I2C 数据
//OLED0.96模块引脚定义
sbit SCL=P1^2; //串行时钟
sbit SDA=P1^3; //串行数据
//MQ2传感模块引脚定义 GPIOA_0 ADC1通道0
#define ADC_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd
#define ADC_GPIO_CLK RCC_APB2Periph_GPIOA
#define ADC_PORT GPIOA
#define ADC_PIN GPIO_Pin_0
//OLED0.96模块引脚定义
//-----------------OLED IIC端口定义----------------
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_8)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_8)
#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_9)//SDA
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_9)
1、STC89C52RC程序下载 直戳跳转
2、STM32F103C8T6程序下载
(1)串口下载 直戳跳转
(2)ST-LINK下载 直戳跳转
(3)J-LINK下载 直戳跳转
(4)DAP-LINK下载 直戳跳转
3、OLED0.96程序说明 直戳跳转
4、串口助手下载与使用
(1)安信可调试助手使用 直戳跳转
(2) sscom33串口调试助手使用 直戳跳转
(3)STC-ISP串口调试助手使用 直戳跳转
视频连接 直戳跳转
资料获取 (滑到最后添加个人号)
1、VCC GND请勿接反,接反易烧
2、OLED显示异常时,排除接线接触不良
3、使用前需要预热
/************************************************************************************
// 生成日期 : 2021-6-21
// 最近修改 : 2021-11-21
// 功能描述 : MQ2传感模块测试程序
// 测试条件 : STC89C52RC 晶振11.0592
接线
MQ2传感模块----------------------STC89C52RC
VCC-------------------------------5V
GND-------------------------------GND
MQ2传感模块----------------------PCF8591
AO--------------------------------AIN2
PCF8591--------------------------------STC89C52RC
VCC-- ---------------------------------5V
GND- ----------------------------------GND
SCL- ----------------------------------P1.0 //SCL
SDA- ----------------------------------P1.1 //SDA
OLED0.96(IIC) -------------------------STC89C52RC
VCC------------------------------------3.3V
GND------------------------------------GND
SCL------------------------------------P1^2
SDA------------------------------------P1^3
*************************************************************************************/
/************************************************************************************
// 生成日期 : 2021-6-21
// 最近修改 : 2021-11-21
// 功能描述 : MQ2传感模块测试程序
// 测试条件 : STM32F103C8T6 晶振8M 系统时钟 72M
接线
MQ2传感模块-----------------------STM32F103C8T6
VCC-------------------------------------5V
GND-------------------------------------GND
AO--------------------------------------PA_0
OLED0.96
VCC-- -----------------------------------3.3V
GND- ------------------------------------GND
SCL- ------------------------------------PB_8 //SCL
SDA- ------------------------------------PB_9 //SDA
*****************************************************************************************/
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c