Извлечение двоичных чисел из инфракрасного датчика, использующего шину I2C

infrared temperature

У меня есть инфракрасный датчик (OTI 301), который для отображения желаемой температуры мне нужно применить формулу, которая зависит от 3 двоичных чисел, извлеченных из самого датчика. Я пробовал разные подходы, но пока не удалось извлечь эти двоичные числа. См. ссылку на техническое описание датчика, где вы можете найти полезную информацию о формуле и двоичных числах. https://drive.google.com/file/d/1XMRDCNzY3fn0q6lkGejs5D-pqksfRuZ8/view также вот код, который я пробовал в Arduino IDE. Кроме того, на прикрепленном изображении показаны необходимые команды для извлечения данных из второго листа данных, https://drive.google. com/file/d/1mmdkHkNbwC5VgQxGMrq07XolajNvgBkN/view.

#include <Wire.h>
byte val[2] = {0x20,0x80};
void setup() {
Wire.begin(0x20);        // подключение к шине i2c (адрес необязателен для мастера)
Serial.begin(9600);  // запускаем сериал для вывода
}

void loop() {

  //мастер писатель
  Wire.beginTransmission(0x20); // передать на устройство
  Wire.write(val,2); 
  // Wire.write(x); // отправляет один байт
  Wire.endTransmission();    // прекращаем передачу

  //главный читатель
  Wire.requestFrom(0x20, 6);    // запрашиваем 6 байт у ведомого устройства

  while (Wire.available()) { // ведомое устройство может отправить меньше, чем запрошено
  Serial.println("H");
  char c = Wire.read(); // получаем байт как символ
}

delay(500);
}

, 👍0


1 ответ


2

Вероятно, есть две проблемы:

  • Используется неверный адрес устройства. Адрес устройства — 0x10, и библиотека Arduino Wire ожидает его именно таким (а не в смещенной версии с битом чтения/записи).
  • В вашем коде используются две отдельные транзакции, однако в таблице данных указана одна транзакция с повторяющимся условием START для разделения частей записи и чтения.

Итак, улучшенная версия выглядит так:

#define DEVICE_ADDRESS 0x10

void loop() {
    Wire.beginTransmission(DEVICE_ADDRESS);
    Wire.write(0x80);  // команда считывания
    Wire.endTransmission(false); // остановить отправку без завершения транзакции (повторный СТАРТ)
    Wire.requestFrom(DEVICE_ADDRESS, 6); // запрашиваем 6 байт
    uint8_t data[6];
    for (int i = 0; i < 6; i++) {
        data[i] = Wire.read();
    }
}
,