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

[复制链接]
 楼主| jinglixixi 发表于 2022-11-19 22:22 | 显示全部楼层 |阅读模式
#申请原创#

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

  5. void OUTPUT_MODE_SET()
  6. {
  7.      GPIO_Init(GPIO0,GPIO_PIN_5, GPIO_MODE_OUT_PP);
  8. }

BMP085的初始化函数为:
  1. void Init_BMP085()
  2. {
  3.     ac1 = Multiple_read(0xAA);
  4.     ac2 = Multiple_read(0xAC);
  5.     ac3 = Multiple_read(0xAE);
  6.     ac4 = Multiple_read(0xB0);
  7.     ac5 = Multiple_read(0xB2);
  8.     ac6 = Multiple_read(0xB4);
  9.     b1 =  Multiple_read(0xB6);
  10.     b2 =  Multiple_read(0xB8);
  11.     mb =  Multiple_read(0xBA);
  12.     mc =  Multiple_read(0xBC);
  13.     md =  Multiple_read(0xBE);
  14. }

BMP085进行字节数据发送与接收的函数为:
  1. void BMP085_Send_Byte(char txd)
  2. {
  3.     char t;
  4.     OUTPUT_MODE_SET();
  5.     SCLK=0;
  6.     for(t=0;t<8;t++)
  7.     {
  8.         if((txd&0x80)>>7)
  9.             SDIN=1;
  10.         else
  11.             SDIN=0;
  12.         txd<<=1;
  13.         Delay_us(2);
  14.         SCLK=1;
  15.         Delay_us(2);
  16.         SCLK=0;
  17.         Delay_us(2);
  18.     }
  19. }

  20. char BMP085_Read_Byte(unsigned char ack)
  21. {
  22.       unsigned char i,receive=0;
  23.       INPUT_MODE_SET();
  24.       for(i=0;i<8;i++)
  25.       {
  26.         SCLK=0;
  27.         Delay_us(2);
  28.         SCLK=1;
  29.         receive<<=1;
  30.         if(SDA_IN) receive++;
  31.         Delay_us(2);
  32.     }
  33.     if(!ack)
  34.         BMP085_NAck();
  35.     else
  36.         BMP085_Ack();
  37.     return receive;
  38. }

BMP085读取温度和大气压的函数为:
  1. long bmp085ReadTemp(void)
  2. {
  3.     BMP085_Start();
  4.     BMP085_Send_Byte(BMP085_SlaveAddress);
  5.     while(BMP085_Wait_Ack());
  6.     BMP085_Send_Byte(0xF4);
  7.     while(BMP085_Wait_Ack());
  8.     BMP085_Send_Byte(0x2E);
  9.     while(BMP085_Wait_Ack());
  10.     BMP085_Stop();
  11.     Delay(1000);
  12.     return (long) Multiple_read(0xF6);
  13. }

  14. long bmp085ReadPressure(void)
  15. {
  16.     long pressure = 0;
  17.     BMP085_Start();
  18.     BMP085_Send_Byte(BMP085_SlaveAddress);
  19.     while(BMP085_Wait_Ack()){}
  20.     BMP085_Send_Byte(0xF4);
  21.     while(BMP085_Wait_Ack()){}
  22.     BMP085_Send_Byte(0x34);
  23.     while(BMP085_Wait_Ack()){}
  24.     BMP085_Stop();
  25.     Delay(1000);
  26.     pressure = Multiple_read(0xF6);
  27.     pressure &= 0x0000FFFF;
  28.     return pressure;
  29. }

