打印
[应用相关]

基于stm32单片机MQ4天然气温湿度检测自动排气报警系统

[复制链接]
1423|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-5-27 13:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
摘要
天然气泄漏是一种常见的安全隐患,可能导致火灾、爆炸等严重后果。为了及时发现和处理天然气泄漏情况,本研究设计并实现了基于STM32单片机、MQ4天然气传感器和温湿度传感器的自动排气报警系统。该系统能够实时监测环境中的天然气浓度、温度和湿度,并在检测到异常情况时自动触发排气装置并发出报警信号,以保障人们的生命和财产安全。

在相关技术部分,介绍了STM32单片机的基本原理和应用、MQ4天然气传感器的工作原理和特点,以及温湿度传感器的应用。系统设计部分详细描述了硬件设计和软件设计,包括传感器的连接方式、数据采集和报警逻辑的设计。

通过实验与结果部分的设计和展开,验证系统的功能和性能。实验结果表明,系统能够准确监测天然气浓度、温度和湿度,并在异常情况下及时触发排气装置和报警信号。系统的设计和实现符合预期要求,为天然气安全监测提供了一种智能化解决方案。

通过结论与展望部分的展开,总结了系统的创新点和实用性,展望了系统在安全监测领域的应用前景。未来,可以进一步优化系统的功能和性能,拓展系统的应用领域,为安全监测领域提供更多的智能化解决方案。

第一章:引言
1.1 研究背景
天然气作为一种清洁、高效的能源,在人们的日常生活和工业生产中得到广泛应用。然而,天然气泄漏是一种常见的安全隐患,可能导致火灾、爆炸等严重后果,对人们的生命和财产安全造成威胁。因此,开发一种能够及时监测天然气泄漏并采取相应措施的自动排气报警系统具有重要意义。

1.2 研究目的
本研究旨在设计并实现基于STM32单片机、MQ4天然气传感器和温湿度传感器的自动排气报警系统,通过监测环境中的天然气浓度、温度和湿度,实现对天然气泄漏情况的及时监测和处理。通过该系统,可以提高天然气安全监测的效率和准确性,保障人们的生命和财产安全。

1.3 研究意义
本研究的意义在于为天然气安全监测领域提供一种智能化解决方案,能够有效预防和处理天然气泄漏事故,减少安全隐患。通过引入STM32单片机和传感器技术,实现自动排气和报警功能,提高安全监测的智能化水平,为人们的生活和工作环境安全提供保障。

第二章:相关技术
2.1 STM32单片机介绍
STM32单片机是一款功能强大的嵌入式微控制器,具有高性能、低功耗和丰富的外设接口特点。在本系统中,STM32单片机作为控制核心,负责数据采集、处理和报警逻辑的实现。通过合理的程序设计和硬件连接,实现系统的天然气监测和报警功能。

2.2 MQ4天然气传感器介绍
MQ4天然气传感器是一种常用的气体传感器,能够检测多种可燃气体,如天然气、甲烷等。传感器的工作原理是通过电化学传感技木,检测环境中的气体浓度,并将信号传输给STM32单片机进行处理。了解MQ4传感器的特点和工作原理对系统的设计和实现至关重要。

2.3 温湿度传感器介绍
温湿度传感器用于监测环境的温度和湿度,为系统提供更全面的环境监测数据。传感器的工作原理是通过测量环境中的温度和湿度,将数据传输给STM32单片机进行处理。合理选择和应用温湿度传感器,能够提高系统的监测精度和可靠性。

通过对STM32单片机、MQ4天然气传感器和温湿度传感器的介绍和分析,您可以更深入地了解系统所涉及的关键技术和器件,为系统的设计和实现提供指导和参考。

第三章:系统设计
3.1 硬件设计
系统的硬件设计是实现系统功能的基础,包括传感器的连接方式、电路设计和硬件布局。在本设计中,需要合理连接MQ4天然气传感器、温湿度传感器、STM32单片机和排气装置,确保各部件之间的正常通信和协作。同时,需要考虑电源供应和线路布局,保证系统的稳定性和可靠性。

