test capteurs BMP085 météo

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
bouaziz
Date:
Fri Oct 14 18:44:39 2011 +0000
Commit message:
v1

Changed in this revision

BMP085.h Show annotated file Show diff for this revision Revisions of this file
BMP085_sam.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMP085.h	Fri Oct 14 18:44:39 2011 +0000
@@ -0,0 +1,56 @@
+/*
+  * mbed library to use a Bosch Sensortec BMP085 sensor
+  * Copyright (c) 2010 Hiroshi Suga
+  * Released under the MIT License: http://mbed.org/license/mit
+  */
+  
+ /** @file BMP085.h
+  * @brief mbed library to use a Bosch Sensortec BMP085 sensor
+  * barometric pressure sensor BMP085 (Bosch Sensortec)
+  * interface: I2C digital
+  */
+  
+ #ifndef BMP085_H
+ #define BMP085_H
+ 
+ #include "mbed.h"
+ 
+ /**
+  * @brief over sampling setting
+  */
+ enum BMP085_oss {
+     BMP085_oss1 = 0, ///< ultra low power (1 time)
+     BMP085_oss2 = 1, ///< standard (2 times)
+     BMP085_oss4 = 2, ///< high resolution (4 times)
+     BMP085_oss8 = 3  ///< ultra high resolution (8 times)
+ };
+ 
+ /**
+  * @brief BMP085 class
+  */
+ class BMP085 : public Base {
+ public:
+     BMP085(PinName p_sda, PinName p_scl, BMP085_oss p_oss = BMP085_oss1);
+     BMP085(I2C& p_i2c, BMP085_oss p_oss = BMP085_oss1);
+ 
+     float get_temperature();
+     float get_pressure();
+     void update();
+ 
+ protected:
+     void init(BMP085_oss);
+     unsigned short twi_readshort (int, int);
+     unsigned long twi_readlong (int, int);
+     void twi_writechar (int, int, int);
+ 
+     I2C i2c;
+     float temperature;
+     float pressure;
+ 
+ private:
+ 
+     short ac1, ac2, ac3, b1, b2, mb, mc, md, oss;
+     unsigned short ac4, ac5, ac6;
+ };
+ 
+ #endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMP085_sam.cpp	Fri Oct 14 18:44:39 2011 +0000
@@ -0,0 +1,152 @@
+/*
+   * mbed library to use a Bosch Sensortec BMP085 sensor
+   * Copyright (c) 2010 Hiroshi Suga
+   * Released under the MIT License: http://mbed.org/license/mit
+   */
+  
+  /** @file BMP085.cpp
+   * @brief mbed library to use a Bosch Sensortec BMP085 sensor
+   * barometric pressure sensor BMP085 (Bosch Sensortec)
+   * interface: I2C digital
+   */
+  
+  #include "mbed.h"
+  #include "BMP085.h"
+  
+  #define WEATHER_BMP085 0xee
+  #define xpow(x, y) ((long)1 << y)
+  
+  /**
+   * @brief Initializes interface (private I2C)
+   * @param p_sda port of I2C SDA
+   * @param p_scl port of I2C SCL
+   * @param p_oss parameter of OSS
+   */
+  BMP085::BMP085 (PinName p_sda, PinName p_scl, BMP085_oss p_oss) : i2c(p_sda, p_scl) {
+      init(p_oss);
+  }
+  
+  /**
+   * @brief Initializes interface (public I2C)
+   * @param p_i2c instance of I2C class
+   * @param p_oss parameter of OSS
+   */
+  BMP085::BMP085 (I2C& p_i2c, BMP085_oss p_oss) : i2c(p_i2c) { 
+      init(p_oss);
+  }
+  
+  /**
+   * @brief Get temperature
+   * @return temperature (`C)
+   */
+  float BMP085::get_temperature() {
+      return temperature;
+  }
+  
+  /**
+   * @brief Get pressure
+   * @return pressure (hPa)
+   */
+  float BMP085::get_pressure() {
+      return pressure;
+  }
+  
+  /**
+   * @brief Update results
+   */
+  void BMP085::update () {
+      long t, p, ut, up, x1, x2, x3, b3, b5, b6;
+      unsigned long b4, b7;
+  
+      twi_writechar(WEATHER_BMP085, 0xf4, 0x2e);
+      wait(0.01);
+      ut = twi_readshort(WEATHER_BMP085, 0xf6);
+  
+      twi_writechar(WEATHER_BMP085, 0xf4, 0x34 | (oss << 6));
+      wait(0.05);
+      up = twi_readlong(WEATHER_BMP085, 0xf6) >> (8 - oss);
+  
+      x1 = ((ut - ac6) * ac5) / xpow(2, 15);
+      x2 = ((long)mc * xpow(2, 11)) / (x1 + md);
+      b5 = x1 + x2;
+      t = (b5 + 8) / xpow(2, 4);
+      temperature = (float)t / 10.0;
+  
+      b6 = b5 - 4000;
+      x1 = (b2 * (b6 * b6 / xpow(2, 12))) / xpow(2, 11);
+      x2 = (ac2 * b6) / xpow(2, 11);
+      x3 = x1 + x2;
+      b3 = ((((unsigned long)ac1 * 4 + x3) << oss) + 2) / 4;
+      x1 = ac3 * b6 / xpow(2, 13);
+      x2 = (b1 * (b6 * b6 / xpow(2, 12))) / xpow(2, 16);
+      x3 = ((x1 + x2) + 2) / xpow(2, 2);
+      b4 = (ac4 * (unsigned long)(x3 + 32768)) / xpow(2, 15);
+      b7 = ((unsigned long)up - b3) * (50000 >> oss);
+      if (b7 < (unsigned long)0x80000000) {
+          p = (b7 * 2) / b4;
+      } else {
+          p = (b7 / b4) * 2;
+      }
+      x1 = (p / xpow(2, 8)) * (p / xpow(2, 8));
+      x1 = (x1 * 3038) / xpow(2, 16);
+      x2 = (-7357 * p) / xpow(2, 16);
+      p = p + (x1 + x2 + 3791) / xpow(2, 4);
+      pressure = (float)p / 100.0;
+  }
+  
+  void BMP085::init (BMP085_oss p_oss) {
+      ac1 = twi_readshort(WEATHER_BMP085, 0xaa);
+      ac2 = twi_readshort(WEATHER_BMP085, 0xac);
+      ac3 = twi_readshort(WEATHER_BMP085, 0xae);
+      ac4 = twi_readshort(WEATHER_BMP085, 0xb0);
+      ac5 = twi_readshort(WEATHER_BMP085, 0xb2);
+      ac6 = twi_readshort(WEATHER_BMP085, 0xb4);
+      b1 = twi_readshort(WEATHER_BMP085, 0xb6);
+      b2 = twi_readshort(WEATHER_BMP085, 0xb8);
+      mb = twi_readshort(WEATHER_BMP085, 0xba);
+      mc = twi_readshort(WEATHER_BMP085, 0xbc);
+      md = twi_readshort(WEATHER_BMP085, 0xbe);
+      oss = p_oss;
+  }
+  
+  unsigned short BMP085::twi_readshort (int id, int addr) {
+      unsigned short i;
+  
+      i2c.start();
+      i2c.write(id);
+      i2c.write(addr);
+  
+      i2c.start();
+      i2c.write(id | 1);
+      i = i2c.read(1) << 8;
+      i |= i2c.read(0);
+      i2c.stop();
+  
+      return i;
+  }
+  
+  unsigned long BMP085::twi_readlong (int id, int addr) {
+      unsigned long i;
+  
+      i2c.start();
+      i2c.write(id);
+      i2c.write(addr);
+  
+      i2c.start();
+      i2c.write(id | 1);
+      i = i2c.read(1) << 16;
+      i |= i2c.read(1) << 8;
+      i |= i2c.read(0);
+      i2c.stop();
+  
+      return i;
+  }
+  
+  void BMP085::twi_writechar (int id, int addr, int dat) {
+  
+      i2c.start();
+      i2c.write(id);
+      i2c.write(addr);
+      i2c.write(dat);
+      i2c.stop();
+  }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Oct 14 18:44:39 2011 +0000
@@ -0,0 +1,58 @@
+#include "mbed.h"
+#include "BMP085.h"
+#include "string.h"
+
+BMP085 bmp085(p9, p10);
+
+DigitalOut myled(LED1);
+DigitalOut myled4(LED4);
+Serial pc(USBTX, USBRX);
+
+LocalFileSystem local("local");
+
+int main() {
+    float p, t;
+    int ii=0;
+    char pname[12],stval[6];
+    DIR *d = opendir("/local");               // Opens the root directory of the local file system
+    struct dirent *pdir;
+    int indice=1;
+    while((pdir = readdir(d)) != NULL) {         // Print the names of the files in the local file system
+       pc.printf("%u  %s\r",indice, pdir->d_name);
+      if(strstr(pdir->d_name,"OUT")== pdir->d_name) {
+           indice++;
+      }
+    }
+    closedir(d);
+    strcpy(pname,"/local/out");
+    sprintf(stval,"%02u",indice);
+    strcat(pname,stval);
+    strcat(pname,".txt");
+    
+    FILE *fp = fopen(pname, "w");  // Open "out.txt" on the local file system for writing
+    myled4=0;
+    while(1) {
+        myled = 1;
+
+        bmp085.update();
+        p = bmp085.get_pressure();
+        t = bmp085.get_temperature();
+//        if(t>24.0){
+//            myled4=1;    
+//        }else{
+//            myled4=0;
+//        }
+        pc.printf("p:%6.2f hPa / t:%6.2f C\r", p, t);
+        
+        if(ii<60){
+           ii=ii+1;
+           fprintf(fp,"p:%6.2f hPa / t:%6.2f C\r", p, t);
+        }else{
+            fclose(fp);
+            myled4=1;    
+        }    
+
+        myled = 0;
+        wait(0.5);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Oct 14 18:44:39 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912