打印
[开发工具]

【新定义MCU开发板测评】 + 环境温度及大气压检测

[复制链接]
1640|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#

BMP085是一款数字式温度大气压传感器,并以I2C方式工作,相对于I2C方式工作的OLED屏,它不仅使用输出模式输出,还用到输入模式。
图1 整体构成
BMP085与开发板的连接关系为:
SCL---P04
SDA---P05
为便于使用,对这2个引脚做如下的定义:
#define SCLK        P04
#define SDIN        P05
#define SDA_IN      P05
数据引脚切换输入、输出模式的函数为:
void INPUT_MODE_SET()
{
           GPIO_Init(GPIO0, GPIO_PIN_5, GPIO_MODE_IN_PU);
}

void OUTPUT_MODE_SET()
{
     GPIO_Init(GPIO0,GPIO_PIN_5, GPIO_MODE_OUT_PP);
}

BMP085的初始化函数为:
void Init_BMP085()
{
    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);
}

BMP085进行字节数据发送与接收的函数为:
void BMP085_Send_Byte(char txd)
{
    char t;
    OUTPUT_MODE_SET();
    SCLK=0;
    for(t=0;t<8;t++)
    {
        if((txd&0x80)>>7)
            SDIN=1;
        else
            SDIN=0;
        txd<<=1;
        Delay_us(2);
        SCLK=1;
        Delay_us(2);
        SCLK=0;
        Delay_us(2);
    }
}

char BMP085_Read_Byte(unsigned char ack)
{
      unsigned char i,receive=0;
      INPUT_MODE_SET();
      for(i=0;i<8;i++)
      {
        SCLK=0;
        Delay_us(2);
        SCLK=1;
        receive<<=1;
        if(SDA_IN) receive++;
        Delay_us(2);
    }
    if(!ack)
        BMP085_NAck();
    else
        BMP085_Ack();
    return receive;
}

BMP085读取温度和大气压的函数为:
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();
    Delay(1000);
    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();
    Delay(1000);
    pressure = Multiple_read(0xF6);
    pressure &= 0x0000FFFF;
    return pressure;
}

实现温度及大气压检测的主程序为:
void main(void)
{
        Delay(50);
        P0CON = 0xFF;
        P0PH  = 0x00;
        P1CON = 0x00;
        P1PH  = 0x00;
        P2CON = 0xFF;
        P2PH  = 0x00;
        P3CON = 0xFF;
        P3PH  = 0x00;
        P4CON = 0xFF;
        P4PH  = 0x01;
        P5CON = 0xFF;
        P5PH  = 0x00;
        GPIO_Init(GPIO0, GPIO_PIN_4 | GPIO_PIN_5 |GPIO_PIN_6, GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO2, GPIO_PIN_2, GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO5, GPIO_PIN_3, GPIO_MODE_OUT_PP);
    GPIO_Init(GPIO4, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5, GPIO_MODE_OUT_PP);
        Delay(100);
        Lcd_Init();
    LCD_Clear(RED);
        BACK_COLOR=RED;
        LCD_Picturea();
        LCD_ShowChinese(80,10,0,16,YELLOW);
        LCD_ShowChinese(96,10,1,16,YELLOW);
        LCD_ShowChar(112,10,':',0,YELLOW);
        LCD_ShowChinese(80,30,2,16,YELLOW);
        LCD_ShowChinese(96,30,3,16,YELLOW);
        LCD_ShowChar(112,30,':',0,YELLOW);
        LCD_ShowChinese(80,50,4,16,YELLOW);
        LCD_ShowChinese(96,50,5,16,YELLOW);
        LCD_ShowChar(112,50,':',0,YELLOW);
        Init_BMP085();
        Delay(500);
        while(1)
        {
            bmp085Convert();
                LCD_ShowNum(120,10,temperature/10,2,YELLOW);
              LCD_ShowNum(120,30,pressure/100,4,YELLOW);
                Delay(1000);
        }
}

经编译和下载,其运行效果如图2所示。
图2检测效果


在图片显示方面,受存储空间的限制,需对图片进行缩小,所用工具如图3所示。
图3 图片数组文件生成

该图片的原尺寸为80*80像素点,为了能将其存入程序,需改变图片的尺寸,其处理后的尺寸为50*50像素点。
对应的显示函数为:
void LCD_Picturea(void)
{
    int i;
      LCD_Address_Set(15,15,64,64);
      for(i=0;i<6400;i++)
      {
            LCD_WR_DATA8(gImage_cgq[i*2]);
            LCD_WR_DATA8(gImage_cgq[i*2+1]);
      }
}

