Arduino mega 2560 и датчики BMP180

mihail_p
Offline
Зарегистрирован: 05.08.2014

Здравствуйте уважаемые форумчане. Только начал изучать работу с arduino. Есть arduino mega 2560, я хочу подключить к нему несколько датчиков bmp180. Почитав соответствующую литературу и примеры я подключил датчик (gnd-gnd,vin-vin,scl-scl,sda-sda). Я так понял данный датчик работает по протоколу I2C. Прочитав о данном протоколе я так понял, что можно подключить несколько одинаковых датчиков и обращаться к ним по адресу. Адресация должана быть в даташите датчика, но почитав его я не смог разобраться.

Для одного датчика все работает. Использовал такой скетч:

#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 pressure;
//---------------------------------------------------------------------------------------------------------------------
void setup()
//---------------------------------------------------------------------------------------------------------------------
{ Serial.begin(9600); Serial.println("begin");
  if (pressure.begin())   Serial.println("BMP180 init success");   else   {    Serial.println("BMP180 init fail\n\n");  }}
 
//----------------------------------------------------------------------------------------------------------------------
void  loop()
//----------------------------------------------------------------------------------------------------------------------
{
  char status;
  double T,P;
  status = pressure.startTemperature();   delay(status);  status = pressure.getTemperature(T);
      Serial.print("temperature: ");       Serial.print(T,2);         Serial.print(" deg C, ");
      status = pressure.startPressure(3);   delay(status); status = pressure.getPressure(P,T);
      Serial.print(P*0.75006375541921,2);  Serial.println(" mm rt stolba");
  delay(5000);  // Pause for 5 seconds.
}

Помогите разобраться с адресами (где в даташите это описано?) и как поправить данный скетч для работы с двумя датчиками.

Заранее благодарен.

leshak
Offline
Зарегистрирован: 29.09.2011

mihail_p пишет:

Помогите разобраться с адресами (где в даташите это описано?) и как поправить данный скетч для работы с двумя датчиками.

А даташит и библиотеку на ВАШ датчик нужно самому где-то искать?

mihail_p
Offline
Зарегистрирован: 05.08.2014

Здравствуйте. Спасибо, что откликнулись.

Вот даташит http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf

Тут библиотеку брал https://codeload.github.com/sparkfun/BMP180_Breakout/zip/master

 

leshak
Offline
Зарегистрирован: 29.09.2011

Ну узнать адресс любого I2C устройства вы можете с помощью самой ардуины+библиотеки Wire.
Просто сделать поиску устройств.

http://playground.arduino.cc/Main/I2cScanner

Но, боюсь, что запустив этот скетч - вы расстроитесь.
Так как все ваши датчики вернут один и тот же адресс: 0x77

О чем кстати прямо написанно, на самой странице продукта, в разделе "Technical Details"

http://www.adafruit.com/products/1603
 

  • This board/chip uses I2C 7-bit address 0x77.

Кстати, что несколько удивляет, в даташите такая цифра вообще отсуствует....
Там адрессом названны (и везде в примерах используются) 0xEF и 0xEE

Но, в самой библиотеке, мы видим такую строчку:

Wire.beginTransmission(BMP180_ADDR);

Смотрим как определен этот дефайн, и видим
#define BMP180_ADDR 0x77 // 7-bit address

Так что, похоже, все-таки правильный адресс 0x77

Но, в любом случае вам от этого не легче.
Вне зависимости от того "какой он", похоже он "жестко зашит", и конфигурированию с помощью пинов или регистров - не поддается (по крайней мере - я не нашел).

Так что хоть I2C шина и позволяет работать одновременно нескольким устройствам, но в этом датчике эта "фича" - не реализована.
Так что или расскаживать их на разные шины, либо включать/отключать их по очереди и одновременно работать тоьлко с одним.

Или искать что-то такое:

http://www.dsscircuits.com/index.php/i2c-multiplexer

или самому клепать

https://www.flickr.com/photos/33177304@N03/3230647685/player/
 

leshak
Offline
Зарегистрирован: 29.09.2011

А раз у вас на меге много ножек, то можно посмотреть в сторону програмнного I2C

http://playground.arduino.cc/Main/SoftwareI2CLibrary

и второй просто завешивать на другие пины.

Но тогда и библиотеку прийдется перепиливать основательно, что-бы она SiftwareI2C поддерживала.

leshak
Offline
Зарегистрирован: 29.09.2011

Через I2C мультиплексер  (схема и код).

https://github.com/mahfuz195/Pressure_sensor_BMP180

mihail_p
Offline
Зарегистрирован: 05.08.2014

Спасибо вам огромное за помощь, буду читать и разбираться.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

И снова здрасте!

Датчик BMP180, подключён по I2C и 3,3 вольта, мега 2560. Печатаю в порт (интересует только давление)

Serial.print(bmp.readPressure());

получаю: Pressure = 100736 Pa. Тут всё нормально.

Теперь этот же датчик, по I2C на Atmega168 - 8 MHz, печатаю на LCD

LcdPrint(bmp.readPressure(), ON, 1);
Получаю число 234, и статично (на меге меняется)
Функция чтения давления возвращает int32_t. C этим типом при выводе на экран проблем нет. 
Чем можно помочь?
 
