miercuri, 15 octombrie 2014

Senzorul de presiune BMP180

English version: BMP180 sensor and Arduino

   Cu ceva timp in urma, am cumparat de pe ebay un modul GY-68 cu senzor de presiunea BMP180, despre care trebuie sa stim, in primul rand ca tensiunea de alimentare maxima este de 3,6V, deci putem sa-l alimentam de la placa Arduino din pinul notat 3.3V sau 3V (depinde de producatorul placii); mai trebuie sa stim ca modulul se conecteaza prin 2 fire (comunicare i2c).
   Pe langa informatii despre presiune, senzorul masoara si temperatura cu o precizie de +10C.
   Schema de conectare este simpla, cum este prezentat in articolul BMP180 Barometric Pressure Sensor Hookup:
   Schema de conexiuni realizata de mine este:
   Pentru a-l putea folosi, am folosit libraria Adafruit-BMP085, obtinand pe ecranul de monitorizare seriala:
   Am modificat sketch-ul pentru informatii in romana si a-mi da si alte date:
   Sketch-ul modificat este:
// http://nicuflorica.blogspot.ro & http://arduinotehniq.blogspot.com 
// https://github.com/adafruit/Adafruit-BMP085-Library
#include <Wire.h>
#include <Adafruit_BMP085.h>

/*************************************************** 
  This is an example for the BMP085 Barometric Pressure & Temp Sensor

  Designed specifically to work with the Adafruit BMP085 Breakout 
  ----> https://www.adafruit.com/products/391

  These displays use I2C to communicate, 2 pins are required to  
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5
// Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4
// EOC is not used, it signifies an end of conversion
// XCLR is a reset pin, also not used here

Adafruit_BMP085 bmp;
  
void setup() {
  Serial.begin(9600);
  if (!bmp.begin()) {
 Serial.println("nu exita senzor compatibil BMP085 sau BMP180");
 while (1) {}
  }
}
  
void loop() {
    Serial.print("Temperatura = ");
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    Serial.print("Presiune = ");
    Serial.print(bmp.readPressure());
    Serial.print(" Pa / ");
    
 //   Serial.print("Presiune = ");
    float presiune1 = bmp.readPressure()/101.325;
    presiune1 = presiune1 * 0.760;
    Serial.print(presiune1);
    Serial.println(" mmHg");
    
    
    // Calculate altitude assuming 'standard' barometric
    // pressure of 1013.25 millibar = 101325 Pascal
    Serial.print("Altitudine = ");
    Serial.print(bmp.readAltitude());
    Serial.println(" m");

    Serial.print("Presiune la nivelul marii (calculata) = ");
    Serial.print(bmp.readSealevelPressure());
    Serial.print(" Pa / ");
    
    // http://en.wikipedia.org/wiki/Atmospheric_pressure#Mean_sea_level_pressure
  //  Serial.print("Presiure la nivelul marii (calculata) = ");
    float presiune = bmp.readSealevelPressure()/101.325;
    presiune = presiune * 0.760;
    Serial.print(presiune);
    Serial.println(" mmHg");
    

  // you can get a more precise measurement of altitude
  // if you know the current sea level pressure which will
  // vary with weather and such. If it is 1015 millibars
  // that is equal to 101500 Pascals.
    Serial.print("Altitudine reala = ");
    Serial.print(bmp.readAltitude(101500));
    Serial.println(" m");
    
    Serial.println();
    delay(2500);
}
   Am realizat un mic filmulet numit senzorul BMP180 si Arduino:
   Am folosit acest senzor intr-un proiect mai amplu, o ministatie meteo cu Arduino Due si un afisaj grafic color de 2,2" cu driver ILI9341. Acest proiect a fost prezentat detaliat in articolul Arduino Due si afisajul QVGA de 2,2" (5,6cm) comandat de ILI9341.
   Revenind la senzor si placa Arduino Uno, am zis ca e mai util sa afisez informatiile pe un ecran alfanumeric 1602, de genul:
asa ca am facut un filmulet numit senzorul BMP180 si Arduino (2)
   Sketch-ul scris de mine, arata asa:
// adapted sketch by niq_ro from http://nicuflorica.blogspot.ro/ & http://arduinotehniq.blogspot.com/
// https://github.com/adafruit/Adafruit-BMP085-Library
#include <Wire.h>
#include <Adafruit_BMP085.h>

/*************************************************** 
  This is an example for the BMP085 Barometric Pressure & Temp Sensor

  Designed specifically to work with the Adafruit BMP085 Breakout 
  ----> https://www.adafruit.com/products/391

  These displays use I2C to communicate, 2 pins are required to  
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

// Connect VCC of the BMP085 sensor to 3.3V (NOT 5.0V!)
// Connect GND to Ground
// Connect SCL to i2c clock - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 5
// Connect SDA to i2c data - on '168/'328 Arduino Uno/Duemilanove/etc thats Analog 4
// EOC is not used, it signifies an end of conversion
// XCLR is a reset pin, also not used here

// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

/*                                    -------------------
                                      |  LCD  | Arduino |
                                      -------------------
 LCD RS pin to digital pin 7          |  RS   |   D7    |
 LCD Enable pin to digital pin 6      |  E    |   D6    |
 LCD D4 pin to digital pin 5          |  D4   |   D6    |
 LCD D5 pin to digital pin 4          |  D5   |   D4    |
 LCD D6 pin to digital pin 3          |  D6   |   D3    |
 LCD D7 pin to digital pin 2          |  D7   |   D2    |
 LCD R/W pin to ground                |  R/W  |   GND   |
                                      -------------------
*/



