Извлечение двоичных чисел из инфракрасного датчика, использующего шину 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);
}
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();
}
}
,
@Codo
Смотрите также:
- Колебания показаний датчика температуры LM35 (+- 5°C) с Arduino UNO
- Неверные показания PT100 и MAX31865
- 7-сегментный индикатор мигает
- Как нагреть воздух с помощью ардуино?
- Значения NaN в инкубаторе для яиц
- Какой из них ИК-светодиод?
- Как работает ввод с ИК-приемника на плату Arduino UNO?
- мой датчик температуры LM35 дает странные показания,