你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在Arduino 1.6.0下的ARM 32位BMP180气压表

[复制链接]
木木&点点 发布时间:2019-1-6 17:52
BMP180气压计和温度在ARM 32位5美元Maple Mini Clone(72MHz)上运行,配备诺基亚5110 GLCD。
1.jpg
故事
更新时间:20141231
源代码ZIP已更新,以提供有关诺基亚显示屏的其他计算信息:inHg和tC表示摄氏温度。
2.1.jpg
mmHg现在是inHg
2.2.jpg
软件升级将mmHg更改为inHg

  D* H9 {# l* u; X
         这个项目是我的Leaflabs Maple Mini 的中国BAITE克隆系列的延续- 一个32位ARM M3板,128K闪存和20K SRAM:目前售价为5美元或以下,交付。
请参考:Maple mini 更新  和Maple Mini的原始文章。
现在可以使用WiKi,旨在将Arduino论坛上的60多个页面压缩成更容易阅读的内容。请参考这里。这个WiKi将指导您安装Arduino的Maple核心文件,配置以及您希望复制此项目时可能遇到的许多问题。
这个项目使用BMP085或更新的BMP180(经过测试。)提供了完整的源代码:您将需要最新的(在撰写本文时)Arduino 1.6.0 rc1,可以在这里获得:link
请注意:产品链接仅供参考,并不代表尝试推荐这些供应商。
源代码
所需文件的ZIP - 将所有文件放在标题为GLCD5110_BMP085的单个目录中
/*
  This implementation specific to Maple Miniand used with a NOKIA 5110 Craphic LCD
  Placed in the Public Domain by author: m. rayburnette: http://hackster.io/RayBurne
  Wikipedia: highest 1085.7hPa   lowest non-tornadic 870hPa   Delta == 215.7 hPa
  Compiled using Arduino 1.6.0rc1
    Sketch uses 19,212 bytes (17%) of programstorage space. Maximum is 108,000 bytes.
    Global variables use 2,800 bytes of dynamicmemory.
*/
#include<Streaming.h>  //http://arduiniana.org/libraries/streaming/ Documents\Arduino\libraries\Streaming (legacy)
#include<Wire.h>       // I2C\Documents\Arduino\hardware\STM32\STM32F1XX\libraries\Wire (legacy)
#include"BMP085.h"     // #include"I2Cdev.h" is pulled in also
#define LED_PINBOARD_LED_PIN  // defined for LeafLabsMaple & Maple Mini ... Real Arduinos it's PIN 13
#define DIAGSfalse            // set to"true" to echo diagnostic to SerialUSB - renamed to Serial
/* Nokia GLCDSOFTWARE SPI (using Maple Mini hardware SPI 2 Pins)
//------MapleMini-----//-------Notes------------//---Nokia---*/
#definePIN_SCE   31  // CE (Active High)       //   pin 2
#define PIN_RESET30  // Reset (Active Lo)      //   pin 1
#definePIN_DC    29  // Data==1 Command==0     //   pin 3
#definePIN_SDIN  28  // MOSI/DIN              //    pin 4
#define PIN_SCLK  27  //CLK/clock              //    pin 5
#defineLCD_C     LOW
#defineLCD_D     HIGH
#defineLCD_X     84
#defineLCD_Y     48
// global GLCDvariables
byte nRow;                          // line count      (0-5 for NOKIA LCD = 6 lines)
bytenColumn;                       //character count (0-11 for NOKIA LCD= 12 chars)
byteNOKIAcontrast         = 0xBC;  // LCD initialization contrast values B0 thruBF
byte error,address        = 77;    // I2C scanner
const byteContrastPin     =  8;   // D8 low activates the Contrast adjustment
const int  BAUD = 9600;             // any standard serial value: 300- 115200 (not used for SerialUSB)
int hPa10,Fah10;                   // used forNokia LCD integer to character - faux decimal place
int localCorrect= 3380;            //  +/- hPa*100 to correct for local altitude:100X delta:  3380== Briscoe Field, Ga
floattemperature;
floatpressure;                     // How manyhPa in 1 mm Hg? The answer is 1.3332239
float inHg;                        
floatmmhg_conversion      =3386.388140071641;  // convert hPa toinches Hg
float altitude;
int32_tlastMicros;
bool blinkState =false;
// Various staticScreen messages
char* BlankLine[]PROGMEM  = {"            "};  // Nokia 12 x 6 (84 * 48)
// Screenline....             012345678901 == 12characters out of 72 char screen == 6 lines
char* msg0[]PROGMEM       = {"DEMO BMP180(C)2014 by  M. Burnette PUBLIC      DOMAIN      Ver 20141231"}; // 72 characters ==full screen
char* msg1[]PROGMEM       = {"            Open Serial Connection  @9600 BAUD and then    Press AnyKey"};
char* msg2[]PROGMEM       = {"BarometerOK"} ;
char* msg3[]PROGMEM       = {"Barometer   Failure                 Correct and try again.              "} ;
// createbarometer object
BMP085 barometer;
void setup(void)
{
  pinMode(BOARD_LED_PIN, OUTPUT);
  pinMode(BOARD_BUTTON_PIN, INPUT);
  pinMode(ContrastPin, INPUT);
  digitalWrite(ContrastPin, HIGH); // activateinternal pullup resistor
  if( DIAGS )
  {
    Serial.begin(BAUD);    // Maple SerialUSB .begin() is void...reminder for Serial1, 2, 3
    Serial << (F("(c) 2013 - 2014 byM. R. Burnette")) << endl;
    Serial << (F("Version0.20140126")) << endl;
  }
  // I2C Stuff
  Wire.begin(); barometer.initialize();
  // Nokia SPI stuff
  LcdInitialise(); LcdClear();
  LcdString(*msg0);
  delay(2000);
  LcdClear();
  LcdString(*msg1);
  // wait with display until user sends akeystroke
  if (DIAGS) do {} while (Serial.available() ==0) ;
  Wire.beginTransmission(address);
  error = Wire.endTransmission();
  if (DIAGS)Serial.println(barometer.testConnection() ? "BMP085 connectionsuccessful" : "BMP085 connection failed");
  if (DIAGS) { Serial.print("LocalPressure Correction Constant: ") ; if (DIAGS)Serial.println(localCorrect); }
  LcdClear();
  if(barometer.testConnection())
  {
    LcdString(*msg2);
  } else {
    LcdString(*msg3);
    for( ;; ) {;}  // Create an infinite loop (lock-up)
  }
}
void loop(void)
{
  // blink LED to indicate activity
  blinkState = !blinkState;
  digitalWrite(LED_PIN, blinkState);
  // request temperature
barometer.setControl(BMP085_MODE_TEMPERATURE);
  // wait appropriate time for conversion(4.5ms delay)
  lastMicros = micros();
  while (micros() - lastMicros <barometer.getMeasureDelayMicroseconds());
  // read calibrated temperature value indegrees Celsius
  temperature = barometer.getTemperatureC();
  // request pressure (3x oversampling mode,high detail, 23.5ms delay)
  barometer.setControl(BMP085_MODE_PRESSURE_3);
  while (micros() - lastMicros <barometer.getMeasureDelayMicroseconds());
  // read calibrated pressure value in Pascals(Pa)
  pressure = barometer.getPressure();
  pressure += localCorrect;
  // calculate absolute altitude in metersbased on known pressure
  // (may pass a second "sea levelpressure" parameter here,
  // otherwise uses the standard value of101325 Pa)
  // altitude =barometer.getAltitude(pressure);
  // display measured values if appropriate
  if (DIAGS)
  {
    Serial.print("Temp/Pres:\t");
    Serial << _FLOAT((temperature * 9.0 /5.0) + 32.0 , 1) << "F  \t";
    Serial << _FLOAT((pressure / 100.0) ,2) << " hPa\t";
    Serial << _FLOAT((pressure /mmhg_conversion) , 2) << " inHg" << endl;
    // Serial << (int (altitude *6.28084)) << " Ft \r\n" ;
  }
  // blink LED to indicate activity
  blinkState = !blinkState;
  digitalWrite(LED_PIN, blinkState);
  // update GLCD
  nRow = 5; nColumn = 0;  // last line of Nokia 5110
  gotoXY(nColumn, nRow);
  LcdString(*BlankLine);
  gotoXY(nColumn, nRow);
  LcdString("inHg= ");
  if (isButtonPressed())  // Expand the inHg display by 2 additionalspaces
  {
    inHg = float ( pressure * 10.0 /mmhg_conversion) * 100.0 ;
  } else {
    inHg = float ( pressure * 10.0 /mmhg_conversion) ;
  }
  nDisplay(inHg);
  nRow = nRow - 1;
  gotoXY(nColumn, nRow);
  LcdString(*BlankLine);
  gotoXY(nColumn, nRow);
  LcdString(" hPa= ");  
  hPa10 = pressure / 10;
  nDisplay(hPa10);
  nRow = nRow - 1;
  gotoXY(nColumn, nRow);
  LcdString(*BlankLine);
  gotoXY(nColumn, nRow);
  LcdString("  tC= ");
  nDisplay(10 * temperature);
  nRow = nRow - 1;
  gotoXY(nColumn, nRow);
  LcdString(*BlankLine);
  gotoXY(nColumn, nRow);
  LcdString("  tF= ");
  Fah10 = 10 * ((temperature * 9.0 / 5.0) +32.0);
  nDisplay(Fah10);
  delay(1000);    // wait 1 second before repeating...
}
3.jpg
附加功能
该更新使用引脚32上的Maple Mini“按钮”提供了便利功能。当LCD显示包括inHg在内的4个参数时:按住按钮直到inHg值被消隐 - 释放按钮将扩展inHg显示值将它乘以100.此功能允许看到隐藏的小数位。例如,如果显示器指示30.3,则按下并释放按钮将显示303x.xx  ,其中x.xx表示显示器的  隐藏的非圆形部分。
使用此功能,可以编辑第38行 int localCorrect =3380 ; 因此,设备可以校准到当地高程 - 只需使用互联网查找最近的机场,使用第38行进行一些试验和错误将使压力读数与气象服务监测一致。
此外,代码中的第15行可以从#define DIAGS false编辑   为  #define DIAGS true,  以便同时显示在LCD和串行连接的监视器上。显示输出类似于以下内容:

8 g) R' s7 l: k7 I3 O
BMP085 connection successful
Local PressureCorrection Constant: 3380
Temp/Pres:      70.3F           1027.63 hPa     30.35 inHg
Temp/Pres:      70.3F           1027.65 hPa     30.35 inHg
Temp/Pres:      70.3F           1027.60 hPa     30.35 inHg
Temp/Pres:      70.3F           1027.64 hPa     30.35 inHg
Temp/Pres:      70.3F           1027.63 hPa     30.35 inHg
Temp/Pres:      70.3F           1027.59 hPa     30.34 inHg
Temp/Pres:      70.3F           1027.67 hPa     30.35 inHg
Temp/Pres:      70.3F           1027.68 hPa     30.35 inHg
Temp/Pres:      70.3F           1027.63 hPa     30.35 inHg
连接:
诺基亚5110 GLCD应按照以上源代码中的说明进行连接:
-------- MapleMini ---- / Notes --------------------- / - Nokia- * /
#define PIN_SCE 31 // CE(高电平有效)引脚2
#define PIN_RESET 30 //复位(有效Lo)引脚1
#define PIN_DC 29 //数据== 1命令== 0引脚3
#define PIN_SDIN 28 // MOSI / DIN引脚4
#define PIN_SCLK 27 // CLK /时钟引脚5
BMP180应按如下方式连接:
SCL ---> Maple Mini引脚16
SDA ---> Maple Mini引脚15
电压
Maple Mini为3.3V,因此5110和BMP180上的所有Vcc连接应为3.3伏。接地GND很常见。我用一个10欧姆的电阻为诺基亚屏幕上的LED供电......我的显示屏引脚LED指示灯通过电阻器。SDA和SCL在我的原型上使用10K电阻“上拉”至3.3伏(取决于您购买的分支模块,可能已经在电路板上安装了上拉电阻。)
除了源代码选项卡许可证中列出的那些,还有其他人一直是将旧的Leaflabs核心代码的端口转换到新的Arduino环境的关键参与者。请参阅附加贡献者列表。
请享用,
射线
更新20150110
我一直在使用诺基亚显示器的前两行作为气压图,我将附加我的“beta”代码,因为我认为这是一个非常酷的主意。请注意,此实现中可能存在明显错误。
下面是它的工作原理:
第0行和第1行宽84像素,每行高8像素。在诺基亚显示器上,通过使用uC内部的局部位图形成字符,该位图将每个垂直像素组(0-7)映射到字节。从线的最左侧开始,通常6个水平像素和8个垂直像素形成字符矩阵。
在我的图形抽象中,新信息在最右侧进入水平位置[0],顶行[0]和第二行[1]通过简单算法组合以提供16,[0]到[15]两条线的位置。然后通过线[1]上的线的高度加上线[0]上的线的延续来表示压力; 也就是说,首先打印第1行,如果值需要则打印第0行。
每60秒,一个新的数据元素被添加到图表的最右边部分,所有像素都被推到左边,最旧的历史读数丢失了。以这种方式,图表代表过去84分钟的历史记录。可以根据需要将图表的时间流逝轻松更改为更长或更短。
4.1.jpg
小尖峰是家庭暖通空调自行车
4.2.jpg
整个项目
用于绘图的新代码库(beta)。另请注意,按下针脚32上的按钮现在将水银读数的英寸乘以100,显示屏将显示“inHgX =”而不是正常的“inHg =”...您必须按住按钮一整秒钟从模式循环到模式。
所有安装说明都是相同的......也就是说,您必须将所有文件解压缩到一个名为GLCD510_BMP085的文件夹中,并且必须使用Arduino 1.6.0或更高版本进行编译。请参阅为微控制器所需的Maple核心库文件提供的早期链接。
代码
#define BUTTON_DEBOUNCE_DELAY 1
uint8 isButtonPressed(uint8 pin =BOARD_BUTTON_PIN,
                       uint32 pressedLevel =BOARD_BUTTON_PRESSED_LEVEL){
    if(digitalRead(pin)== pressedLevel){
        delay(BUTTON_DEBOUNCE_DELAY);
       while(digitalRead(pin)== pressedLevel)
            ;
       返回true;
    }
    return false;
}

, B) n! R" ]5 Q! X* C
收藏 评论0 发布时间:2019-1-6 17:52

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版