BMP180气压计和温度在ARM 32位5美元Maple Mini Clone(72MHz)上运行,配备诺基亚5110 GLCD。 故事 更新时间:20141231 源代码ZIP已更新,以提供有关诺基亚显示屏的其他计算信息:inHg和tC表示摄氏温度。 mmHg现在是inHg 软件升级将mmHg更改为inHg 这个项目是我的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... } 附加功能 该更新使用引脚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和串行连接的监视器上。显示输出类似于以下内容: 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分钟的历史记录。可以根据需要将图表的时间流逝轻松更改为更长或更短。 小尖峰是家庭暖通空调自行车 整个项目 用于绘图的新代码库(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; } |