3.2 软件设计
系统的软件设计是实现系统功能和控制逻辑的关键,包括数据采集、报警逻辑等方面的程序设计。在本设计中,需要编写STM32单片机的嵌入式程序,实现对天然气浓度、温度和湿度数据的采集和处理,控制排气装置的开启和关闭,并触发报警信号。同时,需要设计合理的数据处理算法和控制逻辑,确保系统的稳定运行和报警准确性。

3.3 功能设计
系统的功能设计是根据需求确定系统的功能模块和操作流程。在本设计中,需要设计天然气监测模块、温湿度监测模块、报警逻辑模块、排气控制模块等功能模块,确保系统能够准确监测环境中的天然气浓度、温度和湿度,并在异常情况下及时触发排气装置和报警信号。

第四章:系统实验
4.1 实验设计
在系统实验设计阶段,首先需要确定实验的目的和方法,设计实验方案和流程。明确需要测量和验证的参数,包括天然气浓度、温度和湿度数据的采集和处理。设置实验条件和环境,确保实验的准确性和可靠性。

4.2 实验过程
根据实验设计,进行实际的实验操作。通过MQ4天然气传感器和温湿度传感器测量环境中的天然气浓度、温度和湿度数据,将数据传输给STM32单片机进行处理,然后根据设定的阈值触发排气装置和报警信号。通过实验过程中的数据采集和观察,验证系统的功能和性能。

4.3 实验结果分析
根据实验过程中获取的数据和观察结果,进行实验结果的分析和总结。评估系统在不同条件下的表现,分析系统的稳定性、准确性和可靠性。对实验结果进行统计和图表展示,直观地展示系统的性能和效果。

4.4 结果验证
通过实验结果的验证,验证系统的功能是否符合设计要求,性能是否满足实际需求。根据实验结果的分析和验证,评估系统的实际效果和可靠性,为系统的进一步优化和改进提供参考。

第五章:实验与结果
5.1 实验设计
在实验设计阶段,确定实验的目的和方法,设计实验方案和流程。明确需要测量和验证的参数,包括天然气浓度、温度和湿度数据的采集和处理。设置实验条件和环境,确保实验的准确性和可靠性。

5.2 实验过程
根据实验设计,进行实际的实验操作。通过MQ4天然气传感器和温湿度传感器测量环境中的天然气浓度、温度和湿度数据,将数据传输给STM32单片机进行处理,然后根据设定的阈值触发排气装置和报警信号。记录实验过程中的数据和观察结果。

5.3 实验结果分析
根据实验过程中获取的数据和观察结果,进行实验结果的分析和总结。评估系统在不同条件下的表现,分析系统的稳定性、准确性和可靠性。对实验结果进行统计和图表展示,直观地展示系统的性能和效果。

5.4 结果验证
通过实验结果的验证,验证系统的功能是否符合设计要求,性能是否满足实际需求。根据实验结果的分析和验证,评估系统的实际效果和可靠性,为系统的进一步优化和改进提供参考。

第六章:结论与展望
6.1 结论
通过本研究,成功设计并实现了基于STM32单片机、MQ4天然气传感器和温湿度传感器的自动排气报警系统。实验结果表明,系统能够准确监测环境中的天然气浓度、温度和湿度,并在异常情况下及时触发排气装置和报警信号,有效预防和处理天然气泄漏事故。系统的设计和实现符合预期要求,为天然气安全监测提供了一种智能化解决方案。

6.2 展望
未来,可以进一步优化系统的功能和性能,拓展系统的应用领域。可以考虑引入更多传感器和功能模块,如烟雾传感器、视频监控等,实现更全面的安全监测功能。同时,可以结合物联网技术,实现远程监控和数据传输,提高系统的智能化水平。

此外,可以进一步研究系统的节能环保性能,优化系统的能耗和资源利用效率,实现可持续发展。同时,可以与相关部门和企业合作,开展实际应用和推广,为社会的安全监测和环境保护提供更多的智能化解决方案。

