Авто определение I2C

zDimaBY
Offline
Зарегистрирован: 10.06.2018


  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
if (error == 0)
  {
  String stringOne =  String(address, HEX);
  Serial.print("0x");     Serial.print(stringOne); Serial.print(" - ");
    if(stringOne=="3C") Serial.println("'OLED 3C'");
    if(stringOne=="3D") Serial.println("'OLED 3D'");
   nDevices++;
  }
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");       
  }

Как сделать определение экрана только 1 раз чтобы когда экран подключили выполнялася команда myOLED.begin(); 1 раз

    if(stringOne=="3C") Serial.println("'OLED 3C'");
    if(stringOne=="3D") Serial.println("'OLED 3D'"); - определяет когда экран включен 

 

rkit
Offline
Зарегистрирован: 23.11.2016

i2c шина не предназначена для горячего включения.

zDimaBY
Offline
Зарегистрирован: 10.06.2018

rkit пишет:

i2c шина не предназначена для горячего включения.

Но всеже можно это сделать.. Делал 2 экрана ssd1306 с указанием пинов SCL SDA для каждого так они сами определяюся, а через адрес 0x3C, 0x3D нет.. нужно выполнить meOLED.begin в цикле 1 раз

zDimaBY
Offline
Зарегистрирован: 10.06.2018

Думал не додумаюсь... сам сделал автоопридиление все работает.

  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 55; address < 65; address++ ) 
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
if (error == 0)
  {
  String stringOne =  String(address, HEX);
  Serial.print("0x");     Serial.print(stringOne); Serial.print(" - ");
    if(stringOne=="3c") Serial.println("'OLED 3C'");
    if(stringOne=="3d") Serial.println("'OLED 3D'");
   nDevices++;
   flag=stringOne+flag;
  } 
    else if (error==4) 
    {
      Serial.print("Unknow error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else if (flag1<=1){
    myOLED.begin();
    myOLED2.begin();
  }
  if (flag!="3d3c"){ // Опридиляет все ли подключено.
    flag1=0;
  }
  else{
    flag1++;
  }
  if (flag1>=5){
    flag1=5;
  }
  Serial.println(flag);
  Serial.println(flag1);
  flag="";
    Serial.println("done\n");       
  }