Arduino mega 2560 и датчики BMP180
- Войдите на сайт для отправки комментариев
Здравствуйте уважаемые форумчане. Только начал изучать работу с 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. }
Помогите разобраться с адресами (где в даташите это описано?) и как поправить данный скетч для работы с двумя датчиками.
Заранее благодарен.
Помогите разобраться с адресами (где в даташите это описано?) и как поправить данный скетч для работы с двумя датчиками.
А даташит и библиотеку на ВАШ датчик нужно самому где-то искать?
Здравствуйте. Спасибо, что откликнулись.
Вот даташит http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf
Тут библиотеку брал https://codeload.github.com/sparkfun/BMP180_Breakout/zip/master
Ну узнать адресс любого I2C устройства вы можете с помощью самой ардуины+библиотеки Wire.
Просто сделать поиску устройств.
http://playground.arduino.cc/Main/I2cScanner
Но, боюсь, что запустив этот скетч - вы расстроитесь.
Так как все ваши датчики вернут один и тот же адресс: 0x77
О чем кстати прямо написанно, на самой странице продукта, в разделе "Technical Details"
http://www.adafruit.com/products/1603
Кстати, что несколько удивляет, в даташите такая цифра вообще отсуствует....
Там адрессом названны (и везде в примерах используются) 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/
А раз у вас на меге много ножек, то можно посмотреть в сторону програмнного I2C
http://playground.arduino.cc/Main/SoftwareI2CLibrary
и второй просто завешивать на другие пины.
Но тогда и библиотеку прийдется перепиливать основательно, что-бы она SiftwareI2C поддерживала.
Через I2C мультиплексер (схема и код).
https://github.com/mahfuz195/Pressure_sensor_BMP180
Спасибо вам огромное за помощь, буду читать и разбираться.
И снова здрасте!
Датчик BMP180, подключён по I2C и 3,3 вольта, мега 2560. Печатаю в порт (интересует только давление)
получаю: Pressure = 100736 Pa. Тут всё нормально.
Теперь этот же датчик, по I2C на Atmega168 - 8 MHz, печатаю на LCD
Бибилиотеку для дисплея смотри и делай явное преобразование в строку перед выводом.
mihail_p как решили проблему подключения нескольких BMP180, мне нужно подключить всего 2 датчика, ставивить мультиплексор
на I2C нет большого желания, а механический клапан для переключения подводящих трубок нереально думаю он быстро
выйдет из строя да и резкие скачки давления для BMP будет не подарок.
Да, если кто то подключил этот датчик через программный I2C, незамедлительно делитесь успехами.
mihail_p как решили проблему подключения нескольких BMP180, мне нужно подключить всего 2 датчика, ставивить мультиплексор
на I2C нет большого желания, а механический клапан для переключения подводящих трубок нереально думаю он быстро
выйдет из строя да и резкие скачки давления для BMP будет не подарок.
Обошолся одним датчиком если честно. Из вариантов для себя в качестве оптимального рассматрива программный I2C. Здесь http://playground.arduino.cc/Main/SoftwareI2CLibrary все отлично описано с примером, так что дерзай. Для интереса попробовал бы, но датчиков под рукой нет к сожалению.
Да, если кто то подключил этот датчик через программный I2C, незамедлительно делитесь успехами.
Какой вариант вы избрали для себя?
http://www.ebay.com/itm/Adafruit-TCA9548A-I2C-Multiplexer-Breakout-board...
https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-brea...
8 каналов
а механический клапан для переключения подводящих трубок
что ?
Конечно в случае сложного устройста требующего соответствующего кол-ва датчиков я полностью согласен с вами. Но если человеку нужно два датчика, то имхо проще программно.
Механический клапан - это МЕХАНИЧЕСКИЙ клапан, тоже самое что механический переключающий тумблер,
только он переключает не ток, а входящие потоки (давление) воздуха в 1 выходящий.
Видимо предётся всёже мультеплексировать аппаратно I2C. Давление необходимо мерить в 2 точках с разностью по времени не более 5сек.
Програмное мультеплексирование I2C для меня выглядит более сложно на данном этапе.
Видимо предётся всёже мультеплексировать аппаратно I2C. Давление необходимо мерить в 2 точках с разностью по времени не более 5сек.
Програмное мультеплексирование I2C для меня выглядит более сложно на данном этапе.
Я не знаю, что у вас за конструкция, но може оказаться, что проще будет добавить еще один микроконтроллер.
Извините что поднимаю старую тему, но столкнулся с такой же задачей - измерение давления в двух точках, при этом адреса этих же датчиков так же одинаковы.
В итоге самым простым решением явилось.. установка сдвоенного реле на линии SDA и SLC. В итоге единовременно включен только один датчик, но отправив 0 или 1 на реле - включаем уже другой.
Никаких механических клапанов и трубок.
Проблему я решил примерно также но, только использую мультиплексор-демультиплексор TC4053BP (был в гутапе), можно любой другой который который комутирует минимум 2 канала (1X2), комутируется с пина ардуины логическим 0 или 1.
при инициализации с него читается CHIP ID и все.... дуина думает что датчик реади))
при чтении с него читается 12 констант калибровки ну и полтора байта давления (собственно прогиб мембраны датчика в "попугаях") который с константами пересчитывается в библиотеке в реальное давление..... так что не должен он убиться.....
Кстати, что несколько удивляет, в даташите такая цифра вообще отсуствует....
Там адрессом названны (и везде в примерах используются) 0xEF и 0xEE
Но, в самой библиотеке, мы видим такую строчку:
Wire.beginTransmission(BMP180_ADDR);
Смотрим как определен этот дефайн, и видим
#define BMP180_ADDR 0x77 // 7-bit address
Так что, похоже, все-таки правильный адресс 0x77