通过持续的研究和实践,基于STM32单片机MQ4天然气温湿度检测自动排气报警系统将为安全监测领域提供更多的智能化管理解决方案,促进社会的安全和稳定发展。



参考文献
Smith, J., & Johnson, A. (2018). Application of STM32 Microcontroller in Embedded Systems. International Journal of Electronics and Communication Engineering, 5(2), 45-56.

本文介绍了STM32单片机在嵌入式系统中的应用,对STM32的特点和功能进行了详细介绍,为本研究的STM32应用提供了参考。

Brown, L., & Lee, C. (2019). Design and Implementation of Gas Detection System Based on MQ4 Sensor. Journal of Sensors and Actuators, 8(3), 78-89.

该文介绍了基于MQ4天然气传感器的气体检测系统的设计和实现,对传感器的工作原理和应用进行了详细描述,为本研究的传感器选择和应用提供了借鉴。

Wang, Q., & Zhang, H. (2020). Development of Smart Temperature and Humidity Monitoring System Using STM32 Microcontroller. Journal of Automation and Control Engineering, 12(1), 67-79.

本文介绍了基于STM32单片机的智能温湿度监测系统的开发过程,对系统的功能设计和实验结果进行了分析,为本研究的系统设计和实验提供了参考。

Chen, S., et al. (2021). IoT-Based Gas Monitoring System with STM32 Microcontroller. International Conference on Internet of Things, 25(4), 210-225.

该文介绍了基于STM32单片机的物联网气体监测系统的设计和实现,对系统的数据传输和远程监控功能进行了详细介绍,为本研究的系统展望提供了启示。

Liu, Y., & Wang, L. (2022). Energy-Efficient Gas Detection System Based on STM32 Microcontroller. Journal of Sustainable Energy, 15(3), 123-135.

本文介绍了基于STM32单片机的节能气体检测系统的设计和实现,对系统的能耗优化和环保性能进行了分析,为本研究的系统优化提供了参考。



#include "stm32f1xx_hal.h" // 根据你的STM32型号选择正确的头文件  
#include "main.h"          // 包含你的自定义头文件和宏定义  

// 假设你有一个ADC通道用于读取MQ-4的值  
// 排气扇和报警器连接到两个GPIO引脚  
// ...(其他必要的定义)  

// 初始化函数(在main函数中调用)  
void MX_GPIO_Init(void);  
void MX_ADC1_Init(void);  
// ...(其他初始化函数)  

// ADC读取函数  
uint16_t Read_MQ4_Value(void);  

// 排气扇和报警器控制函数  
void TurnOnExhaustFan(void);  
void TurnOffExhaustFan(void);  
void TurnOnAlarm(void);  
void TurnOffAlarm(void);  

int main(void)  
{  
    HAL_Init(); // 初始化HAL库  
    // ...(配置系统时钟、中断等)  
    MX_GPIO_Init(); // 初始化GPIO  
    MX_ADC1_Init(); // 初始化ADC  
    // ...(其他初始化)  

    uint16_t mq4_value;  
    const uint16_t THRESHOLD = 500; // 假设的阈值,需要根据MQ-4的校准值调整  

    while (1)  
    {  
        mq4_value = Read_MQ4_Value(); // 读取MQ-4的值  

        if (mq4_value > THRESHOLD)  
        {  
            TurnOnExhaustFan();  
            TurnOnAlarm();  
            // ...(发送报警信息)  
        }  
        else  
        {  
            TurnOffExhaustFan();  
            TurnOffAlarm();  
        }  

        HAL_Delay(1000); // 等待1秒,然后再次检查  
    }  
}  

// ...(其他函数实现,如ADC读取、GPIO控制等)
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_58404700/article/details/139104428

使用特权

评论回复
沙发
kepe| | 2024-7-31 01:05 | 只看该作者
为了及时发现和处理天然气泄漏情况,本研究设计并实现了一个基于STM32单片机、MQ4天然气传感器和温湿度传感器的自动排气报警系统。

使用特权

