📖 Scenario: You want to communicate between two Arduino boards using the I2C protocol. The Wire library helps you send and receive data easily over I2C.In this project, you will set up a simple I2C master device that sends a number to a slave device.
🎯 Goal: Build a simple Arduino program that uses the Wire library to send a byte of data from a master device to a slave device over I2C.
📋 What You'll Learn
Include the Wire library
Initialize the Wire library as a master
Send a byte of data to a slave device with address 8
Print a message when data is sent
💡 Why This Matters
🌍 Real World
I2C is used to connect sensors, displays, and other devices to microcontrollers in many electronics projects.
💼 Career
Understanding I2C and the Wire library is important for embedded systems developers and hardware engineers working with microcontrollers.
Progress0 / 4 steps
1
Include the Wire library and start I2C as master
Write #include <Wire.h> at the top and in setup(), start the Wire library as a master using Wire.begin().
Arduino
Hint
Use #include <Wire.h> to include the library. Then call Wire.begin() inside setup() to start as master.
2
Create a variable for the slave address
Create a variable called slaveAddress and set it to 8 above setup().
Arduino
Hint
Use const int slaveAddress = 8; to store the slave device address.
3
Send a byte of data to the slave device
In loop(), use Wire.beginTransmission(slaveAddress), then send the byte 42 with Wire.write(42), and finally call Wire.endTransmission().
Arduino
Hint
Use Wire.beginTransmission() with the slave address, then Wire.write() to send data, and Wire.endTransmission() to finish.
4
Print a message after sending data
Add Serial.begin(9600) in setup(). After sending data in loop(), add Serial.println("Data sent") to print a confirmation message.
Arduino
Hint
Use Serial.begin(9600) in setup() and Serial.println("Data sent") after sending data to show the message.
Practice
(1/5)
1. What is the main purpose of the Wire.begin() function in Arduino's Wire library?
easy
A. To request data from a device on the I2C bus
B. To send data to a device on the I2C bus
C. To end the I2C communication
D. To initialize the I2C bus and join the I2C network
Solution
Step 1: Understand the role of Wire.begin()
The Wire.begin() function sets up the Arduino as a master or slave on the I2C bus and starts the communication.
Step 2: Differentiate from other Wire functions
Functions like Wire.beginTransmission() and Wire.requestFrom() handle sending and receiving data, not initialization.
Final Answer:
To initialize the I2C bus and join the I2C network -> Option D
Quick Check:
Wire.begin() starts I2C communication [OK]
Hint: Wire.begin() always starts I2C communication [OK]
Common Mistakes:
Confusing Wire.begin() with data sending functions
Using Wire.beginTransmission() to start communication
Thinking Wire.begin() sends or receives data
2. Which of the following is the correct syntax to start sending data to an I2C device with address 0x3C using the Wire library?
easy
A. Wire.start(0x3C);
B. Wire.beginTransmission(0x3C);
C. Wire.send(0x3C);
D. Wire.requestFrom(0x3C);
Solution
Step 1: Identify the function to start transmission
Wire.beginTransmission(address) is used to begin sending data to the device at the given address.
Step 2: Check other options for correctness
Wire.requestFrom() is for receiving data, Wire.send() is deprecated, and Wire.start() does not exist.
Final Answer:
Wire.beginTransmission(0x3C); -> Option B
Quick Check:
Use Wire.beginTransmission(address) to send data [OK]
Hint: Use Wire.beginTransmission(address) to start sending [OK]
Common Mistakes:
Using Wire.requestFrom() to send data
Using deprecated Wire.send() instead of Wire.write()
Trying to use non-existent Wire.start() function
3. What will be the output of the following Arduino code snippet using the Wire library?
Wire.begin();
Wire.beginTransmission(0x50);
Wire.write(0x01);
Wire.endTransmission();
Wire.requestFrom(0x50, 1);
int data = Wire.read();
Serial.println(data);
medium
A. Prints the byte received from device at 0x50
B. Prints the byte 0x01
C. Prints 0 because Wire.read() returns 0 by default
D. Compilation error due to missing Wire.read()
Solution
Step 1: Analyze the code flow
The code initializes I2C, sends one byte (0x01) to device 0x50, then requests 1 byte back from the same device.
Step 2: Understand Wire.read() behavior
Wire.read() reads the byte received from the device. It does not return the sent byte but the device's response.
Final Answer:
Prints the byte received from device at 0x50 -> Option A
Quick Check:
Wire.read() returns received data, not sent data [OK]
Hint: Wire.read() reads incoming data, not what was sent [OK]
Common Mistakes:
Assuming Wire.read() returns the sent byte
Thinking Wire.read() returns 0 by default
Confusing Wire.write() and Wire.read() roles
4. Identify the error in this Arduino I2C code snippet:
Wire.begin();
Wire.beginTransmission(0x40);
Wire.write(0x10);
Wire.requestFrom(0x40, 1);
Wire.endTransmission();
int val = Wire.read();
medium
A. Calling Wire.requestFrom() before Wire.endTransmission()
B. Missing Wire.beginTransmission() before Wire.write()
C. Using Wire.read() without requesting data
D. Not calling Wire.begin() to start I2C
Solution
Step 1: Check the order of I2C functions
Wire.endTransmission() must be called to end sending data before requesting data with Wire.requestFrom().
Step 2: Identify the incorrect sequence
The code calls Wire.requestFrom() before Wire.endTransmission(), which is incorrect and causes communication errors.
Final Answer:
Calling Wire.requestFrom() before Wire.endTransmission() -> Option A
Quick Check:
End transmission before requesting data [OK]
Hint: Always call Wire.endTransmission() before Wire.requestFrom() [OK]
Common Mistakes:
Swapping the order of endTransmission and requestFrom
Forgetting to call endTransmission() after beginTransmission()
Calling Wire.read() without data available
5. You want to read 3 bytes from an I2C sensor at address 0x68 and store them in an array. Which code snippet correctly does this using the Wire library?
hard
A. Wire.beginTransmission(0x68);
for (int i = 0; i < 3; i++) {
data[i] = Wire.read();
}
Wire.endTransmission();
B. Wire.beginTransmission(0x68);
Wire.requestFrom(0x68, 3);
for (int i = 0; i < 3; i++) {
data[i] = Wire.read();
}
Wire.endTransmission();
C. Wire.requestFrom(0x68, 3);
for (int i = 0; i < 3; i++) {
data[i] = Wire.read();
}
D. Wire.requestFrom(0x68, 3);
Wire.endTransmission();
for (int i = 0; i < 3; i++) {
data[i] = Wire.read();
}
Solution
Step 1: Understand how to receive data with Wire.requestFrom()
Wire.requestFrom(address, quantity) requests bytes from the device. Then Wire.read() reads each byte.
Step 2: Check the correct sequence for reading data
Only Wire.requestFrom() is needed to receive data. Wire.beginTransmission() and Wire.endTransmission() are for sending data, not receiving.
Final Answer:
Wire.requestFrom(0x68, 3);
for (int i = 0; i < 3; i++) {
data[i] = Wire.read();
} -> Option C
Quick Check:
Use requestFrom() then read() in loop to get bytes [OK]
Hint: Use requestFrom() then read() in loop to get bytes [OK]
Common Mistakes:
Using beginTransmission() when only reading data
Calling endTransmission() after requestFrom()
Reading data before requesting it
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.