Вывод данных с барометра BMP085

memfise
Offline
Зарегистрирован: 30.06.2012

 Подключил вышеуказанный барометр по I2C. Скачал библиотеку отсюда http://www.arduino.cc/en/Reference/Libraries, запускаю пример. Монитор показывает следующее 

Altitude (cm):24919
Pressure(Pa):101574
Temperature(C):254

Второй столбец вроде как необходимо разделить на 133.3 для перевода в мм р. ст, остальные данные выводятся в RAW формате (как я понимаю), как из этого формата перевести в нормальный читабельный вид? Есть у кого был опыт как это сделать или может пример по-удачнее подскажете? Спасибо.

memfise
Offline
Зарегистрирован: 30.06.2012

использую дуемиланову, версия Arduino 1.0.1.

maksim
Offline
Зарегистрирован: 12.02.2012

 Так какую конкретно библиотеку вы используете? Название у нее есть или ссылка?

memfise
Offline
Зарегистрирован: 30.06.2012

 http://code.google.com/p/bmp085driver/downloads/detail?name=bmp085v0.4.zip&can=2&q=label:Featured вот здесь она есть, называется вроде bmp085v0.4

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

Я заказал аналогичный барометр с Ebay. Там на страничке с товаром есть пример, может он поможет.

Сам его ен пробовал (датчик находится в пути), но думаю, он поможет.

#include <Wire.h>

#define BMP085_ADDRESS 0x77  // I2C address of BMP085

const unsigned char OSS = 0;  // Oversampling Setting

// Calibration values
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 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...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.print(temperature, DEC);
  Serial.println(" *0.1 deg C");
  Serial.print("Pressure: ");
  Serial.print(pressure, DEC);
  Serial.println(" Pa");
  Serial.println();
  delay(1000);
}

// Stores all of the bmp085's calibration values into global variables
// Calibration values are required to calculate temp and pressure
// This function should be called at the beginning of the program
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);
}

// Calculate temperature given ut.
// Value returned will be in units of 0.1 deg C
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);  
}

// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up)
{
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;
 
  b6 = b5 - 4000;
  // Calculate B3
  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
 
  // Calculate 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;
}

// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
  unsigned char data;
 
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.send(address);
  Wire.endTransmission();
 
  Wire.requestFrom(BMP085_ADDRESS, 1);
  while(!Wire.available())
    ;
    
  return Wire.receive();
}

// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
  unsigned char msb, lsb;
 
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.send(address);
  Wire.endTransmission();
 
  Wire.requestFrom(BMP085_ADDRESS, 2);
  while(Wire.available()<2)
    ;
  msb = Wire.receive();
  lsb = Wire.receive();
 
  return (int) msb<<8 | lsb;
}

// Read the uncompensated temperature value
unsigned int bmp085ReadUT()
{
  unsigned int ut;
 
  // Write 0x2E into Register 0xF4
  // This requests a temperature reading
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.send(0xF4);
  Wire.send(0x2E);
  Wire.endTransmission();
 
  // Wait at least 4.5ms
  delay(5);
 
  // Read two bytes from registers 0xF6 and 0xF7
  ut = bmp085ReadInt(0xF6);
  return ut;
}

// Read the uncompensated pressure value
unsigned long bmp085ReadUP()
{
  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;
 
  // Write 0x34+(OSS<<6) into register 0xF4
  // Request a pressure reading w/ oversampling setting
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.send(0xF4);
  Wire.send(0x34 + (OSS<<6));
  Wire.endTransmission();
 
  // Wait for conversion, delay time dependent on OSS
  delay(2 + (3<<OSS));
 
  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.send(0xF6);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 3);
 
  // Wait for data to become available
  while(Wire.available() < 3)
    ;
  msb = Wire.receive();
  lsb = Wire.receive();
  xlsb = Wire.receive();
 
  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
 
  return up;
}

 

memfise
Offline
Зарегистрирован: 30.06.2012

 спасибо за пример, результат его работы выглядит так 

Temperature: 248 *0.1 deg C
Pressure: 99071 Pa

 

давление еще можно преобразовать, а температура если перемножить можит и верно, высооты над уровнем моря нет

 

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

memfise пишет:

 Подключил вышеуказанный барометр по I2C. Скачал библиотеку отсюда http://www.arduino.cc/en/Reference/Libraries, запускаю пример. Монитор показывает следующее 

Altitude (cm):24919
Pressure(Pa):101574
Temperature(C):254

Смею предположить, что и те данные, которые вы написали - верные

Давление в паскалях верное, температура (нужно умножить на 0,1), насчет высоты, либо 249,19 м, либо 24.919м над уровнем моря (посмотрите на навигаторе любом для уточнения).

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

memfise, вы вопрос с высотой решили?

У меня тоже высота не показывается, точнее показывается но показания пляшут очень сильно. Как я понял, высота дается в см и пляшут показания - это изменения высоты, относительно текущей. Если смотреть вашу библиотеку, то там есть два примера, где первоночальную высоту можно задать, для корректировки давления:

dps.init(MODE_ULTRA_HIGHRES, 25000, true);  // 250 meters, true = using meter units
                  // this initialization is useful if current altitude is known,
                  // pressure will be calculated based on TruePressure and known altitude.

 

Есть идея, взять ардулину с экраном и сначала посмотреть замеры на 1 этаже, а потом поднятся на 9 этаж. В теории высота должна изменится на 25-27 метров.

UP1:

провел эксперемент по выводу данных температуры и давления с использованием вашей библиотеки и без нее. Результаты:

Программа с экраном, без датчика ВМР085.

размер скетча 9170, размер свободной памяти 1712

 

Программа с экраном, с датчиком ВМР085, без библиотеки .

размер скетча 14162, размер свободной памяти 1431

 

Программа с экраном, с датчиком ВМР085 с библиотекой .

размер скетча 16738, размер свободной памяти 1214.

 

В данном случае библиотеку использовать удобнее, так как скетч получается короткий, но тем самым свободная память для программы уменьшается почти на 2,5 кб и память под переменные уменьшается на 217 байт. вполне возможно если сюда еще приписать алгоритмы вычисления высоты, то память сравняется.

 

memfise
Offline
Зарегистрирован: 30.06.2012

с показаниями высоты пока оставил так как есть, времени дуину взять в руки пока нет.

pryschik
Offline
Зарегистрирован: 14.01.2013

А удалось стабилизировать показатели ?

тоже столкнулся что высота над уровнем моря +- 1 метр

скачет, вроде не должно быть такого. 

ivanserov
Offline
Зарегистрирован: 05.09.2011

Немного изменил скетч: добавил вывод температуры в формате 00.0 , высоты в метрах, давление в мм рт.ст

// BMP085_test1
// by Filipe Vieira
// Simple test of BMP085 output using default settings.
// This example requires AUTO_UPDATE_TEMPERATURE to be true in bmp085.h otherwise temperature will not update.
// IMPORTANT!! To get correct values you MUST CHANGE init() parameters, in 
// this example I've set 250m based on GPS data for my location.

#include <Wire.h>
#include <BMP085.h>

BMP085 dps = BMP085();      // Digital Pressure Sensor 

long Temperature = 0, Pressure = 0, Altitude = 0;

void setup(void) {
  Serial.begin(9600);
  Wire.begin();
  delay(1000);
  
  // uncomment for different initialization settings
  //dps.init();     // QFE (Field Elevation above ground level) is set to 0 meters.
                  // same as init(MODE_STANDARD, 0, true);
  
  //dps.init(MODE_STANDARD, 101850, false);  // 101850Pa = 1018.50hPa, false = using Pa units
                  // this initialization is useful for normalizing pressure to specific datum.
                  // OR setting current local hPa information from a weather station/local airport (QNH).
  
  dps.init(MODE_ULTRA_HIGHRES, 25000, true);  // 250 meters, true = using meter units
                  // this initialization is useful if current altitude is known,
                  // pressure will be calculated based on TruePressure and known altitude.

  // note: use zeroCal only after initialization.
  // dps.zeroCal(101800, 0);    // set zero point
}            

void loop(void) { 
  dps.getPressure(&Pressure);
  dps.getAltitude(&Altitude);
  dps.getTemperature(&Temperature);
  
  Serial.print("  Alt(m):");
  Serial.print(Altitude/100);
  Serial.print("  Pressure(mm Hg):");
  Serial.print(Pressure/133.3);
  Serial.print(" Temp:");
  Serial.println(Temperature*0.1);
  delay(2000);
}

Показания выводятся так:

 Alt(m):250  Pressure(mm Hg):778.11 Temp:25.30

Arduino 1.01

Evgeny
Offline
Зарегистрирован: 04.02.2013

Здравствуйте!

Тоже пытаюсь подключить свой BMP085 к Ардуино (у меня Мега 2560).

VSS -> 3.3 V

SDA -> analog pin 4

SCL -> analog pin 5

GND -> GND

Библиотеку взял по выше приведенной ссылке:

http://code.google.com/p/bmp085driver/downloads/detail?name=bmp085v0.4.z...

 

Скетч залил такой же, как привел ivanserov

Результат следующий:

 Alt(m):246  Pressure(mm Hg):1.82 Temp:0.00
 

Отчего может не показываться температура и такое маленькое давление?

 

Samodelkin
Offline
Зарегистрирован: 07.06.2012