Radjah
Offline
Зарегистрирован: 06.08.2014

Бибилиотеку для дисплея смотри и делай явное преобразование в строку перед выводом.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

mihail_p как решили проблему подключения нескольких BMP180, мне нужно подключить всего 2 датчика, ставивить мультиплексор

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

выйдет из строя да и резкие скачки давления для BMP  будет не подарок.

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

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

mihail_p
Offline
Зарегистрирован: 05.08.2014

oleg_kazakof пишет:

mihail_p как решили проблему подключения нескольких BMP180, мне нужно подключить всего 2 датчика, ставивить мультиплексор

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

выйдет из строя да и резкие скачки давления для BMP  будет не подарок.

Обошолся одним датчиком если честно. Из вариантов для себя в качестве оптимального рассматрива программный I2C. Здесь http://playground.arduino.cc/Main/SoftwareI2CLibrary все отлично описано с примером, так что дерзай. Для интереса попробовал бы, но датчиков под рукой нет к сожалению.

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

hugoboss317 пишет:

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

Извращенцев тред.

mihail_p
Offline
Зарегистрирован: 05.08.2014

Какой вариант вы избрали для себя?

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

а механический клапан для переключения подводящих трубок 

что ?

mihail_p
Offline
Зарегистрирован: 05.08.2014

Конечно в случае сложного устройста требующего соответствующего кол-ва датчиков я полностью согласен с вами. Но если человеку нужно два датчика, то имхо проще программно.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Механический клапан - это МЕХАНИЧЕСКИЙ клапан, тоже самое что механический переключающий тумблер,

только он переключает не ток, а входящие потоки (давление) воздуха в 1 выходящий.

 

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Видимо предётся всёже мультеплексировать аппаратно I2C.  Давление необходимо мерить в 2 точках с разностью по времени не более 5сек.

Програмное мультеплексирование  I2C для меня выглядит более сложно на данном этапе.

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

oleg_kazakof пишет:

Видимо предётся всёже мультеплексировать аппаратно I2C.  Давление необходимо мерить в 2 точках с разностью по времени не более 5сек.

Програмное мультеплексирование  I2C для меня выглядит более сложно на данном этапе.

 

Я не знаю, что у вас за конструкция, но може оказаться, что проще будет добавить еще один микроконтроллер.

Ykosty
Offline
Зарегистрирован: 01.12.2015

Извините что поднимаю старую тему, но столкнулся с такой же задачей - измерение давления в двух точках, при этом адреса этих же  датчиков так же одинаковы.

В итоге самым простым решением явилось.. установка сдвоенного реле на линии SDA и SLC. В итоге единовременно включен только один датчик, но отправив 0 или 1 на реле - включаем уже другой.

Никаких механических клапанов и трубок.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Проблему я решил примерно также но, только использую мультиплексор-демультиплексор  TC4053BP (был в гутапе),  можно любой другой который который комутирует  минимум 2 канала (1X2), комутируется с пина ардуины  логическим 0 или 1.

 

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015
 dps.init(MODE_ULTRA_HIGHRES, 2000, true);

Cейчас проблема в другом.    Датчики подключены через
 мультиплексор и в принципе работают правильно, если проводить их инициализацию 
( первая строка текста) каждый раз перед обращениием к ним в основном цикле. 
Вопрос: какие действия происходят при инициализации BMP, по даташиту в BMP есть EEPROM,  
а количество перезаписи EEPROM ограничено, может кто в курсе при инициализации BMP есть 
ли запись в EEPROM.

 

Greenduzer
Offline
Зарегистрирован: 20.01.2016

oleg_kazakof пишет:

 dps.init(MODE_ULTRA_HIGHRES, 2000, true);

Cейчас проблема в другом.    Датчики подключены через
 мультиплексор и в принципе работают правильно, если проводить их инициализацию 
( первая строка текста) каждый раз перед обращениием к ним в основном цикле. 
Вопрос: какие действия происходят при инициализации BMP, по даташиту в BMP есть EEPROM,  
а количество перезаписи EEPROM ограничено, может кто в курсе при инициализации BMP есть 
ли запись в EEPROM.

 

при инициализации с него читается CHIP ID и все.... дуина думает что датчик реади))

при чтении с него читается 12 констант калибровки ну и полтора байта давления (собственно прогиб мембраны датчика в "попугаях") который с константами пересчитывается в библиотеке в реальное давление..... так что не должен он убиться.....

Krendelyok
Offline
Зарегистрирован: 05.10.2016

leshak пишет:

Кстати, что несколько удивляет, в даташите такая цифра вообще отсуствует....

Там адрессом названны (и везде в примерах используются) 0xEF и 0xEE

Но, в самой библиотеке, мы видим такую строчку:

Wire.beginTransmission(BMP180_ADDR);

Смотрим как определен этот дефайн, и видим
#define BMP180_ADDR 0x77 // 7-bit address

Так что, похоже, все-таки правильный адресс 0x77

Внесу ясность для будущих поколений)) " 0xEF и 0xEE" потому что в протоколе I^2C к адресу устройства младшим битом добавляется команда "чтения" либо "записи". Поэтому из 0x77 (0111 0111) получается либо  0xEF(1110 1111), либо 0xEE (1110 1110).