I2C Arduino ESP8266 Плохое чтение

У меня есть NodeMCU, который я программирую в среде Arduino IDE. Датчик кислорода (VOC) подключен к контактам D1 и D2, которые являются контактами SLC/SDA для NodeMCU. Они имеют подтягивающий резистор 4,3 кОм к напряжению 3,3 В.

Сначала я использовал код сканера I2C, предоставленный Arduino, и получил ответ, что датчик подключен по адресу 0x70, что является правильным адресом, указанным в техническом описании датчика.

После того, как я попытался считать значения с датчика командой 0b00001001 (которая также указана в техническом описании), я получаю только нули! Вероятно, что-то не так с кодировкой. Может быть, кто-нибудь сможет подсказать, что я делаю неправильно?

В коде я запрашиваю 100 байт, чтобы убедиться, что всё получено, но получаю только 32. В спецификации указано, что по адресу 0x9 должно быть 6 байт. Я пробовал шестнадцатеричную и десятичную формы, но это не работает. Полагаю, двоичная — правильный формат.

Мой результат:

Start 
Bytes Available: 32 
Data read: 00000000000000000000000000000000

Код:

#include <Wire.h>

int miscadr = 0b1110000;

void setup() {
  Serial.begin(115200);
  Wire.begin();
  delay(100);
}

void loop() {
  Serial.println();
  Serial.print("Start");
  Serial.println();
  Wire.beginTransmission(miscadr); //Start bit
  Wire.write(0b00001001); //Asking for registry 9
  Wire.endTransmission();
  Wire.requestFrom(miscadr, 100);
  Serial.print("Bytes Available: ");
  while(Wire.available()==0);
  Serial.print(Wire.available());
  Serial.println();
  Serial.print("Data read: ");
  while(Wire.available()!=0) {
    Serial.print(Wire.read());
  }
  Serial.println();
  delay(2000);
}

, 👍-1

Обсуждение

Проверьте, работает ли ваш датчик и реагирует ли он нормально. Вот базовый код для UNO, он немного проще, чем в библиотеке HGrabas. https://github.com/AmphenolAdvancedSensors/Telaire/tree/VOC-Sensor-VX89-TE, @NRoberts


2 ответа


0

Какой это датчик VOC? Мне самому интересно посмотреть техническое описание. Мой хрустальный шар подсказывает, что это MiCS-VZ-86/89. Если сканер I2C находит адрес 0x7, то нужно использовать 0x7. В вашем скетче miscadr теперь равен 0x70.

Билеты чтения и записи контролируются библиотекой Wire. Вы можете вывести возвращаемое значение функций Wire.endTransmission и Wire.requestFrom. Функция Wire.endTransmission возвращает ошибку, а функция Wire.requestFrom — количество прочитанных байтов. Эти возвращаемые значения позволяют определить, была ли транзакция I2C ошибочной.

Нет необходимости в цикле while для ожидания данных после Wire.requestFrom. Вы можете удалить первый оператор while.

Вы не можете запросить 100 байт. Библиотека Wire имеет буфер размером 32 байта.

Когда вы используете термин «адрес», пожалуйста, используйте «адрес i2c» или «адрес регистра».

Функция Wire.requestFrom считывает байты с ведомого устройства (датчика VOC), но датчик не может остановить транзакцию I2C после 6 байтов. Ведущее устройство (ESP8266) должно задать количество байтов для чтения. Если вам нужно всего 6 байтов, то и считывать следует только 6 байтов.

,

Большое спасибо за ответ! I2C-адрес MiCS-VZ-89TE (кстати, у вас отличный хрустальный шар!) — 0x70, а не 0x7, как я написал. Так что в этой части код был верным. Serial.print для endTransmission возвращает 0, а для requestFrom возвращает 7. Всё равно получаю от датчика только кучу нулей! Не могу понять причину. Я тоже поменял подтягивающие резисторы на 4,7 кОм, без разницы. Есть ещё предложения, что можно попробовать? Спасибо!, @Martik

Отсутствие ошибок от Wire.endTransmission означает, что вы взаимодействуете с датчиком. Запросите 6 байт и посмотрите, что произойдёт., @Jot

Я получаю только запрошенные 0, 32 байта или 6 байт.. Вот тут я и ломаю голову!, @Martik

На этой странице http://www.sgxsensortech.com/sensor-selector/#prod_4569 во вкладке «Примечания к применению» я выбрал примечание к применению I2C. В нём говорится, что нужно отправить 6 байт, а получить – 7. Для более старых версий этого датчика требуется только команда 0x09, но, согласно техническому описанию, MiCS-VZ-89TE всегда требует эти 6 байт. В руководстве по обновлению примечание к применению показано, как использовать функцию вычисления короткого CRC., @Jot

@Martik, я опоздал на вечеринку, и, возможно, ты уже исправил свою проблему. Если это поможет, я написал библиотеку для MiCS-VZ-89TE, она работает на EPS8266-01 https://github.com/HGrabas/MICS-VZ-89TE, @vrleboss


1

Если ваше устройство NodeMCU на ESP8266 не использует стандартные контакты библиотеки Arduino ESP8266 для I2C (SDA=2, SCL=14), необходимо изменить оператор Wire.begin() на Wire.begin(SDA, SCL), вставив нужные значения для контактов SDA и SCL. См. эту заметку для другого руководства по ESP (Sparkfun) Arduino ESP8266 Wire

,

Спасибо за ответ! Но это ничего не изменило. Я получил ответ от датчика, по какому адресу он находится, и другие датчики работают нормально. Значит, выходной контакт должен быть правильно настроен для I2C. Если у вас есть другие предложения, дайте мне знать! Спасибо., @Martik