Nodemcu 0.9 и парочка BMP180

Тема в разделе "Arduino & Shields", создана пользователем Aleksandra_Ch, 28 фев 2017.

  1. Aleksandra_Ch

    Aleksandra_Ch Нерд

    Здравствуйте, форумчане!

    Задача у меня такая:
    нужно на nodemcu 0.9 повесить два, а лучше четыре барометра BMP180. Нашла две пары пинов (D1, D2 и D4, D5) при подключении к которым получаю на выходе нормальные значения давления. Но, если одновременно подключать два барометра к обоим парам ножек на выходе имею по первому барометру рандомное значение давления, по второму же все ок.

    Вопрос в следующем. Каким образом можно сделать адресацию барометров, если i2c адрес у всех четырех одинаковый и производителем не предусмотрена отдельный пин под адресацию?

    Может касяк в самом скетче? Прокатит ли такое подключение?

    Adafruit_BMP085 barometer1;
    Adafruit_BMP085 barometer2;

    void setup() {
    Serial.begin(9600);
    delay(10);
    Wire.begin(2,14); // SDA, SCL
    barometer1.begin();
    Wire.begin(4,5); // SDA, SCL
    barometer2.begin();
    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    BMP180 подключаются не к произвольным ножкам, а только к шине I2C, т.е. SDA и SCL.
    Адрес у них одинаковый, поэтому одновременная работа невозможна.
    Можно, конечно, использовать мультиплексор, но по мне это изначально неверная архитектура, зачем нужны 4 барометра?
     
  3. rkit

    rkit Гуру

    Вы не указываете нигде, к каким пинам какой барометр подключен, так что явно косяк.
    Конфликт адресов проще всего решается мультиплексором i2c.
    В esp8266 i2c только софтварный.
     
  4. Aleksandra_Ch

    Aleksandra_Ch Нерд

    Нужны две пары барометров, которые будут выполнять роль двух дифференциальных барометров. Каким образом лучше это сделать?
     
  5. Unixon

    Unixon Оракул Модератор

    Мультиплексировать I2C (2шт 74HC4052 например) и опрашивать по очереди.
     
  6. rkit

    rkit Гуру

    Ну зачем, когда есть специализированные вещи. PCA9548
     
    ИгорьК и arkadyf нравится это.
  7. Unixon

    Unixon Оракул Модератор

    Да можно и так, не возражаю. Здесь даже проще будет. Можно PCA9544 взять, на 4 порта хватит и его.
     
  8. Aleksandra_Ch

    Aleksandra_Ch Нерд

    Купила TCA9548A и новый nodemcu 1.0. Может есть у кого скетч с примером работы в связке nodemcu+мультиплексор+датчики(барометр)?
     
  9. Aleksandra_Ch

    Aleksandra_Ch Нерд

    Написала скетч... Но через монитор порта ничего не показывает... Что не так?

    #include <ESP8266WiFi.h>
    #include <Wire.h>
    #include <Adafruit_BMP085.h>
    // Переменная датчика атмосферного давления
    Adafruit_BMP085 barometer1;
    Adafruit_BMP085 barometer2;

    #define TCAADDR 0x70
    void tcaselect(uint8_t i) {
    if (i > 7) return;
    Wire.beginTransmission(TCAADDR);
    Wire.write(1 << i);
    Wire.endTransmission();
    }

    void setup() {
    Serial.begin(9600);
    delay(10);
    tcaselect(0);
    barometer1.begin();
    tcaselect(1);
    barometer2.begin();
    }

    void loop() {

    // Чтение значений параметров состояния атмосферы

    Serial.print("Температура: ");
    Serial.print(barometer1.readTemperature() + 273.15);
    Serial.println(" K");
    Serial.print("Давление: ");
    Serial.print(barometer1.readPressure());
    Serial.println(" Pa");

    Serial.print("Температура: ");
    Serial.print(barometer2.readTemperature() + 273.15);
    Serial.println(" K");
    Serial.print("Давление: ");
    Serial.print(barometer2.readPressure());
    Serial.println(" Pa");
    // Задержка 2 секунд
    delay(2000);
    }
     
    Последнее редактирование: 4 мар 2017
  10. alp69

    alp69 Форумчанин

    Вам сюда.
     
  11. Aleksandra_Ch

    Aleksandra_Ch Нерд

    Код (C++):
    #include <ESP8266WiFi.h>
    #include <Wire.h>
    #include <Adafruit_BMP085.h>
    // Переменная датчика атмосферного давления
    Adafruit_BMP085 barometer1;
    Adafruit_BMP085 barometer2;

    #define TCAADDR 0x70
    void tcaselect(uint8_t i) {
      if (i > 7) return;
      Wire.beginTransmission(TCAADDR);
      Wire.write(1 << i);
      Wire.endTransmission();
    }

    void setup() {
        Serial.begin(9600);
        delay(10);
        tcaselect(0);
        barometer1.begin();
        tcaselect(1);
        barometer2.begin();
    }

    void loop() {
       
        // Чтение значений параметров состояния атмосферы
     
        Serial.print("Температура: ");
        Serial.print(barometer1.readTemperature() + 273.15);
        Serial.println(" K");
        Serial.print("Давление: ");
        Serial.print(barometer1.readPressure());
        Serial.println(" Pa");
       
        Serial.print("Температура: ");
        Serial.print(barometer2.readTemperature() + 273.15);
        Serial.println(" K");
        Serial.print("Давление: ");
        Serial.print(barometer2.readPressure());
        Serial.println(" Pa");
        // Задержка 2 секунд
        delay(2000);
    }
     
    alp69 нравится это.
  12. rkit

    rkit Гуру

    Между обращениями к барометрам надо тоже переключать мультиплексор.
     
  13. Aleksandra_Ch

    Aleksandra_Ch Нерд

    Это в loop'е?
     
  14. Unixon

    Unixon Оракул Модератор

    Да.

    Код (C++):

    // ...
    tcaselect(0);
    Serial.print(barometer1.readTemperature() + 273.15);
    // ...
    Serial.print(barometer1.readPressure());
    // ...
    tcaselect(1);
    Serial.print(barometer2.readTemperature() + 273.15);
    // ...
    Serial.print(barometer2.readPressure());
    // ...
     
     
  15. Aleksandra_Ch

    Aleksandra_Ch Нерд

    Попробовала. В мониторе порта так ничего и нет... Что еще может быть?
     
  16. Aleksandra_Ch

    Aleksandra_Ch Нерд

    Сейчас скетч выглядит следующим образом:
    Код (C++):
    #include <ESP8266WiFi.h>
    #include <Wire.h>
    #include <Adafruit_BMP085.h>
    // Переменная датчика атмосферного давления
    Adafruit_BMP085 barometer1;
    Adafruit_BMP085 barometer2;

    #define TCAADDR 0x70
    void tcaselect(uint8_t i) {
      if (i > 7) return;
      Wire.beginTransmission(TCAADDR);
      Wire.write(1 << i);
      Wire.endTransmission();
    }

    void setup() {
        Serial.begin(9600);
        delay(10);
        tcaselect(0);
        barometer1.begin();
        tcaselect(1);
        barometer2.begin();
    }

    void loop() {
       
        // Чтение значений параметров состояния атмосферы
        tcaselect(0);
        Serial.print("Температура: ");
        Serial.print(barometer1.readTemperature() + 273.15);
        Serial.println(" K");
        Serial.print("Давление: ");
        Serial.print(barometer1.readPressure());
        Serial.println(" Pa");
       
        tcaselect(1);  
        Serial.print("Температура: ");
        Serial.print(barometer2.readTemperature() + 273.15);
        Serial.println(" K");
        Serial.print("Давление: ");
        Serial.print(barometer2.readPressure());
        Serial.println(" Pa");
        // Задержка 2 секунд
        delay(2000);
    }