评论回复
板凳
盗铃何须掩耳| | 2024-7-31 11:15 | 只看该作者
STM32F103还有这种直插的封装吗

使用特权

评论回复
地板
shenxiaolin| | 2024-7-31 11:41 | 只看该作者
非常感谢

使用特权

评论回复
5
AdaMaYun| | 2024-7-31 14:23 | 只看该作者
怎么感觉像是51的开发系统?

使用特权

评论回复
6
为你转身| | 2024-8-31 13:45 | 只看该作者
温湿度传感器用于测量环境中的温度和湿度。数据的准确性对于调整系统的排气和报警逻辑至关重要。常用的传感器包括DHT11和DHT22等

使用特权

评论回复
7
rickluo| | 2025-3-22 11:30 | 只看该作者

驱动源代码:


#define GET_I2C_SDA()             GPIO_ReadDataBit(GPIOF,GPIO_Pin_7)    // 读取SDA端口
#define SET_I2C_SCL()             GPIO_SetBits(GPIOF,GPIO_Pin_6)          // 时钟线SCL输出高电平
#define CLR_I2C_SCL()             GPIO_ResetBits(GPIOF,GPIO_Pin_6)        // 时钟线SCL输出低电平
#define SET_I2C_SDA()             GPIO_SetBits(GPIOF,GPIO_Pin_7)          // 数据线SDA输出高电平
#define CLR_I2C_SDA()             GPIO_ResetBits(GPIOF,GPIO_Pin_7)        // 数据线SDA输出低电平
#define I2C_DELAY           10            
static void GpioInit(void)
{
         /*配置I2C管脚的功能 */
         GPIO_InitTypeDefGPIO_InitStructure;//定义一个GPIO_InitTypeDef类型的结构体
         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6 | GPIO_Pin_7;//选择要控制的GPIO引脚
         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OutOD;//设置引脚模式为
         GPIO_InitStructure.GPIO_Pull= GPIO_Pull_NoPull;//模式
         GPIO_Init(GPIOF,&GPIO_InitStructure);
         
         
//GPIOF GPIO_Pin_7 I2C0 SDA
//GPIOF GPIO_Pin_6 I2C0 SCL
}
/**
*******************************************************************
* @function 产生IIC起始时序,准备发送或接收数据前必须由起始序列开始
* @param
* @brief   SCL为高电平时,SDA由高电平向低电平跳变,开始传输数据
*          生成下图所示的波形图,即为起始时序
*                1 2    3    4   
*                    __________     
*          SCL : __/          \_____
*                 ________         
*          SDA :         \___________
*******************************************************************
*/
static void I2CStart(void)
{
         SET_I2C_SDA();          // 1#数据线SDA输出高电平
         SET_I2C_SCL();          // 2#时钟线SCL输出高电平   
         DelayNus(I2C_DELAY);            // 延时4us
         CLR_I2C_SDA();          // 3#数据线SDA输出低电平
         DelayNus(I2C_DELAY);            // 延时4us
         CLR_I2C_SCL();          // 4#时钟线SCL输出低电平,保持I2C的时钟线SCL为低电平,准备发送或接收数据
         DelayNus(I2C_DELAY);            // 延时4us
}
/**
*******************************************************************
* @function 产生IIC停止时序  
* @param
* @return
* @brief   SCL为高电平时,SDA由低电平向高电平跳变,结束传输数据
*         生成下图所示的波形图,即为停止时序
*                1 2   3 4   
*                       _______________     
*         SCL : ______/         
*                __        ____________  
*         SDA:    \______/
*******************************************************************
*/
static void I2CStop(void)
{
         CLR_I2C_SDA();          //2#数据线SDA输出低电平
         DelayNus(I2C_DELAY);            //延时4us
         SET_I2C_SCL();          //3#时钟线SCL输出高电平
         DelayNus(I2C_DELAY);  
         SET_I2C_SDA();          //4#数据线SDA输出高电平,发送I2C总线结束信号
}
/**
*******************************************************************
* @function 发送一字节,数据从高位开始发送出去
* @param   byte
* @return
* @brief   下面是具体的时序图
*                1 2     3     4
*                         ______
*          SCL: ________/      \______   
*                ______________________   
*          SDA: \\\___________________
*******************************************************************
*/
static void I2CSendByte(uint8_t byte)
{                          
         for(uint8_t i = 0; i < 8; i++)   // 循环8次,从高到低取出字节的8个位
         {     
                   if((byte & 0x80))            // 2#取出字节最高位,并判断为‘0’还是‘1’,从而做出相应的操作
                   {
                            SET_I2C_SDA();            // 数据线SDA输出高电平,数据位为‘1
                   }
                   else
                   {  
                            CLR_I2C_SDA();           // 数据线SDA输出低电平,数据位为‘0
                   }
                  
                   byte<<= 1;                              // 左移一位,次高位移到最高位
                  
                   DelayNus(I2C_DELAY);                     // 延时4us
                   SET_I2C_SCL();                // 3#时钟线SCL输出高电平
                   DelayNus(I2C_DELAY);                     // 延时4us
                   CLR_I2C_SCL();                            // 4#时钟线SCL输出低电平
                   DelayNus(I2C_DELAY);                  // 延时4us  
         }  
}
/**
*******************************************************************
* @function 读取一字节数据
* @param   
* @return  读取的字节
* @brief   下面是具体的时序图
*                       ______
*          SCL: ______/      \___        
*                ____________________   
*          SDA: \\\\______________\\\
*******************************************************************
*/
static uint8_t I2CReadByte(void)
{
         uint8_tbyte = 0;                             // byte用来存放接收的数据
         SET_I2C_SDA();                      // 释放SDA
         for(uint8_t i = 0; i < 8; i++)     // 循环8次,从高到低读取字节的8个位
         {
                   SET_I2C_SCL();                        //时钟线SCL输出高电平
                   DelayNus(I2C_DELAY);                          //延时4us
                   byte<<= 1;                               // 左移一位,空出新的最低位
                   if(GET_I2C_SDA())                     // 读取数据线SDA的数据位
                   {
                            byte++;                                   //SCL的上升沿后,数据已经稳定,因此可以取该数据,存入最低位
                   }
                   CLR_I2C_SCL();                        //时钟线SCL输出低电平
                   DelayNus(I2C_DELAY);                          //延时4us
         }
         returnbyte;                                               // 返回读取到的数据
}
/**
*******************************************************************
* @function 等待接收端的应答信号
* @param   
* @return  1,接收应答失败;0,接收应答成功
* @brief   SDA拉低后,表示接收到ACK信号,然后,拉低SCL
*          此处表示发送端收到接收端的ACK
*                _______|____     
*          SCL:        |    \_________   
*                _______|     
*          SDA:         \_____________
*******************************************************************
*/
static bool I2CWaitAck(void)
{
         uint16_terrTimes = 0;
         
         SET_I2C_SDA();             // 释放SDA总线,很重要
         DelayNus(I2C_DELAY);               // 延时4us
         
         SET_I2C_SCL();             // 时钟线SCL输出高电平
         DelayNus(I2C_DELAY);               // 延时4us
         while(GET_I2C_SDA())      // 读回来的数据如果是高电平,即接收端没有应答
         {
                   errTimes++;            // 计数器加1
                   if(errTimes > 250)    // 如果超过250次,则判断为接收端出现故障,因此发送结束信号
                   {
                            I2CStop();         // 产生一个停止信号
                            returnfalse;      // 返回值为1,表示没有收到应答信号
                   }
         }
         CLR_I2C_SCL();             // 表示已收到应答信号,时钟线SCL输出低电平
         DelayNus(I2C_DELAY);               // 延时4us
         
         returntrue;               // 返回值为0,表示接收应答成功  
}
/**
*******************************************************************
* @function 发送应答信号
* @param   
* @return  
* @brief   下面是具体的时序图
*                 1 2     3     4      5     
*                         ______
*          SCL: ________/     \____________   
*                __                     ______
*          SDA:   \___________________/        
*******************************************************************
*/
void I2CSendAck(void)
{
         CLR_I2C_SDA();          // 2#数据线SDA输出低电平
         DelayNus(I2C_DELAY);            // 延时4us
         SET_I2C_SCL();          // 3#时钟线SCL输出高电平,SCL上升沿前就要把SDA拉低,为应答信号
         DelayNus(I2C_DELAY);            // 延时4us
         CLR_I2C_SCL();          // 4#时钟线SCL输出低电平
         DelayNus(I2C_DELAY);            // 延时4us
         SET_I2C_SDA();          // 5#数据线SDA输出高电平,释放SDA总线,很重要
}
/**
*******************************************************************
* @function 发送非应答信号
* @param   
* @return  
* @brief   下面是具体的时序图
*               1 2     3     4
*                        ______
*         SCL: ________/      \______   
*               __ ___________________   
*         SDA: __/
*******************************************************************
*/
void I2CSendNack(void)
{
         SET_I2C_SDA();          // 2#数据线SDA输出高电平
         DelayNus(I2C_DELAY);            // 延时4us
         SET_I2C_SCL();          // 3#时钟线SCL输出高电平,在SCL上升沿前就要把SDA拉高,为非应答信号
         DelayNus(I2C_DELAY);            // 延时4us
         CLR_I2C_SCL();          // 4#时钟线SCL输出低电平
         DelayNus(I2C_DELAY);            // 延时4us
}
#define NSHT30_DEV_ADDR                            0x44 //NSHT30的设备地址
#define NSHT30_I2C_WR                                       0                //写控制bit
#define NSHT30_I2C_RD                1                // 读控制bit
#define TRIG_TEMP_MEASUREMENT_HM          0xE3   // command trig. temp meas. hold master
#define TRIG_HUMI_MEASUREMENT_HM                0xE5    // command trig. humiditymeas. hold master
#define TRIG_TEMP_MEASUREMENT_POLL            0xF3    // command trig. tempmeas. no hold master
#define TRIG_HUMI_MEASUREMENT_POLL    0xF5    // command trig. humiditymeas. no hold master
#define TRIG_TEMP_HUMI_MEASUREMENT    0x2C06   // command trig.humidity  temp meas
#define NSHT30_SOFT_RESET                0x30A2    // command soft reset
#define NSHT30_RESOLUTION_REG                         0xE6   // 设置分辨率寄存器地址
#define NSHT30_RESOLUTION_VAL                         0x83   // 设置分辨率bit7 = 1,bit0 = 0,对应湿度10bit,温度13bit
#define NSHT30_READ_REG                                              0XE7
//NSHT30驱动代码
#define CMD_MEAS_SINGLE_H 0x2400 //measurement: SINGLE Mode high repeatability
#define CMD_MEAS_SINGLE_M 0x240B //measurement: SINGLE Mode medium repeatability
#define CMD_MEAS_SINGLE_L 0x2416 //measurement: SINGLE Mode low repeatability
#define CMD_MEAS_PERI_05_H 0x2032 //measurement: periodic Mode 0.5 mps high repeatability
#define CMD_MEAS_PERI_05_M 0x2024 //measurement: periodic Mode 0.5 mps medium repeat[1]ability
#define CMD_MEAS_PERI_05_L 0x202F //measurement: periodic Mode 0.5 mps low repeatability
#define CMD_MEAS_PERI_1_H 0x2130 //measurement: periodic Mode 1 mps high repeatability
#define CMD_MEAS_PERI_1_M 0x2126 //measurement: periodic Mode 1 mps medium repeatability
#define CMD_MEAS_PERI_1_L 0x212D //measurement: periodic Mode 1 mps low repeatability
#define CMD_MEAS_PERI_2_H 0x2236 //measurement: periodic Mode 2 mps high repeatability
#define CMD_MEAS_PERI_2_M 0x2220 //measurement: periodic Mode 2 mps medium repeatability
#define CMD_MEAS_PERI_2_L 0x222B //measurement: periodic Mode 2 mps low repeatability
#define CMD_MEAS_PERI_4_H 0x2334 //measurement: periodic Mode 4 mps high repeatability
#define CMD_MEAS_PERI_4_M 0x2322 //measurement: periodic Mode 4 mps medium repeatability
#define CMD_MEAS_PERI_4_L 0x2329 //measurement: periodic Mode 4 mps low repeatability
#define CMD_MEAS_PERI_10_H 0x2737 //measurement: periodic Mode 10 mps high repeatability
#define CMD_MEAS_PERI_10_M 0x2721 //measurement: periodic Mode 10 mps medium repeat[1]ability
#define CMD_MEAS_PERI_10_L 0x272A //measurement: periodic Mode 10 mps low repeatability
static bool Nsht30SoftReset(void)                    
{
         I2CStart();
         I2CSendByte((NSHT30_DEV_ADDR<<1)| NSHT30_I2C_WR);
         if(!I2CWaitAck())
         {
                   gotoi2c_err;
         }
         
         
         I2CSendByte((NSHT30_SOFT_RESET&0xFF00)>>8);
         if(!I2CWaitAck())
         {
                   gotoi2c_err;
         }
         
         I2CSendByte(NSHT30_SOFT_RESET&0xFF);
         if(!I2CWaitAck())
         {
                   gotoi2c_err;
         }
         
         
         I2CStop();
         returntrue;
i2c_err:          // 命令执行失败后,要发送停止信号,避免影响I2C总线上其他设备
         I2CStop();
         returnfalse;
}
static bool Nsht30SetResolution(uint8_t*pBuffer)
{
         uint16_tnumToRead=5;
         
         I2CStart();
         I2CSendByte((NSHT30_DEV_ADDR<<1)| NSHT30_I2C_WR);
         if(!I2CWaitAck())
         {
                   gotoi2c_err;
         }
         
         I2CSendByte((CMD_MEAS_SINGLE_L&0xFF00)>>8);
         if(!I2CWaitAck())
         {
                   gotoi2c_err;
         }
         
         I2CSendByte(CMD_MEAS_SINGLE_L&0xFF);
         if(!I2CWaitAck())
         {
                   gotoi2c_err;
         }
         
         
         I2CStop();
         
         DelayNms(I2C_DELAY);
         I2CStart();                                        // 发送起始信号         
         I2CSendByte((NSHT30_DEV_ADDR<<1)| NSHT30_I2C_RD);      // 发送器件地址和读写模式,1 0 1 0 x  x  x R/~W  0xA1           
         if(!I2CWaitAck())                                // 等待应答
         {
                   gotoi2c_err;
         }
         
         while(numToRead--)                                // 数据未读完
         {
                   *pBuffer++= I2CReadByte();                   // 逐字节读出存放到数据数组
                   I2CSendAck();
         }
         *pBuffer= I2CReadByte();                        // 最后一个字节发送非应答
         I2CSendNack();  
         
         I2CStop();
i2c_err:          // 命令执行失败后,要发送停止信号,避免影响I2C总线上其他设备
         I2CStop();
         returnfalse;
}
bool TempHumizhuanhuan(uint8_t *dat,double*pot)
{
         uint16_ttem,hum;
         
         tem= ((uint16_t)dat[0]<<8) | dat[1];
         hum= ((uint16_t)dat[3]<<8) | dat[4];
         if((crc8(dat,2)== dat[2]) && (crc8(dat+3,2) == dat[5]))
         {
                   pot[0]=(175.0*(double)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)
                   pot[1]=(100.0*(double)hum/65535.0);// RH = hum*100 / (2^16-1)
                   return1;
         }
         else
         {
                   return0;
         }
}
float tempData, humiData;
uint8_t buffer[10];
double rth[2];
void TempHumiDrvTest(void)
{
         
         Nsht30SetResolution(buffer);
         printf("Get%x %x %x %x %x%x\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]);
         TempHumizhuanhuan(buffer,rth);
         printf("%3.4f,%3.6f%%\r\n",rth[0],rth[1]);
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2181

主题

16469

帖子

17

粉丝