Grove Base Kit Множественное соединение I2C

Я попытался подключить два модуля, которые требуют подключения I2C, и они не будут работать одновременно.

Я использовал Arduino Sensor Kit - Base. Этот комплект не нуждается в каком-либо подключении, вам просто нужно закодировать, чтобы получить желаемый результат. Я хотел отобразить значения модуля давления воздуха (BMP280) на OLED-дисплее 0,96 дюйма, однако он отказывается одновременно запускать как air pressire, так и OLED-дисплей. Он работает только с одним модулем (либо с давлением воздуха, либо с OLED) одновременно. Имеет ли это какое-то отношение к тому, как соединение I2C подключено к плате?

#include "Arduino_SensorKit.h"

void setup() {
  // put your setup code here, to run once:
  Oled.begin();
  Oled.setFlipMode(true);
  Oled.setFont(u8x8_font_7x14B_1x2_r);

  Pressure.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  Oled.clear();
  
  Oled.setCursor(0, 10);
  Oled.print("Temp: ");
  Oled.print(Pressure.readTemperature());
  Oled.print(" C");
  Oled.setCursor(0, 20);
  Oled.print("Pres: ");
  Oled.print(Pressure.readPressure());
  Oled.print(" Pa");
  Oled.setCursor(0, 30);
  Oled.print("Alti: ");
  Oled.print(Pressure.readAltitude());
  Oled.print(" m");

  delay(1000);
}

Что я сделал:

  1. Проверьте, будет ли работать давление воздуха при подключении как Air Pressure, так и OLED с помощью Serial.begin(). Теперь я знаю, что только OLED не работает, когда подключены оба модуля.
  2. Изменен порядок инициализации. Тот же результат: давление воздуха работает, но не OLED

, 👍1

Обсуждение

"он отказывается это делать" означает что? Он ничего не печатает на OLED? Он печатает вещи, но неправильно получает значения? Пожалуйста, будьте более конкретны., @Majenko

это не имеет ничего общего с тем, как соединение I2C подключено к базовому экрану. запустите скетч сканера I2C, чтобы увидеть адреса I2C устройств, @Juraj

@Majenko OLED вообще не работает. Давление воздуха работает (проверено с помощью Serial.print()), @fireblazer10

Вы проверяли давление с помощью Serial.print(), пока там был OLED-код?, @Majenko

@Juraj OLED имеет адрес 0x3C, а давление воздуха - адрес 0x77. Также смог подтвердить это на своем сайте: wiki.seeedstudio.com/I2C_And_I2C_Address_of_Seeed_Product/, @fireblazer10

@Majenko Да, я это сделал, @fireblazer10

попробуйте поменять порядок инициализации местами, @Juraj

@Juraj Все тот же вывод. OLED не будет работать:(, @fireblazer10

Возможно, это что-то простое, например: если вы напечатаете значение поплавкового давления (например, 920.2773), линия OLED может переполниться и вызвать ошибку / сброс в OLED lib. Вы пытались напечатать только одно значение без какого-либо префиксного текста? Лучше всего было бы округлить значение перед печатью ;-), @Peter Paul Kiefer

@PeterPaulKiefer Да, я пытался напечатать только букву "T" в начале цикла (инициализируются как давление воздуха, так и OLED), и OLED все еще не работает:(, @fireblazer10

Просто для моего понимания: вы пытались напечатать только букву "Т" и ничего больше после этого. Когда модуль давления инициализирован, OLED не отображает "T", а когда модуль давления не инициализирован, OLED показывает "T"., @Peter Paul Kiefer

Я заглянул в библиотеку u8g2, которая используется для OLEAD. И я нашел возможную проблему с сигнатурой конструктора этой библиотеки. Но это может быть опечатка в документации. Позже в этот день я попытаюсь найти реализацию, и если это ошибка, я сообщу об этом в соответствующих проектах. Возможно, это не ваша проблема, так как Olead не может работать, если это действительно ошибка. Но я могу найти объяснение, исследуя код., @Peter Paul Kiefer

Я также читал, что Oled lib использует высокоскоростной I2C, и это может конфликтовать с низкоскоростным давлением I2C. К сожалению, я забыл об этом упоминании. Мне придется заглянуть в код libs. ;-), @Peter Paul Kiefer

