Мультиплексор tca9548

Roman1984
Offline
Зарегистрирован: 17.02.2017

Добрый день. Помогите решить задачу. Бьюсь уже второй день. Суть такова. Есть мультиплексор  tca9548, к которому подключены 3 oled-дисплея 128х32. Использую 3 канала 0, 1 и 7. Проблема в том, что при инициализации двух дисплеев всё работает нормально, но как только добавляю инициализацию третьего дисплея - всё перестаёт работать и изображения пропадают вообще. Причём дисплеи и каналы меняю местами - результат тот же 2 канала работают, а при инициализации третьего - всё пропадает. Ниже приведён участок кода. Может кто сталкивался с подобной проблемой? На каждом канале стоит подтяжка по 10кОм на SCL и SDA. Провода не более 10см.

#include <Wire.h>
#include <OLED_I2C.h>
OLED  myOLED(SDA, SCL);

extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];
//extern uint8_t BigNumbers[];

/* ---------- ФУНКЦИЯ ВЫБОРА КАНАЛА НА I2C-МУЛЬТИПЛЕКСОРЕ ---------- */
void tcaselect(uint8_t i2c_bus) {
  if (i2c_bus > 7) return;
  Wire.beginTransmission(0x70);
  Wire.write(1 << i2c_bus);
  Wire.endTransmission();
}

