Проблема с коммутационной платой Sparkfun ISL29125 с Arduino IDE с ESP32

Я работаю над проектом, в котором мне нужно получить значение освещенности RGB на основе окружающего освещения.

Для этого я использую ESP32 с коммутационной платой Sparkfun ISL29125. Я пытался сканировать адреса доступных/подключенных устройств I2C. На выходе я получаю адрес 0x44, который является адресом ISL29125.

Но при запуске следующего кода я не получаю никаких результатов. Я добавил библиотеку в Arduino IDE.

Я проверил все проводные соединения. Еще 2 датчика подключены к шине I2C.

Я соединил контакты следующим образом:

GPIO21 (ESP32) -> ПДД (ISL29125) GPIO22(ESP32) -> SCL (ISL29125).

Я подаю 3,3 В и GND от ESP32.

Я просканировал шину I2C и получил адреса всех подключенных датчиков, включая ISL29125.

  • 0X38
  • 0X44 (адрес ISL29125)
  • 0X47

Ниже приведен исходный код.

#include <Wire.h>
#include <SparkFunISL29125.h>
SFE_ISL29125 RGB_sensor;
void setup() {
  // Инициализируем последовательную связь
  Serial.begin(115200);
  Serial.println("Hello123");
  // Инициализируем ISL29125 с простой конфигурацией, чтобы он начал выборку
  if (!RGB_sensor.init()) {
    Serial.println("Sensor Initialization Problem\n\r");
  }
}

void loop() {
  Serial.println("Hello");
  // Чтение значений датчика (16-битные целые числа)
  unsigned int red = RGB_sensor.readRed();
  unsigned int green = RGB_sensor.readGreen();
  unsigned int blue = RGB_sensor.readBlue();
  
  // Распечатываем показания, изменяем HEX на DEC, если вы предпочитаете десятичный вывод
  Serial.print("Red: "); Serial.println(red,HEX);
  Serial.print("Green: "); Serial.println(green,HEX);
  Serial.print("Blue: "); Serial.println(blue,HEX);
  Serial.println();
  delay(2000);
}

Вот что я получаю

[     4][D][esp32-hal-cpu.c:244] setCpuFrequencyMhz(): PLL: 480 / 2 = 240 Mhz, APB: 80000000 Hz
Hello123
[    21][I][esp32-hal-i2c.c:75] i2cInit(): Initialising I2C Master: sda=21 scl=22 freq=100000

Я не получаю значения RGB, или код застревает в методе init(). Может ли кто-нибудь помочь мне? В чем может быть проблема? В чем моя ошибка?

, 👍2

Обсуждение

пожалуйста, удалите изображения текста... замените их текстом... отформатируйте как код для удобства чтения... это должно остановить отрицательные голоса, потому что ваш вопрос будет доступен для чтения всем, а не только людям с хорошим зрением, @jsotola