@PeterPaulKiefer, что касается скорости I2C. Только что я протестировал аналогичный OLED-клон на осциллографе на частоте 352 кГц, что указывало бы на то, что он, скорее всего, работает в быстром режиме I2C (до 400 кГц). [Техническое описание] (https://cdn-shop.adafruit.com/datasheets/BST-BMP280-DS001-11.pdf ) для BMP280 указывает на то, что он совместим со стандартным, быстрым или высокоскоростным I2C., @RowanP

@fireblazer10, Юрай предложил (20 января) запустить скетч сканера I2C, чтобы увидеть, какие устройства он может видеть на вашей шине I2C. У тебя была возможность это сделать? Примером может служить https://forum.arduino.cc/index.php?topic=197360 . Это позволит проверить адреса (и проверить информацию, которую вы нашли на веб-сайте Seeed Studio) и совместимость частот., @RowanP

@RowanP Спасибо за разъяснение и за напоминание мне о том, что я должен сделать вчера вечером. Я совсем забыл :-(. Возможности BMP280 и Oled speed могут быть одинаковыми, но поскольку Pressure lib и Oled lib оба используют Wire lib при инициализации, может возникнуть побочный эффект, если оба задают разные скорости. Это всего лишь предположение. Возможно, Проводная библиотека путается., @Peter Paul Kiefer

@RowanP Прошу прощения, я честно забыл об этом, но да, я сделал: 0x3C для OLED и 0x77 для датчика давления, @fireblazer10

@PeterPaulKiefer О, это позор :(( Думаю, мне придется ненадолго оставить этот проект. Для начала я попробую другие библиотеки OLED и посмотрю, не изменит ли это что-нибудь, @fireblazer10

@fireblazer10, спасибо за подтверждение результатов сканера I2C. Я поместил некоторые общие комментарии об отладке I2C на [другом question](https://arduinoprosto.ru/q/79775/i2c-protocol-doesnt-work-properly/81001#81001 ) ранее сегодня, что может помочь. Возможно, будет трудно добиться большего прогресса без доступа к дополнительному испытательному оборудованию., @RowanP

Я открываю проблему на github. Я думаю, что есть проблема с Oled-конструктором. https://github.com/arduino-libraries/Arduino_SensorKit/issues/15 Если я прав, то часы шины I2C сбрасывают OLED. Если давление активно, то часы I2C активны. -> сбросьте Oled. Tada. ;-), @Peter Paul Kiefer


1 ответ


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

3

Около двух недель назад в библиотеке Arduino_SensorKit произошли изменения, которые привели к ошибке с созданием экземпляра Oled-объекта.

Я нашел ошибку в выпуске (v1.0.6) библиотеки. Предыдущая версия (v1.0.5) может вызвать еще одну проблему, так как она использует программное обеспечение I2C. Я сомневаюсь, что проводные датчики подключены к правильным контактам. Но у меня нет оборудования, поэтому я не могу это проверить.

Я предлагаю обходной путь, чтобы увидеть, вызвала ли выявленная проблема ваши наблюдения.

#include "Arduino_SensorKit.h"

U8X8_SSD1306_128X64_NONAME_HW_I2C Oled2;
// если строка выше не работает
// прокомментируйте его и раскомментируйте следующую строку.
// U8X8_SSD1306_128X64_NONAME_HW_I2C Oled2(U8X8_PIN_NONE);

void setup() 
{
  Oled2.begin();
  Oled2.setFlipMode(true);
  Oled2.setFont(u8x8_font_7x14B_1x2_r);

  Pressure.begin();
}

void loop() 
{
  Oled2.clear();
  
  Oled2.setCursor(0, 10);
  Oled2.print("Temp: ");
  Oled2.print(Pressure.readTemperature());
  Oled2.print(" C");

  delay(1000);
}

Не могли бы вы попробовать и сообщить о своем опыте? Если это сработает, я могу поддержать решение этой проблемы.

,

Это работает! OLED просто продолжает мигать, но теперь он показывает результат! Мигание можно исправить, изменив Oled2.clear () на "Oled2.refreshDisplay ()". Большое вам спасибо!, @fireblazer10

Не за что. Тем временем я получил обратную связь от marqdevx. Он собирается выпустить новую версию библиотеки. Я думаю, что как только он будет доступен, этот обходной путь не понадобится. (<- не знаю, английское ли это слово. Но звучит неплохо ;-) ). Как только появится новая редакция, я отредактирую свой ответ и добавлю ваше "мигающее" решение. Ваше здоровье!, @Peter Paul Kiefer

Кстати, у меня была такая же проблема с последней версией на тот момент - 1.0.10, и это ее исправило. Я понятия не имею, что это делает, но это исправило., @davetron5000

@ davetron5000 Спасибо за этот комментарий. Я совсем забыл об этой теме. Я просто помню, что ждал нового релиза, и он продлился дольше, чем я ожидал. И тогда эта тема ускользает из моего поля зрения ;-). Я просто забыл об этом. В тот момент у меня нет времени присматривать за ним. Возможно, если я найду время в ноябре, я проверю, что случилось с исправлением. Это в моем календаре., @Peter Paul Kiefer