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);
}
Что я сделал:
- Проверьте, будет ли работать давление воздуха при подключении как Air Pressure, так и OLED с помощью
Serial.begin()
. Теперь я знаю, что только OLED не работает, когда подключены оба модуля. - Изменен порядок инициализации. Тот же результат: давление воздуха работает, но не OLED
@fireblazer10, 👍1
Обсуждение1 ответ
Лучший ответ:
Около двух недель назад в библиотеке 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
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- OVF в последовательном мониторе вместо данных
- ЖК-дисплей I2C отображает странные символы
- Соединение I2C зависает Ведущий если ведомый отключается
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
"он отказывается это делать" означает что? Он ничего не печатает на 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