一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4764|回复: 4
收起左侧

[DIY套件开发] ARDUINO+BMP085 lcd显示气压与温度

[复制链接]
发表于 2014-8-27 20:58 | 显示全部楼层 |阅读模式
本帖最后由 g54188 于 2014-8-29 21:17 编辑

ARDUINO+BMP085 lcd显示气压与温度
下面上代码及图片
/*
  从BMP085传感器读取温度与气压数据。
  通过Serial.print命令以9600波特率发送至串口监视器。BMP模块接线UNO板接A4,A5;其他的接SCL,SDA  LCD为ST7576驱动-12864液晶屏
*/
#include <U8glib.h>
#include <Wire.h>
#define BMP085_ADDRESS 0x77  // BMP085的I2C地址
U8GLIB_64128N u8g(13, 11, 10, 9, 8);// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
const unsigned char OSS = 0;  // 采样设置

// 校准值
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

// b5用于计算bmp085GetTemperature(...),它也同时用于bmp085GetPressure(...)
// 所以Temperature(...)必须在Pressure(...)之前声明

long b5;
short temperature;
long pressure;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  bmp085Calibration();
}

void loop()
{
  temperature = bmp085GetTemperature(bmp085ReadUT());
  pressure = bmp085GetPressure(bmp085ReadUP());
  Serial.print("Temperature: ");
  //Serial.println(temperature, DEC);
  Serial.println(temperature*0.1);
  //Serial.println(" *0.1 deg C");
  Serial.print("Pressure: ");
  Serial.print(pressure, DEC);
  Serial.println(" Pa");
  Serial.println();
  //delay(1000);
  //--------------------
  u8g.firstPage();  
  do {
    draw();
    }
  while( u8g.nextPage() );
  delay(1000);
}
//---------图表和图形的处理------------------
void draw(void)
{
  u8g.setRot180();//屏幕旋转x度
delay(10);


  u8g.setFont(u8g_font_osb26);//字体设置
  u8g.setPrintPos(15, 48);
  u8g.print(temperature*0.1,2)
  u8g.setFont(u8g_font_osb21);
  u8g.setPrintPos(110, 48);
  u8g.print("C");
  u8g.setFont(u8g_font_osb21);
  u8g.setPrintPos(100, 45);
  u8g.print(char(176));
  u8g.setFont(u8g_font_8x13B);
  u8g.setPrintPos(30, 15);//X,Y
  u8g.print("bmp085.Temp");
  u8g.setFont(u8g_font_8x13B);
  u8g.setPrintPos(18, 62);
  u8g.print(pressure);
  u8g.setPrintPos(110, 62);
  u8g.print("Pa");
  delay(5);
}


//------------------------------

// 存储所有的BMP085的校准值到全局变量
// 校准值用来计算温度与气压
// 这个函数应该放在程序的开头

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

// 计算温度赋值给变量ut
// 返回值的精度在0.1摄氏度

short bmp085GetTemperature(unsigned int ut)
{
  long x1, x2;

  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  x2 = ((long)mc << 11)/(x1 + md);
  b5 = x1 + x2;
  return ((b5 + 8)>>4);  
}

// 计算压力
// 校准值必须是已知的
// B5在bmp085GetTemperature(...)需要使用,所以必须先调用。
// 返回值以Pa为单位

long bmp085GetPressure(unsigned long up)

{
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;
  b6 = b5 - 4000;
  // 计算B3
  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
  // 计算B4
  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;
  p += (x1 + x2 + 3791)>>4;
  return p;
}

// 在BMP085的'address'中读取一个字节
char bmp085Read(unsigned char address)
{
  unsigned char data;
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 1);
  while(!Wire.available())  ;
  return Wire.read();
}
// 从BMP085读取两个字节
// 第一个字节是从'address'
// 第二个字节是从'address'+1
int bmp085ReadInt(unsigned char address)
{
  unsigned char msb, lsb;
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 2);
  while(Wire.available()<2);
  msb = Wire.read();
  lsb = Wire.read();
  return (int) msb<<8 | lsb;
}

// 读取未补偿的温度值
unsigned int bmp085ReadUT()

{
  unsigned int ut;
  // 在寄存器0xF4写入0x2E
  // 这个用来请求进行温度读取
  Wire.beginTransmission(BMP085_ADDRESS);

  Wire.write(0xF4);

  Wire.write(0x2E);
  Wire.endTransmission();
  // 至少等待4.5ms
  delay(5);
  // 从寄存器0xF6与0xF7读取两个字节
  ut = bmp085ReadInt(0xF6);
  return ut;
}