void setup() {
  Wire.begin();
  
  tcaselect(0); // выбираю первый дисплей
  myOLED.begin(SSD1306_128X32);
  myOLED.setFont(SmallFont);
  myOLED.clrScr();
  delay(250);
  
  tcaselect(1); // выбираю второй дисплей
  myOLED.begin(SSD1306_128X32);
  myOLED.setFont(SmallFont);
  myOLED.clrScr();
  delay(250);
  
  tcaselect(display3); // выбираю третий дисплей

  // Если закомментировать строку ниже, то 2 экрана работают
  // а если нет, то не работает ничего вообще!!!!!!!!!!!!
  //myOLED.begin(SSD1306_128X32);

  myOLED.setFont(SmallFont);
  myOLED.clrScr();
  delay(250);

  intro(); // Вывод приветствия на 3-х экранах
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Олед бегин отедает память. Посмотрите по скольку отедает и сколько остается после двух инициализаций. На форуме были темы по процедурам слежения за памятью.

Logik
Offline
Зарегистрирован: 05.08.2014

display3 не обявлена

Roman1984
Offline
Зарегистрирован: 17.02.2017

display3 равен 7, просто вырезал кусок из скетча. Насчёт памяти тоже думал, но после 2-х экранов памяти занято только 25%. К тому же процедура инициализации проходит физически один раз, но только на разные каналы. Если бы я создал 3 экземпляра класса, то да - память играла бы роль.

Logik
Offline
Зарегистрирован: 05.08.2014

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

1. В строке 32 явно задать 7 и проверить. 

2. проверить контакты канала 7.

3. попробовать другой канал.

 

Roman1984
Offline
Зарегистрирован: 17.02.2017

Явно задавал 7. Контакты уже прозванивал от безвыходности. Канал не играет роли переключал и менял местами. Любых два канала работают, а как только инициализирую третий - настает кирдык. Если выключить инициализацию 2-го дисплея и включить 3-го, то будут работать дисплеи 1 и 3. Но все вместе, хоть убей не работают.

Logik
Offline
Зарегистрирован: 05.08.2014

Питания мало?

 

Roman1984
Offline
Зарегистрирован: 17.02.2017

Просадки нет. На всех экранах по 5в, хотя питаю от Arduino. Попробую записать отдельно и отпишусь. Может в момент старта идёт просадки, хотя и задержки ставил и ёмкость.

Roman1984
Offline
Зарегистрирован: 17.02.2017

Нет. Отдельное питание тоже не помогло.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

поменяйте тогда на плату с большей памятью.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Roman1984 пишет:
после 2-х экранов памяти занято только 25%.
Как Вы это измеряли?

Roman1984
Offline
Зарегистрирован: 17.02.2017

Компилятор подитожил

Logik
Offline
Зарегистрирован: 05.08.2014

А что за библиотека то? Если фруктовый ад, то в новых они в каждом бегине стали распределять память на буфер, а освобождают только в деструкторе. Потому может и памяти не хватать. А если OLED_I2C то там один буфер в обекте.

Компилятор динамическую не знает и не покажет!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Roman1984 пишет:
Компилятор подитожил

А причём тут компилятор? Она вполне может динамически запрашиваться.

возьмите вот в этой теме программу memory Explorer (там есть примеры использования) и с её помощью последите за памятью. Может чего интересного увидите. А нет - тогда будем дальше думать.

Roman1984
Offline
Зарегистрирован: 17.02.2017

Проблема решена переходом на библиотеку Adafruit_SSD1306. Три дисплея работают через мультиплексор вообще без каких-либо сбоев. Скетч довольно увесистый, но с памятью проблем нет.

Romeshik
Offline
Зарегистрирован: 19.01.2020

А можно пример скетча?

Ребят не могу вьехать в этот мультиплексор.

Есть хотелка, поставить в каждой комнате температурный датчик BME280 и подключить на ардуино, они все с одинаковыми адресами. Как раз все под силу мультиплексору TCA9548A, но!

Перерыл кучу скетчей, по отдельности датчики работают, не могу сообразить как их опрашивать через тса :((

Пытаюсь сейчас собрать все скетчи что используют ТСА и вывести для себя логику функции перебора порта ТСА и опроса адтчика, я начинающий ардуинщик, просьба не пинать, а помочь(

В идеале скетч для работы с 5 датчиками БМЕ через ТСА

Romeshik
Offline
Зарегистрирован: 19.01.2020

Вот мой пример скетча для BME, он опрашивает датчик и норм выводит инфу с него. Что и где добавить чтобы подключить 2-3...5 датчиков? Уже мозги кипят((


#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
 
unsigned long delayTime;
 
void setup() {
    
    Serial.begin(9600);
   
    bool status;
    // default settings
    status = bme.begin();
  
    Serial.println("Temperature");
    delayTime = 2000;
    Serial.println();
    delay(100); // let sensor boot up
}

void loop() { 
    printValues();
    delay(delayTime);
}

void printValues() {
    Serial.print(bme.readTemperature());
    Serial.println();
}
sadman41
Offline
Зарегистрирован: 19.10.2016

Зачем BME, если есть DS18B20?

Romeshik
Offline
Зарегистрирован: 19.01.2020

sadman41 пишет:
Зачем BME, если есть DS18B20?

Ну так уж сложилось что я их купил 6шт, да и влажность интерессна, ванная, кухня, чтобы автоматизировать включение вытяжек. Проектирую умный дом себе, проводов заложил в стены, в плинтусы, вобщем везде) осталось только до ума довести)

b707
Offline
Зарегистрирован: 26.05.2017

Romeshik пишет:

А можно пример скетча?

Ребят не могу вьехать в этот мультиплексор.

Перерыл кучу скетчей, по отдельности датчики работают, не могу сообразить как их опрашивать через тса :((

Боин, ну чтож такой ленивый то? Даже в Гугле поискать не можешь?

Вот тебе пример скетча ИМЕННО датчики BME через мультиплексор!

https://www.bluedot.space/tutorials/connect-multiple-sensors-using-i2c-multiplexer/

Romeshik
Offline
Зарегистрирован: 19.01.2020

Как!?!? Как вы его нашли?! я реально с ноября пинаю эту тему, в английском не очень, ютубы шурстил, форумы шурстил, чессно слово не вру! Этот сайт не попадался на глаза! У меня на столе 10 листов с разнымы скетчами использования ТСА но не с датчиками температур, везде подчеркнуто использование ТСА, выводил общеее чтобы применить его к БМЕ! Спасибо добрый человек, надеюсь сейчас слеплю в кучу. Надо было сразу на форум)

b707
Offline
Зарегистрирован: 26.05.2017

Romeshik пишет:

Как!?!? Как вы его нашли?! я реально с ноября пинаю эту тему, в английском не очень, ютубы шурстил, форумы шурстил, чессно слово не вру!

5 минут не искал, третья ссылка в гугле...

sadman41
Offline
Зарегистрирован: 19.10.2016

Даже если BME есть целый мешок, вешать их на длинный провод - идея не из лучших.

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

b707 пишет:

Romeshik пишет:

Как!?!? Как вы его нашли?! я реально с ноября пинаю эту тему, в английском не очень, ютубы шурстил, форумы шурстил, чессно слово не вру!

5 минут не искал, третья ссылка в гугле...

Гугл - он хитрый.

Он выдает разные результаты разным пользователям. В зависимости от предыдущих запросов.