I am working on a project and I need to use I2C, however, I have never used it before and I can't get it to work.
I connected the pins as follows:
VCC - 5V (also tried 3.3V, didn't work either)
GND - GND
SDA - A4
SCL - A5
Here are the circuits I tried, none of them worked
I tried 3 different arduino's (2 nano clones with an old 328P bootloader and 1 uno), 4 different I2C devices (2 0.96inch OLED screens and 2 magnetometers) and lots of different cables.
If I run an I2C scanner, it only outputs "No I2C devices found". I probably made a very simple or stupid mistake, but I can't find out what it is.
This is the code I used for the I2C scanner:
// --------------------------------------
// 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(9600);
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("Unknown 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
}
I have tried anything I could think of and I can't find anything online, hope someone can help me with this!
Thanks for the quick reaction!
No I didn't, I'm gonna try it.
Where should I place them? Online I found 1500 ohm resistors, is that good? What would you recommend?
The pullups go from SDA to Vcc and SCL to Vcc. 4.7K is the usual value for the pullups. If the devices that you are connecting the Uno to are 3.3V devices, you will need level shifters on the I2C lines.
I tried using resistors, but I still get 'No I2C devices found'
In the picture below I used two 4.7K ohm pull up resistors. One for Vcc to SCL and one for Vcc to SDA.
I really don't know what to do now, it looks like everything is connected properly, but I don't get any signal at all. I also tried using only one of the resistors, that didn't word either...
I'm clueless, hope someone out there knows what to do.
#include<Wire.h>
void setup()
{
Serial.begin(9600);
Wire.begin();
//--------------------
Wire.beginTransmission(0x45); //NANO address: 1000101b
byte status = Wire.endTransmission();
if(status !=0)
{
Serial.print("NANO is not found on I2C Bus at address 1000101b.");
while(1); //wait for ever
}
Serial.println("NANO is found on the I2C Bus.");
}
void loop()
{
}
if you get no results on multiple devices it must be something in common to all the devices. or, a massive set of coincidences.
if the modules have power LEDs, and the LEDs light up, you got ground and VCC right.
leaving two possibilities: SDA & SCL poor connection at a common point, or leads swapped.
(and please use different colors for SDA/SCL!!!)
ribbon cables and Arduino jumpers typically use the ten colors of the old resistor color code. this puts violet and gray side by side.