Если вы используете мегу 2560 то скорей всего SDA и SCL нужно подключать на 20 (SDA) и 21 (SCL) пины, а не на аналоговые как пишете вы.

 

Evgeny
Offline
Зарегистрирован: 04.02.2013

Спасибо большое за совет!

Все заработало!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Добрый день !

У миня сразу заработало.... Переключая тумблер мона измерить превышение/принижение холма/здания.... Задумка - измерение QHF и высоты, соответственно, на мотодельтаплане.... Код - далее

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
//===========================================================================================================================================
#include "Barometer.h"
#include <Wire.h>
#define LCDCtrl 13
#define BtnRezim 12
boolean StatusRezim;
float T;
float PPa;
float PMmRtSt;
float Alt;
float AltOld;
unsigned long TimeTek;
long TimePredIzm = 0; 
int IntervalIzm = 1000; 
long TimePredLCD = 0; 
int IntervalLCD;
int IntervalLCD_1 = 500;
int IntervalLCD_0 = 75;
boolean StatusLCD;
Barometer BarMeter;
//===========================================================================================================================================
void setup()
  {
    pinMode( LCDCtrl , OUTPUT ); 
    StatusLCD = false;
    digitalWrite( LCDCtrl , StatusLCD );     
    pinMode( BtnRezim , INPUT );     
    digitalWrite( BtnRezim , HIGH );      
    Serial.begin( 9600 );
    BarMeter.init();  
  }
//===========================================================================================================================================
void loop()
{
  StatusRezim = digitalRead( BtnRezim );
  TimeTek = millis();
  if ( TimeTek - TimePredIzm > IntervalIzm )
    {
      TimePredIzm = TimeTek;
      T = BarMeter.bmp085GetTemperature(BarMeter.bmp085ReadUT());
      PPa = BarMeter.bmp085GetPressure(BarMeter.bmp085ReadUP());
      Alt = BarMeter.calcAltitude( PPa );
      PMmRtSt = PPa * 0.0075006375541921;    
      Serial.print( "Temperature: " ); Serial.print( T , 2 ); Serial.println( " \xB0""C" );
      Serial.print( "   Pressure: " ); Serial.print( PPa , 0 ); Serial.println( " Pa" );
      Serial.print( "   Pressure: " ); Serial.print( PMmRtSt , 2 ); Serial.println( " mm Hg." );  
      Serial.print( "   Altitude: " ); Serial.print( Alt , 3 ); Serial.println( " m" ); 
        if ( StatusRezim ) { AltOld = Alt ; IntervalLCD = IntervalLCD_1; Serial.print( "     Height: " ); Serial.println( "XXXXXX" ); }
        else { IntervalLCD = IntervalLCD_0; Serial.print( "     Height: " ); Serial.print( Alt - AltOld , 3 ); Serial.println( " m" ); }     
      Serial.println(  );       
    } 
  if ( TimeTek - TimePredLCD > IntervalLCD ) { TimePredLCD = TimeTek; digitalWrite( LCDCtrl , !StatusLCD ); StatusLCD = !StatusLCD; }      
}
//===========================================================================================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Сегодня проверил все 4 порога 2-ух ВПП пулковских ( пройдено ножками 9 км ) - аэронавигационные данные аэр. Пулково и данные с этого датчика    -    +/- 80 см  !!!!!!!!!!!!!!!!!!

Вот только усреднение надо прописать, а то скачЮт данные......

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

133,3 в делах авиации - не точно....

правильно - 133,3223684 :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

LCD мигает 500 х 500 мсек - в абсолютном режиме, 100 х 100 мсек - в относительном режиме ( измерение превышения ).

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Кроме того - измерил высоту пулковской вышки-"гранаты"... Лазерный дальномер и этот датчик - 10 замеров - датчик показал, что  на 60 см выше, чем - лазер...

Хороший барометр :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Кто-нить занимался вычислением вертикалной скорости с помощью этого датчика ?

Sinister
Offline
Зарегистрирован: 14.06.2012

Залил скетч из 10 поста. За 2 часа показания высоты поднялись на 14 метров, хотя датчик лежит всё время на столе. С чем это может быть связано?

step962
Offline
Зарегистрирован: 23.05.2011

Sinister пишет:

Залил скетч из 10 поста. За 2 часа показания высоты поднялись на 14 метров, хотя датчик лежит всё время на столе. С чем это может быть связано?

Ну, вообще-то датчик является барометрическим. Стало быть, если давление падает, то "высота" растет.

Видимо, связано с приближающимся дождем...

TevatroN
Offline
Зарегистрирован: 17.11.2013

Приветствую форумчан, просьба помочь разобраться.

