Датчик помех I2C (SCL+SDA) и связь MasterSlave
Я строю метеостанцию с ведомым устройством Arduino (предназначенным для датчика дождя, изображенным ниже как геркон) и ведущим устройством NodeMCU с некоторыми дополнительными датчиками.
Один из таких датчиков, 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, но это не повлияло на показания.
@tony gil, 👍2
Обсуждение3 ответа
Лучший ответ:
Библиотека 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
Согласно вашим описаниям, я отвечаю здесь. Дело в том, что мы забываем о расчете емкости нагрузки для выбора подтяжки I2C. Рассчитывается, когда более одного раба и варианта на расстоянии. Проверьте перемычки, а для подтягиваний попробуйте 10k или 4.7k или лучше, которые вы можете рассчитать. Лучше предусмотреть небольшую задержку после функции wire.begin() для стабилизации модуля
не могли бы вы написать это на чертовой диаграмме в вопросе?, @tony gil
Решение, которое я реализовал, использует датчик 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
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- Проблема с отображением времени Ntp на oled с использованием библиотеки U8G2.
- Протокол I2C не работает должным образом
- Можно ли подключить 3 MPU9250 к Node MCU без мультиплексора?
- I2C master/slave максимальный размер сообщения requestEvent
- Использование HX711 (с ячейкой загрузки) С PCF8574 В NODEMCU
Подсказка №1: подтягивающие резисторы I2C., @Mikael Patel
поделитесь своим полным эскизом здесь., @Vaibhav
I2C предназначен для коротких расстояний на печатной плате. Как далеко будет раб?, @Juraj
@Juraj несколько сантиметров - та же плата (есть 10-метровый удлинитель для датчика дождя - эта часть работает отлично)., @tony gil
@MikaelPatel Я еще поиграю с подтягивающим резистором и вернусь к вам., @tony gil
@Vaibhav 1300 строк кода... Какие части интересуют больше всего? до настройки?, @tony gil