Вывод данных с барометра BMP085
- Войдите на сайт для отправки комментариев
Втр, 23/10/2012 - 19:33
Подключил вышеуказанный барометр по I2C. Скачал библиотеку отсюда http://www.arduino.cc/en/Reference/Libraries, запускаю пример. Монитор показывает следующее
Altitude (cm):24919 Pressure(Pa):101574 Temperature(C):254
Второй столбец вроде как необходимо разделить на 133.3 для перевода в мм р. ст, остальные данные выводятся в RAW формате (как я понимаю), как из этого формата перевести в нормальный читабельный вид? Есть у кого был опыт как это сделать или может пример по-удачнее подскажете? Спасибо.
использую дуемиланову, версия Arduino 1.0.1.
Так какую конкретно библиотеку вы используете? Название у нее есть или ссылка?
http://code.google.com/p/bmp085driver/downloads/detail?name=bmp085v0.4.zip&can=2&q=label:Featured вот здесь она есть, называется вроде bmp085v0.4
Я заказал аналогичный барометр с 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; }спасибо за пример, результат его работы выглядит так
давление еще можно преобразовать, а температура если перемножить можит и верно, высооты над уровнем моря нет
Подключил вышеуказанный барометр по I2C. Скачал библиотеку отсюда http://www.arduino.cc/en/Reference/Libraries, запускаю пример. Монитор показывает следующее
Смею предположить, что и те данные, которые вы написали - верные
Давление в паскалях верное, температура (нужно умножить на 0,1), насчет высоты, либо 249,19 м, либо 24.919м над уровнем моря (посмотрите на навигаторе любом для уточнения).
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 байт. вполне возможно если сюда еще приписать алгоритмы вычисления высоты, то память сравняется.
с показаниями высоты пока оставил так как есть, времени дуину взять в руки пока нет.
А удалось стабилизировать показатели ?
тоже столкнулся что высота над уровнем моря +- 1 метр
скачет, вроде не должно быть такого.
Немного изменил скетч: добавил вывод температуры в формате 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); }Показания выводятся так:
Arduino 1.01
Здравствуйте!
Тоже пытаюсь подключить свой 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
Отчего может не показываться температура и такое маленькое давление?
Если вы используете мегу 2560 то скорей всего SDA и SCL нужно подключать на 20 (SDA) и 21 (SCL) пины, а не на аналоговые как пишете вы.
Спасибо большое за совет!
Все заработало!
Добрый день !
У миня сразу заработало.... Переключая тумблер мона измерить превышение/принижение холма/здания.... Задумка - измерение QHF и высоты, соответственно, на мотодельтаплане.... Код - далее
//=========================================================================================================================================== #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; } } //===========================================================================================================================================Сегодня проверил все 4 порога 2-ух ВПП пулковских ( пройдено ножками 9 км ) - аэронавигационные данные аэр. Пулково и данные с этого датчика - +/- 80 см !!!!!!!!!!!!!!!!!!
Вот только усреднение надо прописать, а то скачЮт данные......
133,3 в делах авиации - не точно....
правильно - 133,3223684 :)
LCD мигает 500 х 500 мсек - в абсолютном режиме, 100 х 100 мсек - в относительном режиме ( измерение превышения ).
Кроме того - измерил высоту пулковской вышки-"гранаты"... Лазерный дальномер и этот датчик - 10 замеров - датчик показал, что на 60 см выше, чем - лазер...
Хороший барометр :)
Кто-нить занимался вычислением вертикалной скорости с помощью этого датчика ?
Залил скетч из 10 поста. За 2 часа показания высоты поднялись на 14 метров, хотя датчик лежит всё время на столе. С чем это может быть связано?
Залил скетч из 10 поста. За 2 часа показания высоты поднялись на 14 метров, хотя датчик лежит всё время на столе. С чем это может быть связано?
Ну, вообще-то датчик является барометрическим. Стало быть, если давление падает, то "высота" растет.
Видимо, связано с приближающимся дождем...
Приветствую форумчан, просьба помочь разобраться.
Имею: 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); }if (HOUR<10) { Serial.print ("0"); Serisl.print (HOUR); } else { Serial.print (HOUR); }с минутами секундами и датами аналогично.
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); }Или так:
if(HOUR<10) Serial.print('0'); Serial.print(HOUR);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();Или так:
if(HOUR<10) Serial.print('0'); Serial.print(HOUR);а ведь точно! Записал.
Скетч залил такой же, как привел 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
Проблема была в подключении, уже решил)))
Использую библиотеку https://github.com/adafruit/Adafruit-BMP085-Library
Показания:
Проблема была в подключении, уже решил)))
Использую библиотеку https://github.com/adafruit/Adafruit-BMP085-Library
Показания:
А какая проблема была в подключении, а то я пока не могу догнать и показания те же самые:
Alt(m):246 Pressure(mm Hg):1.82 Temp:0.00
Всем привет!
Кто нибудь пытался на этом датчике высчитать скорость подьема и высоту(которая будет обнулятся)?
Я сейчас логику для вариометра пишу, рассчет скорости подъема планирую реализовать самым простым способом: замер высоты раз в секунду, разница между замерами в метрах и будет скоростью подъема/сниженя в м/с
Я сейчас логику для вариометра пишу, рассчет скорости подъема планирую реализовать самым простым способом: замер высоты раз в секунду, разница между замерами в метрах и будет скоростью подъема/сниженя в м/с
А может кто "ткнет" носом в книгу? Может кто знает где можно расчеты почитать?
А может кто "ткнет" носом в книгу? Может кто знает где можно расчеты почитать?
Может кто нибудь и ткнет. Но не я. У меня пока барометр не пришел, я его и не трогал. Но когда он ко мне придет, я полагаю что библиотека будет передавать мне в программу простое значение абсолютной высоты в метрах (ну так же температуру и давление, но они тут не нужны). Соответственно если принимать значения раз в секунду и оно станет 275, а предыдушее было 273.5 то это и будет означать подъем со скоростью 1.5 м/с
Помощь друга:
http://we.easyelectronics.ru/part/datchik-davleniya-bmp180-lineynyy-stab...
http://www.instructables.com/id/ECV5M8LHW8SZH47/
Есть же нормальная бибилиотека от производителя датчика https://github.com/adafruit/Adafruit-BMP085-Library
А для формирования строки есть волшебная функция sprintf, только она float не умеет, но с целыми работает отлчино.
А может кто "ткнет" носом в книгу? Может кто знает где можно расчеты почитать?
Может кто нибудь и ткнет. Но не я. У меня пока барометр не пришел, я его и не трогал. Но когда он ко мне придет, я полагаю что библиотека будет передавать мне в программу простое значение абсолютной высоты в метрах (ну так же температуру и давление, но они тут не нужны). Соответственно если принимать значения раз в секунду и оно станет 275, а предыдушее было 273.5 то это и будет означать подъем со скоростью 1.5 м/с
Есть уже готовые скетчи для вариометров! они уже считают скороподъемность и на основе этого выдают звук!
В теме где вы ответили на изменение программы уже в принципе всё готово, показатель скороподъемности, переменная Vario только её надо делить на 100
Есть уже готовые скетчи для вариометров! они уже считают скороподъемность и на основе этого выдают звук!
В теме где вы ответили на изменение программы уже в принципе всё готово, показатель скороподъемности, переменная Vario только её надо делить на 100
Почему нет? Я просто в ожидании барометра не касался этой темы даже еще. Сейчас пытаюсь разобраться с дисплеем nokia5110 на аппаратном уровне, без библиотек. Да и код я пишу по некоторым причинам в AVR studio. А так да, из того примера можно много полезного разузнать.
вопрос всем - кто, где ( откуда берёт ) QNH для вычисления РЕАЛЬНОЙ высоты ( AMSL ) ?
Вот нашел даташит http://iarduino.ru/lib/datasheet%20bmp180.pdf (ссылка рабочая нужно её выделить как перейдет и нажать) в котором формула вычитания абсолютной высоты, кто то может подсказать как правильно её вписать в код чтоб работала, или какую функцию нужно использывать для вычитание высоты относительно уровня моря?
Как вообще работать с формулами возвидения в степень, не могу понять или библиотеку какую надо подключать работая с математикой?
https://github.com/adafruit/Adafruit-BMP085-Library