Сброс адреса I2c — MLX90614
Я безупречно использовал свой датчик MLX90614 IRTherm и купил еще два. Я подключил два датчика последовательно с подтяжками к SDA --> A4 и SCL --> А5
. Покопавшись в Интернете, я обнаружил, что мне следует изменить их подчиненные адреса по умолчанию на разные адреса, чтобы Arduino могла распознавать их 7-битные подчиненные адреса.
После смены адреса я теперь не могу прочитать ни два новых серийных MLX, ни свой старый MLX.
- Возможно, я перепутал их адреса и не знаю, как это сделать. сбросить их адреса.
- Как подключить несколько датчиков/как правильно изменить их адрес?
чтение данных датчиков
#include <Wire.h> // Библиотека I2C, необходимая для MLX90614
#include <SparkFunMLX90614.h> // Библиотека SparkFunMLX90614 Arduino
IRTherm therm; // Создаем объект IRTherm для взаимодействия
const byte LED_PIN = 8; // Дополнительный светодиод, подключенный к контакту 8 (активный низкий уровень)
void setup()
{
Serial.begin(9600); // Инициализируем последовательный порт для регистрации вывода
therm.begin(0x5A); // Инициализируем тепловой ИК-датчик
therm.setUnit(TEMP_F); // Устанавливаем библиотечные единицы измерения по Фаренгейту
// В качестве альтернативы TEMP_F можно заменить на TEMP_C для Цельсия или
// TEMP_K для Кельвина.
pinMode(LED_PIN, OUTPUT); // вывод светодиода как выход
setLED(LOW); // светодиод выключен
}
void loop()
{
setLED(HIGH); //Светодиод горит
// Вызов therm.read() для считывания температуры объекта и окружающей среды с датчика.
if (therm.read()) // В случае успеха read() вернет 1, в случае неудачи — 0.
{
// Используйте функции object() иambient(), чтобы захватить объект и окружение
// температуры.
// Это будут числа с плавающей запятой, рассчитанные в единицах измерения, установленных вами с помощью setUnit().
Serial.print("Object: " + String(therm.object(), 2));
Serial.write('°'); // Символ степени
Serial.println("F");
Serial.print("Ambient: " + String(therm.ambient(), 2));
Serial.write('°'); // Символ степени
Serial.println("F");
Serial.println();
}
setLED(LOW);
delay(500);
}
void setLED(bool on)
{
if (on)
digitalWrite(LED_PIN, LOW);
else
digitalWrite(LED_PIN, HIGH);
}
Установка адреса
#include <Wire.h> // Библиотека I2C, необходимая для MLX90614 #include <SparkFunMLX90614.h> // Библиотека SparkFunMLX90614 Arduino IRTherm therm; // Создаем объект IRTherm для взаимодействия const byte oldAddress = 0x5A; const byte newAddress = 0x5B; void setup() { Serial.begin(9600); // Инициализируем последовательный порт для регистрации вывода Serial.println("Press a key to begin"); while (!Serial.available()) ; therm.begin(oldAddress); // Попробуйте сначала использовать старый адрес byte address; if (!therm.readID()) // Попробуйте прочитать регистры ID { // Если чтение не удалось, попробуйте выполнить повторную инициализацию с помощью // новый адрес. Возможно, мы уже это установили. therm.begin(newAddress); if (therm.readID()) // Чтение из регистров идентификатора { // Если чтение прошло успешно, выводим идентификатор: Serial.println("Communicated with new address."); Serial.println("ID: 0x" + String(therm.getIDH(), HEX) + String(therm.getIDL(), HEX)); } else { Serial.println("Failed to communicate with either address."); } } else { // Если чтение удалось, измените адрес на что-нибудь // новый. if (!therm.setAddress(newAddress)) { Serial.println("Failed to set new address."); } else { Serial.println("Set the address to 0x" + String(newAddress, HEX)); Serial.println("Cycle power to try it out."); } } } void loop() { }
Редактирование 1: Техническая таблица
@keser, 👍1
Обсуждение1 ответ
Лучший ответ:
На странице 13 из 35 таблицы указано:
Чтобы предоставить доступ к любому устройству или присвоить адрес SD, прежде чем он будет подключен к системе шин, связь должна начать с нулевого SA, за которым следует младший бит RWB. Когда эта команда отправлена от MD, MLX90614 всегда будет отвечать и игнорировать информация о внутреннем коде чипа.
Предположительно, всё, что вам нужно сделать, это подключить только одно устройство и использовать нулевой адрес для чтения/записи регистров.
Я не понял часть "низкий бит RWB", @keser
это бит чтения/записи... см. рисунок 4... об этом должна позаботиться библиотека, @jsotola
Я делаю то, что там написано, но не уверен, что нулевой SA = адрес по умолчанию., @keser
Возможно, проблема в скорости I2C. MLX90614 поддерживает только i2c 100 кГц. Если ваш i2c работает на частоте 400 кГц, MLX90614 не ответит., @aGuegu
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Отправка 4 аналоговых значений от одного arduino к другому с помощью I2C
- Код I2C работает на Mega 2560, но не на Uno и nano
- Сколько соединений может создать метод Arduino I2C?
- Проблема со связью I2C HMC5983
- avrdude ser_open() can't set com-state
- Отправка и получение различных типов данных через I2C в Arduino
что написано в таблице данных о сбросе адреса?, @jsotola
Я не смог найти ничего об этом, @keser
отредактировал вопрос, @keser