Имею: Uno, SD+RTC (в одном шилде), BMP180 (аналог 085) при записи данных времени  в минутах и секундах как добавить 0?

что бы было 01, 02, ... вместо 1, 2, ...

  Alt. 12.63(m):   Pressure. 766.68(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:31:58
  Alt. 12.05(m):   Pressure. 766.69(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:3
  Alt. 12.14(m):   Pressure. 766.75(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:8
  Alt. 12.38(m):   Pressure. 766.77(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:14
  Alt. 12.38(m):   Pressure. 766.71(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:19
  Alt. 11.56(m):   Pressure. 766.71(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:25
  Alt. 11.89(m):   Pressure. 766.71(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:30
  Alt. 11.56(m):   Pressure. 766.76(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:36
  Alt. 12.22(m):   Pressure. 766.74(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:41
  Alt. 11.39(m):   Pressure. 766.77(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:46
  Alt. 12.47(m):   Pressure. 766.67(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:52
  Alt. 12.14(m):   Pressure. 766.72(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:32:57
  Alt. 11.72(m):   Pressure. 766.72(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:33:3
  Alt. 12.05(m):   Pressure. 766.77(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:33:8
  Alt. 11.81(m):   Pressure. 766.80(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:33:13
  Alt. 11.64(m):   Pressure. 766.69(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:33:19
  Alt. 11.56(m):   Pressure. 766.71(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:33:24
  Alt. 12.22(m):   Pressure. 766.69(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:33:30
  Alt. 11.89(m):   Pressure. 766.74(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:33:35
  Alt. 12.80(m):   Pressure. 766.70(mm Hg):   Temp. 21.90(C):         Date: 17/11/2013        Time: 22:33:41
 

 

прошу сильно не ругать всего третий день занимаюсь ардуинкой, код собран из различных примеров.

Помогите оптимизировать код, коменты не удалены некоторые не в своих местах:

Может кому пригодится

// Ported to SdFat from the native Arduino SD library example by Bill Greiman
// On the Ethernet Shield, CS is pin 4. SdFat handles setting SS
const int chipSelect = 10;
/*
 SD card read/write
 
 This example shows how to read and write data to and from an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created   Nov 2010
 by David A. Mellis
 updated 2 Dec 2010
 by Tom Igoe
 modified by Bill Greiman 11 Apr 2011
 This example code is in the public domain.
 	 
 */

#include 
#include 
// BMP085_test1
// by Filipe Vieira
// Simple test of BMP085 output using default settings.
// This example requires AUTO_UPDATE_TEMPERATURE to be true in bmp085.h otherwise temperature will not update.
// IMPORTANT!! To get correct values you MUST CHANGE init() parameters, in 
// this example I've set 250m based on GPS data for my location.
#include  // written by  mattt on the Arduino forum and modified by D. Sjunnesson
#include 
SdFat sd;
SdFile myFile;


BMP085 dps = BMP085();      // Digital Pressure Sensor 

long Temperature = 0, Pressure = 0, Altitude = 0;

void setup(void) {
  Serial.begin(9600);
  while (!Serial) {
  }  // wait for Leonardo
  Wire.begin();
  delay(1000);

}

void loop(void) {

  // uncomment for different initialization settings
  //dps.init();     // QFE (Field Elevation above ground level) is set to 0 meters.
  // same as init(MODE_STANDARD, 0, true);

  //dps.init(MODE_STANDARD, 101850, false);  // 101850Pa = 1018.50hPa, false = using Pa units
  // this initialization is useful for normalizing pressure to specific datum.
  // OR setting current local hPa information from a weather station/local airport (QNH).

  dps.init(MODE_ULTRA_HIGHRES, 1200, true);  // 250 meters, true = using meter units
  // this initialization is useful if current altitude is known,
  // pressure will be calculated based on TruePressure and known altitude.

  // note: use zeroCal only after initialization.
  // dps.zeroCal(101800, 0);    // set zero point

  // Initialize SdFat or print a detailed error message and halt
  // Use half speed like the native library.
  // change to SPI_FULL_SPEED for more performance.
  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

  // open the file for write at end like the Native SD library
  if (!myFile.open("data_log.txt", O_RDWR | O_CREAT | O_AT_END)) {
    sd.errorHalt("opening data_log.txt for write failed");
  }
  // if the file opened okay, write to it:
  Serial.println("Writing to data_log.txt...");

  dps.getPressure(&Pressure);
  dps.getAltitude(&Altitude);
  dps.getTemperature(&Temperature);

  myFile.print("  Alt. ");
  myFile.print(Altitude*0.01);
  myFile.print("(m): ");
  myFile.print("  Pressure. ");
  myFile.print(Pressure/133.3);
  myFile.print("(mm Hg): ");
  myFile.print("  Temp. ");
  myFile.print(Temperature*0.1);
  myFile.print("(C): ");
  myFile.print("      ");                  //some space for a more happy life
  myFile.print("  Date: ");
  myFile.print(RTC.get(DS1307_DATE,1));    //read date
  myFile.print("/");
  myFile.print(RTC.get(DS1307_MTH,0));     //read month
  myFile.print("/");
  myFile.print(RTC.get(DS1307_YR,0));      //read year
  myFile.print("      ");                  // some space for a more happy life
  myFile.print("  Time: ");
  myFile.print(RTC.get(DS1307_HR,0));      //read the hour and also update all the values by pushing in true
  myFile.print(":");
  myFile.print(RTC.get(DS1307_MIN,0));     //read minutes without update (false)
  myFile.print(":");
  myFile.print(RTC.get(DS1307_SEC,0));     //read seconds
  myFile.println();

  Serial.print("  Alt. ");
  Serial.print(Altitude*0.01);
  Serial.print("(m): ");
  Serial.print("  Pressure. ");
  Serial.print(Pressure/133.3);
  Serial.print("(mm Hg): ");
  Serial.print("  Temp. ");
  Serial.print(Temperature*0.1);
  Serial.print("(C): ");
  Serial.print("      ");                // some space for a more happy life
  Serial.print("  Date: ");
  Serial.print(RTC.get(DS1307_DATE,1));  //read date
  Serial.print("/");
  Serial.print(RTC.get(DS1307_MTH,0));   //read month
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,0));    //read year
  Serial.print("      ");                //some space for a more happy life
  Serial.print("  Time: ");
  Serial.print(RTC.get(DS1307_HR,0));    //read the hour and also update all the values by pushing in true
  Serial.print(":");
  Serial.print(RTC.get(DS1307_MIN,0));   //read minutes without update (false)
  Serial.print(":");
  Serial.print(RTC.get(DS1307_SEC,0));   //read seconds
  Serial.println();

  myFile.close();                        //close the file:
  Serial.println("done.");

  delay(5000);
}
ingener.solovyev
Offline
Зарегистрирован: 12.02.2013
if (HOUR<10) {
 Serial.print ("0");
 Serisl.print (HOUR);
} else {
Serial.print (HOUR);
}

с минутами секундами и датами аналогично.

TevatroN
Offline
Зарегистрирован: 17.11.2013

ingener.solovyev Спасибо больщое получилось.

теперь в файле на SD карточке вместо:

  Alt. 12.36(m)   Pressure. 768.33(mm Hg)   Temp. 21.80(C)     Date: 18/11/2013    Time: 12:8:1
  Alt. 12.36(m)   Pressure. 768.30(mm Hg)   Temp. 21.80(C)     Date: 18/11/2013    Time: 12:8:6
  Alt. 10.79(m)   Pressure. 768.30(mm Hg)   Temp. 21.80(C)     Date: 18/11/2013    Time: 12:8:11
  Alt. 11.04(m)   Pressure. 768.26(mm Hg)   Temp. 21.80(C)     Date: 18/11/2013    Time: 12:8:17
  Alt. 12.19(m)   Pressure. 768.29(mm Hg)   Temp. 21.80(C)     Date: 18/11/2013    Time: 12:8:22
  Alt. 11.62(m)   Pressure. 768.27(mm Hg)   Temp. 21.80(C)     Date: 18/11/2013    Time: 12:8:28
  Alt. 12.36(m)   Pressure. 768.30(mm Hg)   Temp. 21.80(C)     Date: 18/11/2013    Time: 12:8:33
вот так:

  Alt. 11.86(m)   Pressure. 768.17(mm Hg)   Temp. 21.50(C)     Date: 18/11/2013    Time: 12:19:47
  Alt. 12.28(m)   Pressure. 768.22(mm Hg)   Temp. 21.50(C)     Date: 18/11/2013    Time: 12:19:53
  Alt. 10.96(m)   Pressure. 768.19(mm Hg)   Temp. 21.50(C)     Date: 18/11/2013    Time: 12:19:58
  Alt. 11.45(m)   Pressure. 768.21(mm Hg)   Temp. 21.50(C)     Date: 18/11/2013    Time: 12:20:04
  Alt. 11.95(m)   Pressure. 768.17(mm Hg)   Temp. 21.50(C)     Date: 18/11/2013    Time: 12:20:09
  Alt. 12.69(m)   Pressure. 768.22(mm Hg)   Temp. 21.50(C)     Date: 18/11/2013    Time: 12:20:14
  Alt. 11.78(m)   Pressure. 768.21(mm Hg)   Temp. 21.50(C)     Date: 18/11/2013    Time: 12:20:20
  Alt. 11.87(m)   Pressure. 768.20(mm Hg)   Temp. 21.50(C)     Date: 18/11/2013    Time: 12:20:25
через монитор порта естественно тоже:

Writing to data_log.txt...
  Alt. 11.62(m)   Pressure. 768.04(mm Hg)   Temp. 23.40(C)     Date: 18/11/2013    Time: 12:26:01
done.
Writing to data_log.txt...
  Alt. 11.70(m)   Pressure. 768.09(mm Hg)   Temp. 23.40(C)     Date: 18/11/2013    Time: 12:26:06
done.
Writing to data_log.txt...
  Alt. 12.03(m)   Pressure. 768.05(mm Hg)   Temp. 23.30(C)     Date: 18/11/2013    Time: 12:26:12
done.

код теперь такой:

// Ported to SdFat from the native Arduino SD library example by Bill Greiman
// On the Ethernet Shield, CS is pin 4. SdFat handles setting SS
const int chipSelect = 10;
/*
 SD card read/write
 
 This example shows how to read and write data to and from an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created   Nov 2010
 by David A. Mellis
 updated 2 Dec 2010
 by Tom Igoe
 modified by Bill Greiman 11 Apr 2011
 This example code is in the public domain.
 	 
 */

#include <Wire.h>
#include <BMP085.h>
// BMP085_test1
// by Filipe Vieira
// Simple test of BMP085 output using default settings.
// This example requires AUTO_UPDATE_TEMPERATURE to be true in bmp085.h otherwise temperature will not update.
// IMPORTANT!! To get correct values you MUST CHANGE init() parameters, in 
// this example I've set 250m based on GPS data for my location.
#include <DS1307.h> // written by  mattt on the Arduino forum and modified by D. Sjunnesson
#include <SdFat.h>
SdFat sd;
SdFile myFile;


BMP085 dps = BMP085();      // Digital Pressure Sensor 

long Temperature = 0, Pressure = 0, Altitude = 0;

void setup(void) {
  Serial.begin(9600);
  while (!Serial) {
  }  // wait for Leonardo
  Wire.begin();
  delay(1000);

}

void loop(void) {

  // uncomment for different initialization settings
  //dps.init();     // QFE (Field Elevation above ground level) is set to 0 meters.
  // same as init(MODE_STANDARD, 0, true);

  //dps.init(MODE_STANDARD, 101850, false);  // 101850Pa = 1018.50hPa, false = using Pa units
  // this initialization is useful for normalizing pressure to specific datum.
  // OR setting current local hPa information from a weather station/local airport (QNH).

  dps.init(MODE_ULTRA_HIGHRES, 1200, true);  // 250 meters, true = using meter units
  // this initialization is useful if current altitude is known,
  // pressure will be calculated based on TruePressure and known altitude.

  // note: use zeroCal only after initialization.
  // dps.zeroCal(101800, 0);    // set zero point

  // Initialize SdFat or print a detailed error message and halt
  // Use half speed like the native library.
  // change to SPI_FULL_SPEED for more performance.
  if (!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();

  // open the file for write at end like the Native SD library
  if (!myFile.open("data_log.txt", O_RDWR | O_CREAT | O_AT_END)) {
    sd.errorHalt("opening data_log.txt for write failed");
  }
  // if the file opened okay, write to it:
  Serial.println("Writing to data_log.txt...");

  dps.getPressure(&Pressure);
  dps.getAltitude(&Altitude);
  dps.getTemperature(&Temperature);

  myFile.print("  Alt. ");
  myFile.print(Altitude*0.01);
  myFile.print("(m) ");
  myFile.print("  Pressure. ");
  myFile.print(Pressure/133.3);
  myFile.print("(mm Hg) ");
  myFile.print("  Temp. ");
  myFile.print(Temperature*0.1);
  myFile.print("(C) ");
  myFile.print("  ");                  //some space for a more happy life
  myFile.print("  Date: ");
  if ((RTC.get(DS1307_DATE,0))<10) {      //если минут меньше 10
   myFile.print("0");                    //добавляем 0 перед минутами
   myFile.print(RTC.get(DS1307_DATE,1));
  } else {
  myFile.print(RTC.get(DS1307_DATE,1));
}
  myFile.print("/");
  if ((RTC.get(DS1307_MTH,0))<10) {      //если месяц меньше 10
   myFile.print("0");                    //добавляем 0 перед
   myFile.print(RTC.get(DS1307_MTH,0));
  } else {
  myFile.print(RTC.get(DS1307_MTH,0));
}
  myFile.print("/");
  myFile.print(RTC.get(DS1307_YR,0));    //read year
  myFile.print("  ");                //some space for a more happy life
  myFile.print("  Time: ");
  if ((RTC.get(DS1307_HR,0))<10) {      //если меньше 10
   myFile.print("0");                    //добавляем 0 перед
   myFile.print(RTC.get(DS1307_HR,0));
  } else {
  myFile.print(RTC.get(DS1307_HR,0));
}
  myFile.print(":");
  if ((RTC.get(DS1307_MIN,0))<10) {      //если минут меньше 10
   myFile.print("0");                    //добавляем 0 перед минутами
   myFile.print(RTC.get(DS1307_MIN,0));
  } else {
  myFile.print(RTC.get(DS1307_MIN,0));
}
  myFile.print(":");
  if ((RTC.get(DS1307_SEC,0))<10) {
   myFile.print("0");
   myFile.print(RTC.get(DS1307_SEC,0));
  } else {
  myFile.print(RTC.get(DS1307_SEC,0));
}
  myFile.println();

  Serial.print("  Alt. ");
  Serial.print(Altitude*0.01);
  Serial.print("(m) ");
  Serial.print("  Pressure. ");
  Serial.print(Pressure/133.3);
  Serial.print("(mm Hg) ");
  Serial.print("  Temp. ");
  Serial.print(Temperature*0.1);
  Serial.print("(C) ");
  Serial.print("  ");                // some space for a more happy life
  Serial.print("  Date: ");
  if ((RTC.get(DS1307_DATE,0))<10) {      //если минут меньше 10
   Serial.print("0");                    //добавляем 0 перед минутами
   Serial.print(RTC.get(DS1307_DATE,1));
  } else {
  Serial.print(RTC.get(DS1307_DATE,1));
}
  Serial.print("/");
  if ((RTC.get(DS1307_MTH,0))<10) {      //если месяц меньше 10
   Serial.print("0");                    //добавляем 0 перед
   Serial.print(RTC.get(DS1307_MTH,0));
  } else {
  Serial.print(RTC.get(DS1307_MTH,0));
}
  Serial.print("/");
  Serial.print(RTC.get(DS1307_YR,0));    //read year
  Serial.print("  ");                //some space for a more happy life
  Serial.print("  Time: ");
  if ((RTC.get(DS1307_HR,0))<10) { 
   Serial.print("0");                    //добавляем 0
   Serial.print(RTC.get(DS1307_HR,0));
  } else {
  Serial.print(RTC.get(DS1307_HR,0));
}
  Serial.print(":");
  if ((RTC.get(DS1307_MIN,0))<10) {      //если минут меньше 10
   Serial.print("0");                    //добавляем 0 перед минутами
   Serial.print(RTC.get(DS1307_MIN,0));
  } else {
  Serial.print(RTC.get(DS1307_MIN,0));
}
  Serial.print(":");
  if ((RTC.get(DS1307_SEC,0))<10) {
   Serial.print("0");
   Serial.print(RTC.get(DS1307_SEC,0));
  } else {
  Serial.print(RTC.get(DS1307_SEC,0));
}
  Serial.println();

  myFile.close();                        //close the file:
  Serial.println("done.");

  delay(5000);
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Или так:

if(HOUR<10) Serial.print('0');
Serial.print(HOUR);

 

TevatroN
Offline
Зарегистрирован: 17.11.2013

maksim и вам спасибо, так компактнее
вот часть кода записивающая на SD карту:

  myFile.print("  Time: ");
  if ((RTC.get(DS1307_HR,0))<10)myFile.print("0");    //если часов меньше 10 добавляем 0 перед часами
  myFile.print(RTC.get(DS1307_HR,0));
  myFile.print(":");
  if ((RTC.get(DS1307_MIN,0))<10)myFile.print("0");  //если минут меньше 10 добавляем 0 перед минутами
  myFile.print(RTC.get(DS1307_MIN,0));
  myFile.print(":");
  if ((RTC.get(DS1307_SEC,0))<10)myFile.print("0");
  myFile.print(RTC.get(DS1307_SEC,0));
  myFile.println();

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

maksim пишет:

Или так:

if(HOUR<10) Serial.print('0');
Serial.print(HOUR);

 

а ведь точно! Записал.

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Evgeny пишет:

Скетч залил такой же, как привел ivanserov

Результат следующий:

 Alt(m):246  Pressure(mm Hg):1.82 Temp:0.00
 

Отчего может не показываться температура и такое маленькое давление?

Подключаю к arduino nano ,  точно такая же проблема 

 Alt(m):246  Pressure(mm Hg):1.82 Temp:0.00

 

 

inhelp
inhelp аватар
Offline
Зарегистрирован: 23.09.2012

Проблема была в подключении, уже решил)))

Использую библиотеку https://github.com/adafruit/Adafruit-BMP085-Library

Показания:

Temperature = 24.40 *C
Pressure = 99822 Pa
Altitude = 126.15 meters
Real altitude = 140.32 meters
 
POMAIIIKA_86
Offline
Зарегистрирован: 16.03.2014

inhelp пишет:

Проблема была в подключении, уже решил)))

Использую библиотеку https://github.com/adafruit/Adafruit-BMP085-Library

Показания:

Temperature = 24.40 *C
Pressure = 99822 Pa
Altitude = 126.15 meters
Real altitude = 140.32 meters
 

А какая проблема была в подключении, а то я пока не могу догнать и показания те же самые:
Alt(m):246  Pressure(mm Hg):1.82 Temp:0.00

freearduino
Offline
Зарегистрирован: 21.04.2014

Всем привет!

Кто нибудь пытался на этом датчике высчитать скорость подьема и высоту(которая будет обнулятся)?
 

faraddin
Offline
Зарегистрирован: 11.08.2013

Я сейчас логику для вариометра пишу, рассчет скорости подъема планирую реализовать самым простым способом: замер высоты раз в секунду, разница между замерами в метрах и будет скоростью подъема/сниженя в м/с

freearduino
Offline
Зарегистрирован: 21.04.2014

faraddin пишет:

Я сейчас логику для вариометра пишу, рассчет скорости подъема планирую реализовать самым простым способом: замер высоты раз в секунду, разница между замерами в метрах и будет скоростью подъема/сниженя в м/с

А может кто "ткнет" носом в книгу? Может кто знает где можно расчеты почитать?

faraddin
Offline
Зарегистрирован: 11.08.2013

freearduino пишет:

А может кто "ткнет" носом в книгу? Может кто знает где можно расчеты почитать?

Может кто нибудь и ткнет. Но не я. У меня пока барометр не пришел, я его и не трогал. Но когда он ко мне придет, я полагаю что библиотека будет передавать мне в программу простое значение абсолютной высоты в метрах (ну так же температуру и давление, но они тут не нужны). Соответственно если принимать значения раз в секунду и оно станет 275, а предыдушее было 273.5 то это и будет означать подъем со скоростью 1.5 м/с

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
Radjah
Offline
Зарегистрирован: 06.08.2014

Есть же нормальная бибилиотека от производителя датчика https://github.com/adafruit/Adafruit-BMP085-Library

А для формирования строки есть волшебная функция sprintf, только она float не умеет, но с целыми работает отлчино.

Geo
Offline
Зарегистрирован: 25.09.2014

faraddin пишет:

freearduino пишет:

А может кто "ткнет" носом в книгу? Может кто знает где можно расчеты почитать?

Может кто нибудь и ткнет. Но не я. У меня пока барометр не пришел, я его и не трогал. Но когда он ко мне придет, я полагаю что библиотека будет передавать мне в программу простое значение абсолютной высоты в метрах (ну так же температуру и давление, но они тут не нужны). Соответственно если принимать значения раз в секунду и оно станет 275, а предыдушее было 273.5 то это и будет означать подъем со скоростью 1.5 м/с

Есть уже готовые скетчи для вариометров! они уже считают скороподъемность и на основе этого выдают звук!

В теме где вы ответили на изменение программы уже в принципе всё готово, показатель скороподъемности, переменная Vario только её надо делить на 100

faraddin
Offline
Зарегистрирован: 11.08.2013

Geo пишет:

 

Есть уже готовые скетчи для вариометров! они уже считают скороподъемность и на основе этого выдают звук!

В теме где вы ответили на изменение программы уже в принципе всё готово, показатель скороподъемности, переменная Vario только её надо делить на 100

Почему нет? Я просто в ожидании барометра не касался этой темы даже еще. Сейчас пытаюсь разобраться с дисплеем nokia5110 на аппаратном уровне, без библиотек. Да и код я пишу по некоторым причинам в AVR studio. А так да, из того примера можно много полезного разузнать.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

вопрос всем - кто, где ( откуда берёт ) QNH для вычисления РЕАЛЬНОЙ высоты ( AMSL ) ?

skyspirit
Offline
Зарегистрирован: 27.02.2015

Вот нашел даташит http://iarduino.ru/lib/datasheet%20bmp180.pdf (ссылка рабочая нужно её  выделить как перейдет и нажать)  в котором формула вычитания абсолютной высоты, кто то может подсказать как правильно её вписать в код чтоб работала, или какую функцию нужно использывать для вычитание высоты относительно уровня моря?

skyspirit
Offline
Зарегистрирован: 27.02.2015

Как вообще работать с формулами возвидения в степень, не могу понять или библиотеку какую надо подключать работая с математикой?

Radjah
Offline
Зарегистрирован: 06.08.2014