Выбор адреса i2c

Добрый день, собираю радио приёмник на модуле RDA5807 и OLED дисплее SSD1306. Возникла проблема в скетче. Модуль fm и дисплей работают по шине I2C, адрес у fm модуля (0x10), у экрана (0x3C). Для работы с дисплеем я использую библиотеку OLED_I2C.h (поскольку она проста в использовании, и в ней очень красивые шрифты). Но возник вопрос как в этой библиотеке указать адрес I2C дисплея. Поскольку если его не указывать дисплей не запускается . Тестовый скетч:

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
RADIO_FREQ preset[] = {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
char* STATION_NAME[]={"ENERGY", "RADIO DACH", "VESTI FM", "RUSSIA FM", "LOVE RADIO",
"DETSKOE", "DOROJNOE", "RETRO FM", "RUSSIAN HIT", "RECORD", "RUSSKOE", "EVROPA PLUS",
"HIT FM", "MAYAK FM","NEW RADIO","AVTORADIO","VANYA","START FM","HUMOR FM","MILICEYSKAY","DFM","RADIO MIR","MONTE CARLO"};

uint8_t i_sidx = 0;
RDA5807M radio; 
uint8_t v = 5;
uint8_t prog=1;
#include <OLED_I2C.h>

 OLED  myOLED(SDA, SCL);
 extern uint8_t SmallFont[];
 extern uint8_t MediumNumbers[];
 extern uint8_t BigNumbers[];
void setup() {
 myOLED.begin(); 
 pinMode(A2, INPUT_PULLUP); 
 pinMode(A1, INPUT_PULLUP); 

 radio.init();
 radio.debugEnable();
 radio.setBandFrequency(RADIO_BAND_FM, preset[i_sidx]); // и без него 
 radio.setMono(false);
 radio.setMute(false);
 radio.setVolume(5);   
}
void loop() {
boolean CANAL_UPP = !digitalRead(A2);
boolean CANAL_DOWNN = !digitalRead(A1);
 // Переключение каналов
if (digitalRead(CANAL_UPP) == 1) {
   // next preset
   if (i_sidx < (sizeof(preset) / sizeof(RADIO_FREQ)) - 1) {
     i_sidx++; radio.setFrequency(preset[i_sidx]);STATION_NAME[i_sidx];     
     delay(500);
   }
 } else if (digitalRead(CANAL_DOWNN) == 1) {
   if (i_sidx > 0) {
     i_sidx--;
     radio.setFrequency(preset[i_sidx]);    
     delay(500);
   } 
 }  
myOLED.setFont(SmallFont);
myOLED.print((STATION_NAME[i_sidx]), CENTER, 40);
myOLED.update();
myOLED.clrScr();
} 
String utf8rus(String source)
{
 int i,k;
 String target;
 unsigned char n;
 char m[2] = { '0', '\0' };

 k = source.length(); i = 0;

 while (i < k) {
   n = source[i]; i++;

   if (n >= 0xC0) {
     switch (n) {
       case 0xD0: {
         n = source[i]; i++;
         if (n == 0x81) { n = 0xA8; break; }
         if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
         break;
       }
       case 0xD1: {
         n = source[i]; i++;
         if (n == 0x91) { n = 0xB8; break; }
         if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
         break;
       }
     }
   }
   m[0] = n; target = target + String(m);
 }
return target;
} 

Как вы думаете, сколько библиотек с таким названием существует?

ссылка на библиотеку

там явно указан адрес

#define SSD1306_ADDR		0x3C

в чем проблема?

В чем прикол если примеры этой библиотеки запустить отдельно то экран прекрасно работает. А если подключить библиотеку для работы с модулем fm экран гаснет и ничего не отображается.

А вообще странненько - библиотеку от ринки-динки скачивать с левого сайта, да ещё и устаревшую.

вставлял эту строчку ничего не происходит

Куда вставляли? Гусары молчать!.

1 лайк

не надо ничего вставлять, она уже там.
Вам просто показывают, что ваша библиотека уже настроена на адрес 0x3C и отдельно его указывать не надо.
Если у вас не работает - ищите другие причины.

*в скетч

То что вы ее вставляли в скетч, говорит только о том, что вы не очень опытный программист и не понимаете, как работает код…

Если отдельно запускать модуль Fm (без библиотеки oled_i2c) модуль запускается. А если отдельно экран без fm модуля, экран работает. Замкнутый круг какой-то.

можете обьяснить, что вы делаете в этих строчках?

2 лайка

что там с подтяжкой I2C на модулях?
хотя, я так понимаю, для вас это темный лес.

1 лайк

Выводил названия станций на экран

а в последней строчке?

Очищал экран

:+1: :sweat_smile: :rofl:

и что, никаких мыслей?
Вы выводите надпись на экран и спустя несколько десятых секунды стираете - как вы думаете, будет что-то на экране или нет?

1 лайк

Не подсказывай.

1 лайк