Код представляет собой слегка инструментированный [стандартный пример](https://github.com/sparkfun/SparkFun_ISL29125_Breakout_Arduino_Library/blob/V_1.0.1/examples/ISL29125Basics/ISL29125Basics.ino). Если вы хотите быть более уверенным в том, где вы зависаете, лучше всего использовать .flush() после сообщения о том, что вы пришли. В противном случае вы можете успешно поставить сообщение в очередь, но зависнуть до того, как сообщение действительно будет передано через оборудование. По крайней мере, есть небольшой шанс, что показ вашей проводки поможет. При разумных предположениях о том, что вы не показываете, то, что вы показываете, выглядит нормально. Итак, покажите больше., @timemage

@jsotola, вы можете щелкнуть изображение, чтобы увеличить/более читаемый текст. Хотя все равно отстой по сравнению с реальным текстом..., @dandavis

@jsotola спасибо за вклад. Я исправил вопрос., @Nikunj Vadher

@timemage Я перепроверил проводку, все в порядке. в противном случае адрес не должен отображаться. Я подключил контакты следующим образом: GPIO21 (ESP32) -> SDA (ISL29125), GPIO22 (ESP32) -> SCL (ISL29125). Подача 3,3 В и GND от ESP32., @Nikunj Vadher

@dandavis люди с нарушениями зрения используют программы чтения с экрана для доступа к содержимому веб-страницы... содержимое изображений не может быть прочитано программой чтения с экрана, @jsotola

@NikunjVadher я удалил свой отрицательный голос и проголосовал за твой пост за хорошо поставленный вопрос, @jsotola


1 ответ


Лучший ответ:

1

Файл библиотеки "SparkFunISL29125.cpp" содержит это: Wire.begin(); и я думаю, вы хотите, чтобы он содержал Wire.begin(21,22), судя по тому, что вы сказали в более позднем комментарии. Лучше всего было бы закомментировать Wire.begin(); в библиотеке и поместить исправленную версию в свой скетч. В такой ситуации я бы предложил скопировать файлы библиотеки .cpp и .h в папку скетча. Вам также необходимо изменить это в скетче: #include <SparkFunISL29125.h> на #include "SparkFunISL29125.h" для обращения к локальной копии.

Кроме того, схема коммутационной платы SparkFun ILS29125 показывает, что встроенные подтягивающие резисторы I2C подключаются через перемычку, которая по умолчанию не перемыкается. Судя по всему, вы выполнили тест сканирования I2C с двумя другими подключенными устройствами и, возможно, «принесли пользу»; от их подтягивающих резисторов I2C. Если вы проводили тестирование только с ILS29125, возможно, в схеме не было подтягивающих резисторов I2C.

schematic

,

*"через перемычку, которая по умолчанию не соединена перемычкой"* Вы можете видеть незамаскированный медный шлейф, проходящий между контактными площадками, как будто вы можете видеть, как они оставляют каждую контактную площадку слева. Если вы поиграете с яркостью/контрастом, то под маской увидите сам след. Язык в руководстве по подключению модуля Sparkfun подтверждает, что по умолчанию они являются мостом; колодки на самом деле предназначены для его повторного подключения. Я удивлен, что указание номеров контактов вручную что-то дало, потому что список вывода (и исходный код варианта провода/платы) указывает, что он уже использует эти контакты Инициализация мастера I2C: sda=21 scl=22., @timemage

@timemage Я добавил схему, на которой показана открытая перемычка припоя по умолчанию. Конечно, не исключено, что они просто использовали неправильный след. Детали на изображении платы недостаточно ясны, чтобы сделать какой-либо вывод. Симптомы зависания, как правило, указывают на проблему с подтягивающим резистором. Возможно, ОП вернется и скажет что-то еще., @6v6gt

https://imgur.com/a/VxQZkk1 Слева — вид файла Eagle brd. Справа — исходное изображение, только что отрегулированное по контрасту и яркости, повернутое и зеркальное (это нижний слой файла Eagle). В руководстве по подключению говорится: * «Если вы хотите отключить встроенные подтягивающие резисторы I2C сопротивлением 10 кОм — в случае, если вы хотите использовать встроенные в ваш микроконтроллер или другие внешние подтягивающие резисторы — просто обрежьте две дорожки между тремя контактами на задней стороне платы. Если вы решите, что вам понадобятся подтяжки позже, вы всегда можете припаять площадки обратно вместе."*, @timemage

Больше для будущих читателей, чем что-либо еще. ОП уже принял. Это все, что я исследовал, прежде чем оставить первоначальный комментарий. Вот почему мне удивительно, что их проблема решена. В любом случае, возможно, они такие, как показано на схеме. Но я в это не верю. Как бы то ни было, на схемах UNO также показано разрезаемое соединение RESET так же, как и открытое, даже если на поставляемой плате оно закрыто., @timemage

@timemage Это, конечно, загадка. Из того, что вы обнаружили, действительно следует, что на схеме использовался просто вводящий в заблуждение символ. Возможно, у Eagle нет или не было схематического обозначения нормально замкнутой перемычки. Итак, дизайнер платы также работает с открытой перемычкой, а затем прокладывает через нее дорожку. Также вероятно, что на конкретном устройстве, используемом ОП, все закрытые перемычки под пайку уже были обрезаны по причинам, указанным в указанном вами руководстве. Если ОП не вернется, мы можем только догадываться., @6v6gt