1248|0

1514

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【便携式环境状态检测器】温度与大气压检测 [复制链接]

 

BMP085是一款环境温度与大气压检测器件,它也是以I2C接口来工作,其处理方式与BH1750光照强度传感器的使用有很大的相似性,温度与大气压检测显示如下图所示。

检测效果显示图

 

BMP0850所使用的引脚为:

GPIO13---SDA

GPIO11---SCL

BMP085的初始化函数为:

voidInit_BMP085(void)
{
         ac1 = Multiple_read(0xAA);
         ac2 = Multiple_read(0xAC);
         ac3 = Multiple_read(0xAE);
         ac4 = Multiple_read(0xB0);
         ac5 = Multiple_read(0xB2);
         ac6 = Multiple_read(0xB4);
         b1 =  Multiple_read(0xB6);
         b2 =  Multiple_read(0xB8);
         mb =  Multiple_read(0xBA);
         mc =  Multiple_read(0xBC);
         md =  Multiple_read(0xBE);
}

读取温度的函数为:

long bmp085ReadTemp(void)
{
    BMP085_Start();
    BMP085_Send_Byte(BMP085_SlaveAddress);
    while(BMP085_Wait_Ack());
    BMP085_Send_Byte(0xF4);
    while(BMP085_Wait_Ack());
    BMP085_Send_Byte(0x2E);
    while(BMP085_Wait_Ack());
    BMP085_Stop();
    vTaskDelay(1);
    return (long) Multiple_read(0xF6);
}

 

读取大气压的函数为:

long bmp085ReadPressure(void)
{
    long pressure = 0;
    BMP085_Start();
    BMP085_Send_Byte(BMP085_SlaveAddress);
    while(BMP085_Wait_Ack()){}
    BMP085_Send_Byte(0xF4);
    while(BMP085_Wait_Ack()){}
    BMP085_Send_Byte(0x34);
    while(BMP085_Wait_Ack()){}
    BMP085_Stop();
    vTaskDelay(1);
    pressure = Multiple_read(0xF6);
    pressure&= 0x0000FFFF;
    return pressure;
}

 

BMP085数值转换函数为:

void bmp085Convert(void)
{
      unsigned int ut;
      unsigned long up;
      long x1, x2, b5, b6, x3, b3, p;
      unsigned long b4, b7;
      ut = bmp085ReadTemp();
      up = bmp085ReadPressure();
      x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
      x2 = ((long) mc << 11) / (x1 + md);
      b5 = x1 + x2;
      temperature1 = ((b5 + 8) >> 4);
      b6 = b5 - 4000;
      x1 = (b2 * (b6 * b6)>>12)>>11;
      x2 = (ac2 * b6)>>11;
      x3 = x1 + x2;
      b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
      x1 = (ac3 * b6)>>13;
      x2 = (b1 * ((b6 * b6)>>12))>>16;
      x3 = ((x1 + x2) + 2)>>2;
      b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
      b7 = ((unsigned long)(up - b3) * (50000>>OSS));
      if (b7 < 0x80000000)
        p = (b7<<1)/b4;
      else
        p = (b7/b4)<<1;
      x1 = (p>>8) * (p>>8);
      x1 = (x1 * 3038)>>16;
      x2 = (-7357 * p)>>16;
      pressure = p+((x1 + x2 + 3791)>>4);
}

温度大气压检测的主程序为:

void app_main(void)
{
    configure_led();
    configure_Oled();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0,0,"ESP32-S2-Kaluga",16);
    OLED_ShowString(16,2,"OLED & BMP085",16);
    BMP085_Init();
    Init_BMP085();
    OLED_ShowString(0,4,"t=     C",16);
    OLED_ShowString(0,6,"p=       KPa",16);
    while (1) {
        blink_led();
        s_led_state = !s_led_state;
        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
        bmp085Convert();
        OLED_ShowNum(24,4,temperature1/10,3,16);
        OLED_ShowNum(24,6,pressure/100,5,16);
    }
}

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表