在使用工具软件构建好汉字库后,其显示函数为:
void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size,u16 color)
{
    u8 i,j;
    u8 *temp,size1;
    if(size==16)temp=Hzk16;
    LCD_Address_Set(x,y,x+size-1,y+size-1);
    size1=size*size/8;
    temp+=index*size1;
    for(j=0;j<size1;j++)
    {
        for(i=0;i<8;i++)
        {
            if((*temp&(1<<i))!=0)
            {
                LCD_WR_DATA(color);
            }
            else
            {
                LCD_WR_DATA(BACK_COLOR);
            }
        }
        temp++;
     }
}

图4 中文字模提取

使用特权

评论回复
沙发
iyoum| | 2023-2-7 20:14 | 只看该作者
可以将气压转换为高度数值吗?              

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2023-2-7 20:28 | 只看该作者
iyoum 发表于 2023-2-7 20:14
可以将气压转换为高度数值吗?

可以按照物理定律来实现,但使用时要先获取一个基准的气压值和高度值来辅助计算。

使用特权

评论回复
地板
elsaflower| | 2023-2-7 22:10 | 只看该作者
BMP085最大的测量范围是多少?

使用特权

评论回复
5
jinglixixi|  楼主 | 2023-2-8 08:28 | 只看该作者
elsaflower 发表于 2023-2-7 22:10
BMP085最大的测量范围是多少?

没测过,常规的大气压应该不会有问题。

使用特权

评论回复
6
minzisc| | 2023-2-8 12:48 | 只看该作者
温度和大气压有补偿的作用的吗?              

使用特权

评论回复
7
jinglixixi|  楼主 | 2023-2-8 17:25 | 只看该作者
minzisc 发表于 2023-2-8 12:48
温度和大气压有补偿的作用的吗?

没见到过相关的介绍资料,就其可以检测这2个数据来讲,应该会有这方面的处理,毕竟是一个修正格式的问题呀。

使用特权

评论回复
8
weifeng90| | 2023-2-8 18:29 | 只看该作者
UI可以在优化一下,这时候就体现美工重要性了。

使用特权

评论回复
9
sesefadou| | 2023-5-5 23:09 | 只看该作者
测试周围环境温度的应用程序吗              

使用特权

评论回复
10
macpherson| | 2023-5-7 14:54 | 只看该作者
MP085通常被连接到微控制器或单片机上,通过I2C或SPI接口进行数据交互和控制。

使用特权

评论回复
11
mmbs| | 2023-5-7 15:44 | 只看该作者
采用了先进的微机电系统(MEMS)技术和高精度A/D转换器,能够测量大气压力、海拔高度以及周围环境温度。

使用特权

评论回复
12
sanfuzi| | 2023-5-7 16:04 | 只看该作者
温湿度特性曲线对大气压检测的影响是什么?

使用特权

评论回复
13
wengh2016| | 2023-5-7 16:16 | 只看该作者
环境检测气压多少范围内需要换算

使用特权

评论回复
14
modesty3jonah| | 2023-5-7 17:16 | 只看该作者
BMP085是一种集成了压力和温度传感器的数字式气压计

使用特权

评论回复
15
nomomy| | 2023-5-7 18:02 | 只看该作者
BMP085广泛应用于天气预报、室内外温度监测、航空航天等领域。

使用特权

评论回复
16
ccook11| | 2023-5-7 20:47 | 只看该作者
大气压是怎样测出来的?               

使用特权

评论回复
17
i1mcu| | 2023-5-7 21:07 | 只看该作者
环境温湿度传感器能测大气压吗              

使用特权

评论回复
18
jinglixixi|  楼主 | 2023-5-8 08:19 | 只看该作者
i1mcu 发表于 2023-5-7 21:07
环境温湿度传感器能测大气压吗

BMP085既能测温度也能测大气压

使用特权

评论回复
19
jinglixixi|  楼主 | 2023-5-8 08:20 | 只看该作者
ccook11 发表于 2023-5-7 20:47
大气压是怎样测出来的?

传感器上有采集空,估计是一种膜来感知大气压。

使用特权

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

本版积分规则

455

主题

2756

帖子

38

粉丝