实现温度及大气压检测的主程序为:
  1. void main(void)
  2. {
  3.         Delay(50);
  4.         P0CON = 0xFF;
  5.         P0PH  = 0x00;
  6.         P1CON = 0x00;
  7.         P1PH  = 0x00;
  8.         P2CON = 0xFF;
  9.         P2PH  = 0x00;
  10.         P3CON = 0xFF;
  11.         P3PH  = 0x00;
  12.         P4CON = 0xFF;
  13.         P4PH  = 0x01;
  14.         P5CON = 0xFF;
  15.         P5PH  = 0x00;
  16.         GPIO_Init(GPIO0, GPIO_PIN_4 | GPIO_PIN_5 |GPIO_PIN_6, GPIO_MODE_OUT_PP);
  17.         GPIO_Init(GPIO2, GPIO_PIN_2, GPIO_MODE_OUT_PP);
  18.         GPIO_Init(GPIO5, GPIO_PIN_3, GPIO_MODE_OUT_PP);
  19.     GPIO_Init(GPIO4, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5, GPIO_MODE_OUT_PP);
  20.         Delay(100);
  21.         Lcd_Init();
  22.     LCD_Clear(RED);
  23.         BACK_COLOR=RED;
  24.         LCD_Picturea();
  25.         LCD_ShowChinese(80,10,0,16,YELLOW);
  26.         LCD_ShowChinese(96,10,1,16,YELLOW);
  27.         LCD_ShowChar(112,10,':',0,YELLOW);
  28.         LCD_ShowChinese(80,30,2,16,YELLOW);
  29.         LCD_ShowChinese(96,30,3,16,YELLOW);
  30.         LCD_ShowChar(112,30,':',0,YELLOW);
  31.         LCD_ShowChinese(80,50,4,16,YELLOW);
  32.         LCD_ShowChinese(96,50,5,16,YELLOW);
  33.         LCD_ShowChar(112,50,':',0,YELLOW);
  34.         Init_BMP085();
  35.         Delay(500);
  36.         while(1)
  37.         {
  38.             bmp085Convert();
  39.                 LCD_ShowNum(120,10,temperature/10,2,YELLOW);
  40.               LCD_ShowNum(120,30,pressure/100,4,YELLOW);
  41.                 Delay(1000);
  42.         }
  43. }

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


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

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

在使用工具软件构建好汉字库后,其显示函数为:
  1. void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size,u16 color)
  2. {
  3.     u8 i,j;
  4.     u8 *temp,size1;
  5.     if(size==16)temp=Hzk16;
  6.     LCD_Address_Set(x,y,x+size-1,y+size-1);
  7.     size1=size*size/8;
  8.     temp+=index*size1;
  9.     for(j=0;j<size1;j++)
  10.     {
  11.         for(i=0;i<8;i++)
  12.         {
  13.             if((*temp&(1<<i))!=0)
  14.             {
  15.                 LCD_WR_DATA(color);
  16.             }
  17.             else
  18.             {
  19.                 LCD_WR_DATA(BACK_COLOR);
  20.             }
  21.         }
  22.         temp++;
  23.      }
  24. }

4.jpg
图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最大的测量范围是多少?
 楼主| jinglixixi 发表于 2023-2-8 08:28 | 显示全部楼层
elsaflower 发表于 2023-2-7 22:10
BMP085最大的测量范围是多少?

没测过,常规的大气压应该不会有问题。
minzisc 发表于 2023-2-8 12:48 | 显示全部楼层
温度和大气压有补偿的作用的吗?              
 楼主| jinglixixi 发表于 2023-2-8 17:25 | 显示全部楼层
minzisc 发表于 2023-2-8 12:48
温度和大气压有补偿的作用的吗?

没见到过相关的介绍资料,就其可以检测这2个数据来讲,应该会有这方面的处理,毕竟是一个修正格式的问题呀。
weifeng90 发表于 2023-2-8 18:29 来自手机 | 显示全部楼层
UI可以在优化一下,这时候就体现美工重要性了。
sesefadou 发表于 2023-5-5 23:09 | 显示全部楼层
测试周围环境温度的应用程序吗              
macpherson 发表于 2023-5-7 14:54 | 显示全部楼层
MP085通常被连接到微控制器或单片机上,通过I2C或SPI接口进行数据交互和控制。
mmbs 发表于 2023-5-7 15:44 | 显示全部楼层
采用了先进的微机电系统(MEMS)技术和高精度A/D转换器,能够测量大气压力、海拔高度以及周围环境温度。
sanfuzi 发表于 2023-5-7 16:04 | 显示全部楼层
温湿度特性曲线对大气压检测的影响是什么?
wengh2016 发表于 2023-5-7 16:16 | 显示全部楼层
环境检测气压多少范围内需要换算
modesty3jonah 发表于 2023-5-7 17:16 | 显示全部楼层
BMP085是一种集成了压力和温度传感器的数字式气压计
nomomy 发表于 2023-5-7 18:02 | 显示全部楼层
BMP085广泛应用于天气预报、室内外温度监测、航空航天等领域。
ccook11 发表于 2023-5-7 20:47 | 显示全部楼层
大气压是怎样测出来的?               
i1mcu 发表于 2023-5-7 21:07 | 显示全部楼层
环境温湿度传感器能测大气压吗              
 楼主| jinglixixi 发表于 2023-5-8 08:19 | 显示全部楼层
i1mcu 发表于 2023-5-7 21:07
环境温湿度传感器能测大气压吗

BMP085既能测温度也能测大气压
 楼主| jinglixixi 发表于 2023-5-8 08:20 | 显示全部楼层
ccook11 发表于 2023-5-7 20:47
大气压是怎样测出来的?

传感器上有采集空,估计是一种膜来感知大气压。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部