Сброс адреса 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: Техническая таблица

, 👍1

Обсуждение

что написано в таблице данных о сбросе адреса?, @jsotola

Я не смог найти ничего об этом, @keser

отредактировал вопрос, @keser


1 ответ


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

1

На странице 13 из 35 таблицы указано:

Чтобы предоставить доступ к любому устройству или присвоить адрес SD, прежде чем он будет подключен к системе шин, связь должна начать с нулевого SA, за которым следует младший бит RWB. Когда эта команда отправлена от MD, MLX90614 всегда будет отвечать и игнорировать информация о внутреннем коде чипа.

Предположительно, всё, что вам нужно сделать, это подключить только одно устройство и использовать нулевой адрес для чтения/записи регистров.

,

Я не понял часть "низкий бит RWB", @keser

это бит чтения/записи... см. рисунок 4... об этом должна позаботиться библиотека, @jsotola

Я делаю то, что там написано, но не уверен, что нулевой SA = адрес по умолчанию., @keser

Возможно, проблема в скорости I2C. MLX90614 поддерживает только i2c 100 кГц. Если ваш i2c работает на частоте 400 кГц, MLX90614 не ответит., @aGuegu