// 读取未补偿的压力值
unsigned long bmp085ReadUP()
{
  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;
  // 写入0x34+(OSS<<6)到寄存器0xF4
  // 请求气压数据读取
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x34 + (OSS<<6));
  Wire.endTransmission();
  // 等待转换,延迟时间依赖于OSS
  delay(2 + (3<<OSS));
  // 读取寄存器0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF6);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 3);
  // 等待数据变为可用
  while(Wire.available() < 3);
  msb = Wire.read();
  lsb = Wire.read();
  xlsb = Wire.read();
  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
  return up;
}

串口显示

串口显示

LCD显示

LCD显示

LCD显示

LCD显示

BMP模块

BMP模块
IMG_20140829_210628_2345看图王.jpg

BMP085.txt

5.17 KB, 下载次数: 0, 下载积分: 一乐金币 -1

售价: 1 人民币  [记录]  [购买]

代码

发表于 2014-8-27 21:16 | 显示全部楼层
弄个再详细点的接线吧,新手看不懂啊
 楼主| 发表于 2014-8-27 21:16 | 显示全部楼层
本帖最后由 g54188 于 2014-8-27 21:39 编辑

对大气压力显示不懂,是否需要这样改
u8g.print(pressure);显示00000
改为
u8g.print(pressure*0.01);显示000.00
IMG_20140827_213551.jpg
 楼主| 发表于 2014-8-27 21:26 | 显示全部楼层
甲子如风 发表于 2014-8-27 21:16
弄个再详细点的接线吧,新手看不懂啊

一楼已加上模块接线说明
 楼主| 发表于 2014-8-27 21:32 | 显示全部楼层
钓鱼~查一下天气预报的大气压值
什么样的气压适合钓鱼呢?根据美国佬的仪表范围, 大气压力在1002--1054毫巴为好钓;其中在 1006--1028毫巴为很好钓! 那么,怎样才能了解气压的高低变化呢?不要再去凭经验了,美国佬都用仪表了,我们就直接查一下天气预报的大气压值就好了。天气在线上就有大气压的实时情况。
    转贴一个表格比较实用(这些影响因子以大气压为分值最大)
    大气气压
    大气压力分值
    存鱼分值
    温度分值
    钓位分值
    钓饵及钓技分值
    950.00 极低 -40分
    极少1分
    极低2分
    极差2分
    不会 4分
    970.00 较低 -20分
    少 6分
    较低6分
    较差4分
    初学6分
    980.00 一般 0分
    一般8分
    一般8分
    一般8分
    一般8分
    990.00
    标准 10分
    中等10分
    适宜10分
    中等10分
    中等10分
    1010.00 较高 20分
    多14分
    较好12分
    较好14分
    较好14分
    1030.00 高 30分
    很多18分
    好14分
    好20分
    好20分
    1050.00 极高 40分
    极多25分
    极好18分
    极好25分
    极好25分
    备注:(1)标准积分总合为五十分,合计积分超过五十分适于出钓!积分越搞越好!
    (2)连续阴雨天转多云或转晴加十分,炎热的夏天中午减二十分。
    (3)地区及海拔高度和帏度不同,因此标准大气压也不同,应根据本地区实际情况定出标准大气压,
    及各种气压级差,再结合本表进行查询。
    举例说明:大气压力1010,较高20分。水域存鱼多14分,温度好14分,钓位好20分,钓技中等10分。
    20分 + 14分 + 14分 + 20分 + 10分 = 78分,积分比标准50分高出24分,出钓定会有较好的收获。
    如果其它因素不变,唯独大气压力变为950,则总积分就只有18分了,比标准50分低太多,准备白板吧!
     大气的这种压力称为气压,是指大气施加于单位面积上的力。所谓某地的气压,就是指该地单位面积垂直向上一直延伸到大气顶空气的总重量。空气柱中的空气越多,压力也就越大。地球上地形差别很大,山峦起伏,高山顶上空气稀薄,山顶的气压就要比山谷低。
     气压变化还受温度的影响,暖空气的密度小,相对较轻,容易产生上升运动,而密度较大、较重的冷空气利于下沉,冷空气常与高气压相伴随。天气预报中常说的冷高压、暖低压就表明了气压和温度之间的密切关系。
     气象上,气压单位常常用百帕表示。一个标准大气压是这样规定的:把温度为0℃、纬度45度海平面上的气压称为1个大气压,水银气压表上的数值为760毫米水银柱高(相当于1013.25百帕)。气象观测站每天定时观测或自记仪器记录当地的气压值。
    重庆的大气压力为:
    冬季743mm·Hg (或99058Pa、990mmbar)
    夏季730mm·Hg(或97325Pa、973mmbar)
    标准大气压力为P=101325Pa (或1013mmbar)
    正常状况下,重庆大气压力与标准大气压力的比为:冬季97.76% 夏季96.05%
    大气压、温度(气温和水温)对鱼情影响很大,如果要用量
    化的手段来分析问题,可能还有些难度;
    渔夫认为:鱼会适应当地的正常大气压,例如拉萨地区的鱼类……只要不出现那些特
    别恶劣的低气压天气,都是可以出钓的;
    夏天的话,室内 这个时候一般是96.4~97.3 KPA左右吧, 冬天室内98.3~99.5左右. 我在搞试验的,每天都要看气压的,大概是这些吧
    P
    不可忽略的氨基酸,多年来钓鲤鱼的经验,氨基酸是很重要的添加剂,尤其是底气压和低温情况下更加明显。氨基酸能有效的促进鱼儿进食的欲望,有点望梅止渴的意思。是不是这样的,试试就知道了。
    发酵是很重要的步骤,发酵后能使鱼饵的味道更加完美,发酵后的酒香味比添加的曲酒味道要强百倍,
    线虫、红虫的确是冬季节垂钓的好饵,腥味足,而且是活饵,不管是钓鱼还是诱鱼都是不错的饵料,但是我个人并不举张使用红虫,第一是觉得脏,第二是红虫、线虫这类微生物饵料对水质的影响非常大,不够环保。
    红糖煮玉米钓江鲤,
    玉米渣用红塘煮过以后不仅味道留得久,而且保证了雾化后还有颗粒雾留在底下
    鲤鱼春、秋比较喜欢浓香,夏季味道相对要清淡点,冬季就要浓腥了。就这段时间的垂钓而言,这边的鲤鱼对甜味情有独钟
    双钩夹线虫
    偷油婆钓的一般都是:江团,水米子,钩从尾部直接钩到头部或者颈部。
    是什么鱼?钩的蟑螂,大约15米水深,鱼很快浮出水面,我打开头灯,浑身泛白的鱼儿在漆黑的夜晚,特别耀眼。“肥头! 真的是肥头!
    鸡肠子钓鲶鱼,他还无私地告诉我,长江钓鱼,特别是钓大鱼,应该找个好的地方“做窝”。前两个月,他用鸡肠子“做窝”,第三天奏效,钓了个10多斤的鲶鱼,竿都拉断了,鱼还是起来了……。

