An I2C scanner sketch helps find the addresses of devices connected to the I2C bus by checking all possible addresses and reporting which ones respond.
Click to reveal answer
beginner
Which Arduino library is commonly used for I2C communication in an I2C scanner sketch?
The Wire library is used for I2C communication in Arduino sketches, including I2C scanners.
Click to reveal answer
intermediate
In an I2C scanner sketch, what does the function Wire.beginTransmission(address) do?
It starts communication with the device at the given I2C address to check if it responds.
Click to reveal answer
intermediate
Why do we use Wire.endTransmission() in the I2C scanner sketch?
Wire.endTransmission() ends the transmission and returns a status code indicating if a device acknowledged the address.
Click to reveal answer
beginner
What range of addresses does the I2C scanner usually check?
It checks addresses from 1 to 127 because 0 is reserved and 7-bit addressing uses 7 bits for addresses.
Click to reveal answer
What does an I2C scanner sketch do?
AFinds all devices connected on the I2C bus
BSends data to all I2C devices
CResets the I2C bus
DChanges I2C device addresses
✗ Incorrect
An I2C scanner checks all possible addresses and reports which devices respond.
Which Arduino library is essential for I2C communication?
ASPI
BWire
CServo
DEthernet
✗ Incorrect
The Wire library is used for I2C communication on Arduino.
What does Wire.endTransmission() return if a device acknowledges the address?
A2
B1
C0
D3
✗ Incorrect
A return value of 0 means the device acknowledged the address.
What address range is scanned in a typical I2C scanner sketch?
A0 to 255
B0 to 127
C1 to 255
D1 to 127
✗ Incorrect
Addresses 1 to 127 are scanned because 0 is reserved.
Why is address 0 usually skipped in I2C scanning?
AIt is reserved for general call
BIt is invalid
CIt is used for SPI devices
DIt is the broadcast address
✗ Incorrect
Address 0 is reserved for the general call address in I2C.
Explain how an I2C scanner sketch works to find connected devices.
Think about how the sketch tries each address and listens for a response.
You got /5 concepts.
Describe why the Wire library is important in writing an I2C scanner sketch.
Focus on the functions that help communicate with I2C devices.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of an I2C scanner sketch in Arduino programming?
easy
A. To reset the Arduino board automatically
B. To detect and list all devices connected on the I2C bus
C. To send data to all I2C devices simultaneously
D. To measure voltage levels on the I2C pins
Solution
Step 1: Understand the role of I2C scanner
An I2C scanner checks each possible address on the I2C bus to find connected devices.
Step 2: Identify the main function
The main function is to detect and list all devices so you know which addresses are in use.
Final Answer:
To detect and list all devices connected on the I2C bus -> Option B
Quick Check:
I2C scanner = device finder [OK]
Hint: I2C scanner finds devices by checking addresses [OK]
Common Mistakes:
Thinking it sends data to devices
Confusing it with board reset functions
Assuming it measures electrical signals
2. Which of the following is the correct way to start the I2C communication in an Arduino I2C scanner sketch?
easy
A. Wire.begin();
B. Wire.start();
C. Wire.init();
D. Wire.connect();
Solution
Step 1: Recall the Wire library initialization
The Wire library uses Wire.begin(); to start I2C communication.
Step 2: Check other options
Functions like Wire.start();, Wire.init();, and Wire.connect(); do not exist in the Wire library.
Final Answer:
Wire.begin(); -> Option A
Quick Check:
Start I2C with Wire.begin() [OK]
Hint: Use Wire.begin() to start I2C communication [OK]
Common Mistakes:
Using non-existent Wire functions
Confusing with other library methods
Omitting Wire.begin() causing no communication
3. Consider this snippet from an I2C scanner sketch:
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("Device found at 0x");
Serial.println(address, HEX);
}
}
What will this code print if devices are found at addresses 8 and 42?
medium
A. Device found at 0x8\nDevice found at 0x2A
B. Device found at 0x08\nDevice found at 0x2A
C. Device found at 0x08\nDevice found at 0x42
D. Device found at 0x8\nDevice found at 0x42
Solution
Step 1: Understand the address printing format
The code prints the address in hexadecimal using Serial.println(address, HEX);. Hex 8 is '8', hex 42 decimal is '2A'.
Step 2: Check leading zeros
Since Serial.println() with HEX does not pad zeros, 8 prints as '8', 42 prints as '2A'.
Final Answer:
Device found at 0x8\nDevice found at 0x2A -> Option A
Quick Check:
Hex 8 = 8, Hex 42 = 2A [OK]
Hint: Hex print does not add leading zeros by default [OK]
Common Mistakes:
Assuming leading zeros appear automatically
Confusing decimal 42 with hex 42
Expecting uppercase letters always
4. You wrote this I2C scanner code but it never finds any devices:
for (byte address = 0; address <= 127; address++) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("Found device at ");
Serial.println(address, HEX);
}
}
What is the likely problem?
medium
A. Wire.endTransmission() must be called twice
B. Address 0 is reserved and should not be scanned
C. The loop should start from 1, not 0
D. Serial.print() cannot print HEX values
Solution
Step 1: Check the address range in the loop
The I2C valid addresses range from 1 to 127. Starting at 0 is invalid and may cause issues.
Step 2: Understand scanning addresses
Starting from 1 avoids reserved addresses and ensures proper scanning.
Final Answer:
The loop should start from 1, not 0 -> Option C
Quick Check:
Scan addresses 1 to 127 [OK]
Hint: Start scanning from address 1, not 0 [OK]
Common Mistakes:
Including address 0 which is reserved
Calling Wire.endTransmission() multiple times unnecessarily
Thinking Serial.print() can't print HEX
5. You want to modify an I2C scanner sketch to skip addresses where Wire.endTransmission() returns 4 (other error) and print a summary count of devices found at the end. Which code snippet correctly implements this?
hard
A. int count = 0;
for (byte addr = 1; addr < 128; addr++) {
Wire.beginTransmission(addr);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("Device at 0x"); Serial.println(addr, HEX);
count++;
} else if (error == 4) {
count--;
}
}
Serial.print("Total devices: "); Serial.println(count);
B. int count = 0;
for (byte addr = 0; addr <= 127; addr++) {
Wire.beginTransmission(addr);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("Device at 0x"); Serial.println(addr, HEX);
count++;
} else if (error == 4) {
break;
}
}
Serial.print("Total devices: "); Serial.println(count);
C. int count = 0;
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("Device at 0x"); Serial.println(addr, HEX);
count++;
} else if (error == 4) {
Serial.println("Error 4 at address " + addr);
}
}
Serial.print("Total devices: "); Serial.println(count);
D. int count = 0;
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("Device at 0x"); Serial.println(addr, HEX);
count++;
} else if (error == 4) {
continue;
}
}
Serial.print("Total devices: "); Serial.println(count);
Solution
Step 1: Set correct address range and initialize count
The loop must scan addresses 1 to 126 (less than 127). Initialize count to zero before loop.
Step 2: Handle error 4 by skipping and count devices found
If error is 0, print address and increment count. If error is 4, skip with continue to avoid stopping the scan.
Step 3: Print total devices after loop
After scanning, print the total count of devices found.
Final Answer:
Code snippet A correctly implements the requirements -> Option D
Quick Check:
Skip error 4 with continue, count devices [OK]
Hint: Use continue to skip error 4 and count devices found [OK]
Common Mistakes:
Using break instead of continue on error 4
Starting loop at 0 instead of 1
Decreasing count on error instead of skipping
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.