Датчик помех I2C (SCL+SDA) и связь MasterSlave

Я строю метеостанцию с ведомым устройством Arduino (предназначенным для датчика дождя, изображенным ниже как геркон) и ведущим устройством NodeMCU с некоторыми дополнительными датчиками.

Arduino slave NodeMCU master

Один из таких датчиков, BMP280, использует D1 и D2 в качестве SCL и SDA, а подчиненное управление использует D3 и D4 для связи с Arduino.

Когда я включаю Wire.begin для ведомой связи, мои показания BMP280 сходят с ума

#include <Adafruit_BMP280.h>

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11 
#define BMP_CS 10

Adafruit_BMP280 bmp;

// мастер-подчиненный
#include <Wire.h>
#define I2CAddressESPWifi 8
...

void setup() {

    if (!bmp.begin()) {  
        Serial.println("Could not find a valid BMP280 sensor, check wiring!");
        while (1);
    }

    // masterSlave - генерирует проблему с BMP280...
    Wire.begin(0,2);//Изменить на Wire.begin() для не ESP. D3 СДА D4 СКЛ

BMP280 Temp = -136,42 *C

Давление = 125136,25 Па

в отличие от этого чтения, когда Wire.begin закомментирован.

    // ЗАКОММЕНТИРОВАНО ДЛЯ ОТЛАДКИ
    //masterSlave - генерирует проблему с BMP280...
    //Wire.begin(0,2);//Изменить на Wire.begin() для не ESP. D3 СДА D4 СКЛ

BMP280 Temp = 20,01 *C

Давление = 93464,36 Па

Я попытался установить для D3 и D4 значение LOW во время чтения с BMP280, но это не повлияло на показания.

, 👍2

Обсуждение

Подсказка №1: подтягивающие резисторы I2C., @Mikael Patel

поделитесь своим полным эскизом здесь., @Vaibhav

I2C предназначен для коротких расстояний на печатной плате. Как далеко будет раб?, @Juraj

@Juraj несколько сантиметров - та же плата (есть 10-метровый удлинитель для датчика дождя - эта часть работает отлично)., @tony gil

@MikaelPatel Я еще поиграю с подтягивающим резистором и вернусь к вам., @tony gil

@Vaibhav 1300 строк кода... Какие части интересуют больше всего? до настройки?, @tony gil


3 ответа


Лучший ответ:

2

Библиотека Adafruit BMP280 использует библиотеку Wire. Он вызывает метод begin() на выводах по умолчанию (D1, D2). И затем вы начинаете () один и тот же объект Wire на разных выводах. С этого момента библиотека BMP280 не может обмениваться данными с датчиком.

I2C (он же TwoWire или Wire) — это шина. Многие устройства могут быть подключены к одной и той же паре контактов. Они должны слушать по разным адресам. Поэтому подключите оба устройства к D1, D2 и используйте в ведомом Arduino адрес, отличный от адреса датчика.

ESP8266 и датчик — это устройства на 3,3 В. Uno — это устройство на 5 В. Вы должны использовать преобразование логического уровня SDA/SCL в Uno.

,

Итак, что касается I2C, датчик может быть адресован как ведомый. Я попробую это и свяжусь с вами к концу дня. Имеет смысл. ПРОГОЛОСОВАНО, @tony gil

не "для решения". но "имеющий адрес". некоторые датчики имеют фиксированный адрес, некоторые имеют выбор из нескольких адресов, @Juraj

да, я проверю это. Я начну с изменения адреса подчиненного устройства (сейчас 8), @tony gil

адрес I2C по умолчанию для Adafruit BMP280 — 0x77., @Juraj

Я попытался это решение безрезультатно., @tony gil

это не решение, а объяснение. что не так после того, как вы используете библиотеку Wire на одном наборе контактов?, @Juraj

когда я помещаю ведомое устройство и отправитель на один и тот же набор контактов, датчик не распознается., @tony gil

на D1, D1 и вы удалили Wire.begin(0, 2)?, @Juraj

Да, я сделал. все, что использует D1 и D2, удалено Wire.begin(0,2). Датчик работает без ведомого, но когда ведомый подключен, датчик перестает распознаваться, @tony gil

@tonygil, слейв Arduino работает без датчика на esp8266?, @Juraj

50 бонусных баллов за усилия, даже несмотря на то, что в настоящее время я не могу подтвердить или опровергнуть этот ответ из-за других случайных проблем, которые возникают, И из-за моих ограниченных знаний о библиотеке Wire., @tony gil

Я добавил примечание о преобразовании логического уровня. и благодарю вас., @Juraj

получил это работает. фиксированные соединения и установить небольшую задержку перед чтением, @tony gil


1

Согласно вашим описаниям, я отвечаю здесь. Дело в том, что мы забываем о расчете емкости нагрузки для выбора подтяжки I2C. Рассчитывается, когда более одного раба и варианта на расстоянии. Проверьте перемычки, а для подтягиваний попробуйте 10k или 4.7k или лучше, которые вы можете рассчитать. Лучше предусмотреть небольшую задержку после функции wire.begin() для стабилизации модуля

,

не могли бы вы написать это на чертовой диаграмме в вопросе?, @tony gil


0

Решение, которое я реализовал, использует датчик BMP280 в режиме SPI, подключенный следующим образом:

Макетная схема

с этим кодом перед настройкой

#include <Adafruit_BMP280.h>
#define BMP_SCK D5
#define BMP_MISO D8
#define BMP_MOSI D6 
#define BMP_CS D7

// Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // аппаратный SPI
Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);
,

который ТОЧНО не отвечает на мой ответ, хотя и решает практическую проблему (на всякий случай, если кому-то нужен обходной путь). ;), @tony gil