Adafruit_BMP085 bmp;
  
void setup() {
  lcd.begin(16, 2);
  // Print a logo message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay (2500);
  lcd.clear();

  // Print another message to the LCD.
  lcd.setCursor(2, 0);
  lcd.print("termometru -");  
  lcd.setCursor(0, 1);
  lcd.print("barometru ver1.0");
  delay (2500);
  lcd.clear();

  Serial.begin(9600);
  if (!bmp.begin()) {
 Serial.println("nu exita senzor compatibil BMP085 sau BMP180");
 while (1) {}
  }
}
  
void loop() {
    Serial.print("Temperatura = ");
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    Serial.print("Presiune = ");
    Serial.print(bmp.readPressure());
    Serial.print(" Pa / ");
    
 //   Serial.print("Presiune = ");
    float presiune1 = bmp.readPressure()/101.325;
    presiune1 = presiune1 * 0.760;
    Serial.print(presiune1);
    Serial.println(" mmHg");
    
    
    // Calculate altitude assuming 'standard' barometric
    // pressure of 1013.25 millibar = 101325 Pascal
    Serial.print("Altitudine = ");
    Serial.print(bmp.readAltitude());
    Serial.println(" m");

    Serial.print("Presiune la nivelul marii (calculata) = ");
    Serial.print(bmp.readSealevelPressure());
    Serial.print(" Pa / ");
    
    // http://en.wikipedia.org/wiki/Atmospheric_pressure#Mean_sea_level_pressure
  //  Serial.print("Presiure la nivelul marii (calculata) = ");
    float presiune = bmp.readSealevelPressure()/101.325;
    presiune = presiune * 0.760;
    Serial.print(presiune);
    Serial.println(" mmHg");
    

  // you can get a more precise measurement of altitude
  // if you know the current sea level pressure which will
  // vary with weather and such. If it is 1015 millibars
  // that is equal to 101500 Pascals.
    Serial.print("Altitudine reala = ");
    Serial.print(bmp.readAltitude(101500));
    Serial.println(" m");
    
    Serial.println();
    
    
   lcd.setCursor(1, 0);
   lcd.print("temp.=  ");
    if ( bmp.readTemperature() < 10)
   {
     lcd.print(" "); 
     lcd.print(bmp.readTemperature());
   }
   else
   {
   lcd.print(bmp.readTemperature(),1);
   }
   lcd.write(0b11011111);
   lcd.print("C   ");
   
   lcd.setCursor(1, 1);
   lcd.print("pres.= p");
   lcd.print(presiune,0);
   lcd.print("mmHg  ");
    
   delay(2500);
}
iar schema este:
24.11.2014
   In weak-end am primit 3 poze de la Dave, un radioamator foarte cunoscut din West Cumbria, care are blog-ul http://g4rvh.wordpress.com/.
   Dave si-a facut un shield facut la CNC prin frezare, dupa schema de mai sus.
   Sketch-ul l-am modificat sa-i prezinte temperatura in grade Fahrenheit in loc de Celsius, dupa informatiile din articolul Conversion of Temperature:

16 comentarii:

  1. si eu am testat un senzor de presiune 3,3 V si arduino alimentat la 5 V
    dar atentie conexiune I2C de 3,3 V ?
    este ok arduino detecteaza automat nivelul de semnal pentru I2C dar daca mai adaugi un LCD alimentat la 5V nivelul I2C devine I2C de 5 V si prajesti senzorul de presiune
    am testat cu rezistente de 330 ohmi sau 10K ohmi nu merge
    din prudenta am folosit un Logic Level Convertor dar atentie la conexiuni am folosit doua tx -uri

    RăspundețiȘtergere
  2. Salut, care e sursa acestei scheme ? Are baterie sau e conectat la calculator ?

    RăspundețiȘtergere
    Răspunsuri
    1. nu foloesc baterii, era alimentat la experimente din usb, dar merge f. f. bine din alimentator sau baterie.... e vreo problema?

      Ștergere
  3. Salut, am cumparat toate piesele ,cu tot cu ecran 16x2, dar am o problema la incarcarcarea sketch-ului. Cand dau verify imi da urmatoarele erori:

    This report would have more information with
    "Show verbose output during compilation"
    enabled in File > Preferences.
    Arduino: 1.0.6 (Windows NT (unknown)), Board: "Arduino Uno"
    sketch_dec07a:47: error: 'Adafruit_BMP085' does not name a type
    sketch_dec07a.ino: In function 'void setup()':
    sketch_dec07a:67: error: 'bmp' was not declared in this scope
    sketch_dec07a.ino: In function 'void loop()':
    sketch_dec07a:75: error: 'bmp' was not declared in this scope

    Poti sa ma ajuti cu rezolvarea lor , te rog !?
    Multumesc!

    RăspundețiȘtergere
  4. lipseste libraria pt senzoril BMP, se descarca din link-ul din linia a doua a sketch-ului

    RăspundețiȘtergere
  5. Nu inteleg cum sa conectez LCD-ul la arduiono. LCD-ul achizitionat de mine are doar cei 16 pini, fara adaptor i2c. Dispun doar de fire.. Pot conecta acesata doar conectand pinii la arduino,fara adaptor i2c si fara placuta dinaia alba? Am incercat sa ma uit atent cum pleaca firele din arduino si unde intra mai exact la LCD-ul tau,dar nu se vede.. Schema cu siguranta e buna doar ca nu am destule cunostiinte sa o pun in praactica momentan. Stima

    RăspundețiȘtergere
  6. in ultima schema ste exact un afisaj cu 16 fire, fara interfata i2c... nu se folosesc toti pinii, doar ce-i desenati acolo.. iti arat linkul direct al schemei: http://1.bp.blogspot.com/-eygUwqVy3h8/VD5xs5T2Q0I/AAAAAAAAMRA/Pim8Q5by-sI/s1600/arduino_bmp180_lcd1602_schematic.bmp

    RăspundețiȘtergere
  7. Pentru realizarea acestei scheme am nevoie obligatoriu de breadboard si cele 2 rezistente? Nu se poate lega direct firele din arduino la pinii ecranului, fara breadboard si fara rezistente ?

    RăspundețiȘtergere
    Răspunsuri
    1. rezistenta R1 este pentru limitarea curentului, iar semirglabilul pentru contrast.. sunt obligatorii.. fire, cum sunt cele din cablul de retea, le poti lipi la afisaj si infigi in mufele de la placa Arduino, dar e de preferat breadboardul si fire ca la mine, ca se modfica usor schema...

      Ștergere
  8. salut ! se poate folosii adaptor I2C si BMP280 in locul lui BMP180 ?
    multumesc !

    RăspundețiȘtergere
    Răspunsuri
    1. dupa cum prezinta la https://learn.adafruit.com/adafruit-bmp280-barometric-pressure-plus-temperature-sensor-breakout?view=all se poate lega direct si la i2c...

      Ștergere
  9. salut! dupa multa munca cu ajutorul colegului meu Catalin am reusit sa finalizez acest montaj cu bmp180 (initial am vrut sa-l fac cu bmp280 dar am reusit sa-l ,,prajesc"),l-am luat si l-am ,,amestecat" cu acesta : https://nicuflorica.blogspot.ro/2016/06/radio-fm-cu-tea5767-si-arduino-iii.html?showComment=1519120472828#c7352378451444097972 ...si a rezultat un radio cu o mini statie meteo totul afisat pe un LCD 20x4 !
    Acum ramane de vazut cat de precis arata datele(presiune,altitudine,temperatura),urmand sa vad daca le mai pot ajusta.
    Multumiri domnului Nicu Florica pt programe !

    RăspundețiȘtergere
  10. salut! am realizat un montaj senzor de presiune cu MPX10DP si un amplificator de instrumentatie . cum se procedeaza pentru a primi semnal pozitiv pe vacum la iesirea amplificatorului (adica sa fie pozitiv si pe tras si pe impins). Va multumesc. costel1voicu@yahoo.com

    RăspundețiȘtergere
  11. Buna seara! Am o problema, am facut montajul exact ca in scheme si cand bag sketch-ul nu-mi trece de partea cu recunoastrea senzorului. Nu-mi afiseaza temperatura, presiunea. Nu-mi dau seama unde este problema. Ma puteti ajuta?
    Multumesc!

    RăspundețiȘtergere