Можете показать в даташите, откуда вы взяли, что перед чтением значения нужно послать сенсору 0х60 ?
Может это и есть причина, почему
Можете показать в даташите, откуда вы взяли, что перед чтением значения нужно послать сенсору 0х60 ?
Может это и есть причина, почему
void readPressureData() {
// Читаем давление
Wire.beginTransmission(PRESSURE_SENSOR_ADDRESS);
Wire.write(0x0F);
Wire.write(0x49);
Wire.endTransmission(false);
delay(50);
Wire.requestFrom((uint8_t)PRESSURE_SENSOR_ADDRESS, (uint8_t)2);
uint16_t pressure = 0;
if (Wire.available() >= 2) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
pressure = (msb << 8) | lsb;
}
// Читаем температуру
Wire.beginTransmission(PRESSURE_SENSOR_ADDRESS);
Wire.write(0x0F);
Wire.write(0x21);
Wire.endTransmission(false);
delay(50);
Wire.requestFrom((uint8_t)PRESSURE_SENSOR_ADDRESS, (uint8_t)2);
uint16_t temperature = 0;
if (Wire.available() >= 2) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
temperature = (msb << 8) | lsb;
}
Serial.print("Pressure: 0x");
if ((pressure >> 8) < 16) Serial.print("0");
Serial.print((uint8_t)(pressure >> 8), HEX);
if ((pressure & 0xFF) < 16) Serial.print("0");
Serial.print((uint8_t)(pressure & 0xFF), HEX);
Serial.print(" (");
Serial.print(pressure);
Serial.print(") ");
Serial.print("Temperature: 0x");
if ((temperature >> 8) < 16) Serial.print("0");
Serial.print((uint8_t)(temperature >> 8), HEX);
if ((temperature & 0xFF) < 16) Serial.print("0");
Serial.print((uint8_t)(temperature & 0xFF), HEX);
Serial.print(" (");
Serial.print(temperature);
Serial.println(")");
}
17:35:09.725 -> Pressure: 0x8000 (32768) Temperature: 0x8000 (32768)
Теперь так
17:35:09.725 → Pressure: 0x8000 (32768) Temperature: 0x8000 (32768) Значения не меняются.
А калибровочные коэффициенты реальные читает или тоже все одинаковые?
И да, что-то вот эта картинка в ДШ наводит на мысль, что коэфф С1-С13 вы читаете тоже неправильно.
Если я понял верно, читать надо три байта.
void readCalibrationCoefficients() {
Serial.println("Reading calibration coefficients...");
// Сброс датчика перед чтением коэффициентов
Wire.beginTransmission(PRESSURE_SENSOR_ADDRESS);
Wire.write(0x1E);
Wire.endTransmission();
delay(100);
// Массив команд для чтения коэффициентов C1-C13
uint8_t commands[13][2] = {
{0x0E, 0x20}, // C1
{0x0E, 0x28}, // C2
{0x0E, 0x30}, // C3
{0x0E, 0x38}, // C4
{0x0E, 0x40}, // C5
{0x0E, 0x48}, // C6
{0x0E, 0x50}, // C7
{0x0E, 0x58}, // C8
{0x0E, 0x60}, // C9
{0x0E, 0x68}, // C10
{0x0E, 0x70}, // C11
{0x0E, 0x78}, // C12
{0x0E, 0x80} // C13
};
for (int i = 0; i < 13; i++) {
// Отправляем команду чтения коэффициента
Wire.beginTransmission(PRESSURE_SENSOR_ADDRESS);
Wire.write(commands[i][0]);
Wire.write(commands[i][1]);
Wire.endTransmission(false);
Wire.requestFrom((uint8_t)PRESSURE_SENSOR_ADDRESS, (uint8_t)2);
if (Wire.available() >= 2) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
uint16_t coefficient = (msb << 8) | lsb;
Serial.print("C");
Serial.print(i + 1);
Serial.print(": 0x");
if (msb < 16) Serial.print("0");
Serial.print(msb, HEX);
if (lsb < 16) Serial.print("0");
Serial.print(lsb, HEX);
Serial.print(" (");
Serial.print(coefficient);
Serial.println(")");
} else {
Serial.print("C");
Serial.print(i + 1);
Serial.println(": No data");
}
17:49:44.163 → C1: No data
17:49:44.209 → C2: No data
17:49:44.257 → C3: 0x805C (32860)
17:49:45.273 → C4: No data
17:49:45.357 → C5: No data
17:49:46.417 → C6: No data
17:49:46.464 → C7: No data
17:49:47.503 → C8: No data
17:49:47.549 → C9: No data
17:49:47.595 → C10: 0x802B (32811)
17:49:47.630 → C11: 0x802A (32810)
17:49:47.719 → C12: 0x80D6 (32982)
17:49:48.732 → C13: No data
Это что? RESET? Почему 0x1E ?
Откуда вы это все берете? В первую очередь - в ресете два байта! И ни один из них не 0x1E
Слушайте, такое впечатление, что мы с вами читаем разные даташиты… Может вы мне неверную ссылку дали?
@127486
У меня сейчас главный вопрос, который меня интересует - откуда вы берете все то, чего нет в даташите?
То что перед чтением надо послать 0x60 ? То что Reset это 0x1E ? То как читать коэфф С1 - С13 …
Не бойтесь, ответьте честно, я над вами не стебусь. Может я не вижу того, где это все написано?
Да это куча исходников отладочных накопилось за два дня, оттуда и ошибки остались не верные. Даташит один единственный, другого нету.
Я сегодня посижу, все замечания учту, поправлю скетч чтобы был один единственный.
А то своей невнимательностью в заблуждение ввожу.
Просто голова уже кругом.
А всякие 0x60, 0x1E, это если память не изменяет, сканером команды слал, на какие ответы были те и забрал видимо.
Ок.
В первую очередь внимательно перечитайте ДШ и делайте строго как там.
Глянул. Заинтересовали эти строчки:
"The MIS-3600 can provide two types of serial interfaces as SPI or I2C. The type of serial interface is defined as
the device manufactured. The user can`t choose the type of serial interface by hardware wiring. So the user have to
decide the type of serial interface as ordering the device. "
MIS-3600 может поддерживать два типа последовательных интерфейсов, таких как SPI или I2C. Тип последовательного интерфейса определяется в
зависимости от производителя устройства. Пользователь не может выбрать тип последовательного интерфейса с помощью аппаратного подключения. Таким образом, пользователь должен
выбрать тип последовательного интерфейса при заказе устройства.
А ведь может, и не поддерживать?
Оно в названии зашифровано.
Оно бы, наверно, тогда не находилось сканером?
Не нашёл в даташите
Да, но на 100% не уверен
Ну тогда вопрос снят. На какой странице эти данные?
Да, всё уже мне разъяснили. Протупил, не уделил достаточно времени поиску, поверхностно отнёсся
я только подошёл, увидел твой пост ну и скинул картинку, потом посмотрел, а там уже накидали, звиняйте