面包虫,蚯蚓.釣:水米子,一尾一斤四两,天气:38度,用时:8:50---15:00,溜鱼时间:十分钟
    阿魏豆腐、对黄辣丁有特别的效果,是流传于鱼洞和珞璜一带秘方,豆腐是自己挑选原材料,联系豆腐作坊,让其根据我们的特殊要求进行制作,这一块的成本肯定比市场上的豆腐高
    时间:2009年8月30日九点至两点
    地点:黄协三号钓场(龙洲湾码头)
    水情:涨水,江边,感觉今天的水涨得很快,沙不停的在垮,不知道“涨水鱼,退水虾”这句话在三峡截流后还有没有一定道理
    饵料:黄协密制豆腐
    工具:江竿
    鱼获:三斤五两,全皇军
    十二点刨了几口饭,5.35分,其中比较弯的一支竿轻点了三下,有戏,拉了一竿终于还是把它整倒了(注:下午5点,很多渔人提到)一点半到三点,的确难钓
    我选择的方法是:用 大球漂挂在车盘上,顺缓水放流,直到浮漂在洄弯的一处徘徊不前了,这里就是3。6米海竿的落点。 洄水弯选位技巧:
    至少有两个绝对不能放过的绝佳落点:一是与弯子交界的流水边,整条边都是落点,这里几乎什么鱼都存在,什么都有可能发生,前提是,这是个有点面积有点深度的大洄弯。
    另一个落点就是弯内能够让浮漂围绕一个中心徘徊的地方,你可以用我上面的方法测试出来,这里是食物聚集的地方,另外,一个大洄弯往往存在一个以上这样的区域,细心测试,一个都不能放过。大徘徊是主要落点。
    找鱼技巧:
    长江边在水深两米以上的大洄弯内,如果有密集的小鱼,请不要放弃,不要失去信心,这里一定隐藏着一些小鱼杀手:桂鱼,鲶鱼等。但你不可以抛下去就不理会了。确定是小鱼在闹以后,把钩组向拉动几米[注意方法,否则容易挂底]。频率是10分钟移动位置一次,一次一到两米,或许在你的某次移动中,钩组就送到躲在某个小坑里的桂鱼嘴边,或者藏在某处杂物下面的鲶鱼嘴边,这两种鱼都是 守窝待鱼的 。
    软调海竿,车盘竿抛重坠技巧:
    流水边非重坠不可,但记得要抛到目标点前方数米[看水深决定]
    坠子太重的时候,把第一节车盘甚至第二节收回,然后再抛,否则非常容易折,而且投不远,抛完再拉出,顺便挂铃

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-26 13:48 , Processed in 0.058450 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表