Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
У меня следующая проблема: Поскольку датчик BH1750 поддерживает только два разных адреса I2C, но мне нужно использовать 6 из этих датчиков, я хочу использовать 3 Arduino, 2 nano, 1 Uno и отправлять данные из nano в uno. Проблема в том, что шина I2C уже используется и при попытке отправить данные она не работает должным образом. Возможно ли это вообще? Пробуя, я не могу получить ничего правильного
Обновление:
Вот что я сейчас попробовал:
Результаты, которые я получаю, по-прежнему неверны
#include <Wire.h>
#include <BH1750.h>
// Этот код будет включать использование датчиков освещенности 6 Гр 30
BH1750 active_sensor(0x23); // Мы будем использовать этот адрес для указания активного датчика
BH1750 inactive_sensor(0x5C);
void setup(){
Serial.begin(9600);
// Установка входных контактов для управления адресными контактами модулей
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
// Инициализируем шину i2c
Wire.begin();
// Здесь мы установим режим модуля
if (active_sensor.begin(BH1750::CONTINUOUS_HIGH_RES_MODE)) {
Serial.println(F("BH1750 Advanced begin"));
}
else {
Serial.println(F("Error initialising BH1750"));
Serial.println("Problem on 1");
}
}
void loop() {
get_values();
}
void get_values(){
int i;
Serial.println("----");
for(i = 8; i<=13;i++){
digitalWrite(i,HIGH);
delay(50);
int lux = 0;
lux = active_sensor.readLightLevel();
Serial.println(lux);
delay(50);
digitalWrite(i,LOW);
delay(150);
}
}
@Th3Fi3nD, 👍0
Обсуждение2 ответа
Лучший ответ:
Используйте вывод ADDR для выбора микросхемы. Потяните оба штифта вверх, как обычно. Если вы хотите поговорить с одним из них, потяните вывод ADDR на низкий уровень и используйте адрес ADDR = 0 для разговора с выбранным устройством. Тогда вы сможете подключить все 6 к одному Arduino.
Я действительно пробовал это раньше, это не сработало должным образом. Есть ли у вас доказательства того, что это действительно работает?, @Th3Fi3nD
Опубликуйте код того, что вы пробовали со всеми 6 устройствами, подключенными, как предложено. Убедитесь, что все устройства получают питание., @CrossRoads
Здесь приведен простой эскиз, который вы можете попробовать для 1 устройства, а затем легко изменить, чтобы циклически пройти через все 6. Обязательно добавьте подтягивающие резисторы 4,7 кОм или даже 3,3 кОм к SDA и SCK. Внутренних подтягиваний в 328P недостаточно., @CrossRoads
Хорошо, я только что опубликовал код, который использую, я пока не использовал резисторы. То есть резистор только 1 или по одному на каждый датчик?, @Th3Fi3nD
https://media.digikey.com/pdf/Data%20Sheets/DFRobot%20PDFs/SEN0097_Web.pdf Да, по одному резистору на SCL и SDA, желательно в конце проводной цепи. Не на каждом устройстве, а только на одном устройстве., @CrossRoads
Я попробовал то, что вы мне сказали, я предоставил схему и код, который использовал, но все еще не получил того, что хотел, можете ли вы взглянуть на это?, @Th3Fi3nD
Вы можете заставить nano использовать программное обеспечение I2C для изоляции этих шин I2C от шины I2C UNO. Затем пусть UNO станет ведущим на своей собственной шине, запрашивая данные при необходимости.
Хотя, если вы выберете программный I2C, вы можете заставить UNO выполнять всю работу I2C, при условии, что у вас для этого достаточно свободных контактов.
Другой вариант — приобрести подходящий мультиплексор I2C, например TCA9548A.
Для шести программных шин i2c требуется 7 контактов. Это 6 линий sda и всего 1 линия scl. Выбор ADDR для фокусировки одного датчика проще, но требует 8 контактов. Для tca9548a по-прежнему требуется 5 контактов (два i2c плюс три адреса для 6 шин)., @Jot
@Jot Но вам нужно всего 3 шины, потому что пара датчиков может использовать одну шину. Кроме того, адресные контакты tca9548a могут быть статически связаны, фактическое мультиплексирование осуществляется внутри. Вы пишете в сам tca9548a через I2C (для этого и предназначены адресные контакты), чтобы выбрать, какие каналы должны быть открыты, а затем он передает сигналы шины I2C в эти открытые каналы. Когда закончите, вы сможете закрыть канал., @ratchet freak
Спасибо, я об этом не подумал. Таким образом, это будут 4 контакта для программного i2c, 8 контактов для выбора ADDR и 2 контакта для tca9548a., @Jot
- MAX30100 не работает
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- Сброс адреса I2c — MLX90614
- Считывание значений с емкостного сенсорного датчика TTP229 на arduino
- Чтение данных из eagle tree airspeed v3
- Два датчика расхода, один ESP32, ЖК-дисплей и/или Arduino
- Датчик качества воздуха Sparkfun CCS811 не работает
- Проблема прерываний с датчиком потока
обновление вопроса основано на ответе CrossRoads, @Juraj
комментарий к обновлению вопроса. с адресом ADDR HIGH — 5C. измените адрес активного устройства на 5C., @Juraj
вам следует принять ответ CrossRoads, чтобы отметить этот вопрос решенным, @Juraj