Здравствуйте, форумчане! Задача у меня такая: нужно на 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(); }
BMP180 подключаются не к произвольным ножкам, а только к шине I2C, т.е. SDA и SCL. Адрес у них одинаковый, поэтому одновременная работа невозможна. Можно, конечно, использовать мультиплексор, но по мне это изначально неверная архитектура, зачем нужны 4 барометра?
Вы не указываете нигде, к каким пинам какой барометр подключен, так что явно косяк. Конфликт адресов проще всего решается мультиплексором i2c. В esp8266 i2c только софтварный.
Нужны две пары барометров, которые будут выполнять роль двух дифференциальных барометров. Каким образом лучше это сделать?
Купила TCA9548A и новый nodemcu 1.0. Может есть у кого скетч с примером работы в связке nodemcu+мультиплексор+датчики(барометр)?
Написала скетч... Но через монитор порта ничего не показывает... Что не так? #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); }
Код (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); }
Да. Код (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()); // ...
Сейчас скетч выглядит следующим образом: Код (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); }