Tag Archives: I2C scanner

Arduino I2C Scanner

What is the I2C address?! Scanner please.

Do I need such scanner? Sooner or later, everyone stuck on some I2C device – unknown address. For example, on OLED display, there is jumper (SMD resistor with “000” – zero Ohms), and next to it: “IIC address eslect”, and two options, soldered at first one: 0x78, and can be selected another one by removing this resistor and soldering at second place: 0x7A. But, after opening example code for this OLED display, it does not works. Why?! Because it has address of 0x3C, not 0x78 as it is designated. So, here is simple sketch I found somewhere. Well known and simple sketch, but very useful:

// --------------------------------------
//    i2c_scanner
//
//    Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
//    Version 2, Juni 2012, Using Arduino 1.0.1
//    Adapted to be as simple as possible by Arduino.cc user Krodal
//    Version 3, Feb 26  2013
//    V3 by louarnold
//    Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
//    Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
//    Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
//    This sketch tests the standard 7-bit addresses
//    Devices with higher bit address might not be seen properly.
//
 
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(115200);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      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");
 
  delay(5000);           // wait 5 seconds for next scan
}

You may use :

Serial.begin(9600);
// instead
Serial.begin(115200); 
// it is up to you which speed you will use for serial

Most of the default examples uses 9600 bits per second, but sometimes I need it faster, so I made it “115200”.  If you have problem with your serial port (USB cable to your Arduino), then lower speed, it is up to you. Just be sure to select the same speed at Serial Monitor, bottom right corner. Else it will not work.

Wiring

Instead making wiring diagram, I will just tell you that SCL and SDA of the device in question goes to SCL and SDA on your favorite  Arduino board.  Usually with numbers 4 and 5; SCL (serial clock) to pin A5 (or ADC5, or pin number 28), and SDA (seral data) to pin A4 (or ADC4, or pin number 27). Do not forget to power your device with appropriate voltage and connect ground wire. Usually it is 5V, but there may be exceptions.

It will give you info every five seconds, something like this: