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);
}
@Martik, 👍-1
Обсуждение2 ответа
Какой это датчик 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
Если ваше устройство NodeMCU на ESP8266 не использует стандартные контакты библиотеки Arduino ESP8266 для I2C (SDA=2, SCL=14), необходимо изменить оператор Wire.begin() на Wire.begin(SDA, SCL), вставив нужные значения для контактов SDA и SCL. См. эту заметку для другого руководства по ESP (Sparkfun) Arduino ESP8266 Wire
Спасибо за ответ! Но это ничего не изменило. Я получил ответ от датчика, по какому адресу он находится, и другие датчики работают нормально. Значит, выходной контакт должен быть правильно настроен для I2C. Если у вас есть другие предложения, дайте мне знать! Спасибо., @Martik
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- esp8266-01 и Arduino UNO обмен данными через i2c
- ADS1115: измерение напряжения 5 В и питание от 3,3 В
- Варианты протокола для обмена данными между Arduino и ESP8266
- Использование SCL и SDA ESP8266-01 с GY-30 BH1750FVI для измерения люксов
- Отправка значений из arduino uno в wemos d1 r1
- HD44780 отображает неправильно черный на синем вместо белого на синем
- Соединение i2c для MCP4725 (Dac) с Esp8266 wemos d1 mini
Проверьте, работает ли ваш датчик и реагирует ли он нормально. Вот базовый код для UNO, он немного проще, чем в библиотеке HGrabas. https://github.com/AmphenolAdvancedSensors/Telaire/tree/VOC-Sensor-VX89-TE, @NRoberts