Проблема с устройствами Arduino Uno 2 I2C
У меня есть два устройства I2C, подключенных к Arduino Uno: RTC и интерфейс OBD (см. ссылки ниже). SCL/SDA обоих устройств подключены параллельно к SCL/SDA (соответственно) Uno. Моя проблема: когда я устанавливаю время на RTC (используя либо опцию автоустановки, либо явно), оно возвращает странные показания, например, дату, переведенную на 4 дня назад, часы, переведенные на 2 часа назад и т. д. Это происходит даже с базовым скетчем RTC по умолчанию.
Я попробовал два RTC (один DS1307 и один, ссылка на который приведена ниже): оба ведут себя одинаково странно. Я попробовал 2 конфигурации: 1) БЕЗ подтягивающих резисторов на обоих устройствах, 2) два подтягивающих резистора 10 кОм на ОБОИХ устройствах. В обеих ситуациях возникают ошибки RTC. Если я отсоединяю датчик OBD от SCL/SDA, RTC показывает правильное время. Если я отсоединяю RTC, OBD сам по себе (работает нормально. Прежде чем я потрачу больше времени на эксперименты: есть ли какие-нибудь советы, как решить эту проблему с подтягивающим резистором (если это то, что нужно)?
Adafruit DS3231 Precision RTC
Интерфейс OBD Freematics
@MrSparkly, 👍1
2 ответа
Лучший ответ:
Я полагаю, что вы используете библиотеку Adafruit, поскольку это URL-адрес продукта, который вы опубликовали.
Если так, то в RTClib.h:
#define DS1307_ADDRESS 0x68
#define DS3231_ADDRESS 0x68
И на странице продукта OBD:
OBD I2C Address: 0x68
MEMS I2C Address: 0x62
Что, очевидно, вызывает конфликт.
Похоже, что у них фиксированный адрес I2C (некоторые устройства настраиваются через программное обеспечение, другие — через внешние контакты). Поэтому решением будет использовать другие RTC, другие OBD (или изменить их адрес) или использовать разветвитель шины, или использовать микроконтроллер с более чем одной шиной I2C.
Если у кого-то такая же проблема: оказывается, у Adafruit есть мультиплексор как раз для этой цели. Также есть LTC4316, который (якобы) преобразует адреса I2C на лету.
Мультиплексор Adafruit TCA9548A I2C
LTC4316
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
Спасибо, верно подмечено, я изучу этот вопрос. Почему бы не сделать устройства I2C с небольшой, встроенной, припаиваемой перемычкой, чтобы быстро задать адрес, отличный от адреса по умолчанию? Риторический вопрос..., @MrSparkly
Ну, так и есть, просто не у всех есть эта функция :), @Wesley Lee