Skip to content

Commit 8ea00f2

Browse files
committed
i2c scanners updates
1 parent 5c7509c commit 8ea00f2

3 files changed

Lines changed: 134 additions & 38 deletions

File tree

CircuitPython_Essentials/CircuitPython_I2C_Scan/code.py

Lines changed: 23 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,34 @@
22
#
33
# SPDX-License-Identifier: MIT
44

5-
# pylint: disable=bare-except, eval-used, unused-import
6-
75
"""CircuitPython I2C Device Address Scan"""
6+
# If you run this and it seems to hang, try manually unlocking
7+
# your I2C bus from the REPL with
8+
# >>> import board
9+
# >>> board.I2C().unlock()
10+
811
import time
912
import board
10-
import busio
11-
12-
# List of potential I2C busses
13-
ALL_I2C = ("board.I2C()", "board.STEMMA_I2C()", "busio.I2C(board.GP1, board.GP0)")
14-
15-
# Determine which busses are valid
16-
found_i2c = []
17-
for name in ALL_I2C:
18-
try:
19-
print("Checking {}...".format(name), end="")
20-
bus = eval(name)
21-
bus.unlock()
22-
found_i2c.append((name, bus))
23-
print("ADDED.")
24-
except:
25-
print("SKIPPED.")
2613

27-
# Scan valid busses
28-
if len(found_i2c):
29-
print("-" * 40)
30-
print("I2C SCAN")
31-
print("-" * 40)
32-
while True:
33-
for bus_info in found_i2c:
34-
name = bus_info[0]
35-
bus = bus_info[1]
36-
37-
while not bus.try_lock():
38-
pass
14+
# To use default I2C bus (most boards)
15+
i2c = board.I2C() # uses board.SCL and board.SDA
16+
# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller
3917

40-
print(
41-
name,
42-
"addresses found:",
43-
[hex(device_address) for device_address in bus.scan()],
44-
)
18+
# To create I2C bus on specific pins
19+
# import busio
20+
# i2c = busio.I2C(board.SCL1, board.SDA1) # QT Py RP2040 STEMMA connector
21+
# i2c = busio.I2C(board.GP1, board.GP0) # Pi Pico RP2040
4522

46-
bus.unlock()
23+
while not i2c.try_lock():
24+
pass
4725

26+
try:
27+
while True:
28+
print(
29+
"I2C addresses found:",
30+
[hex(device_address) for device_address in i2c.scan()],
31+
)
4832
time.sleep(2)
49-
else:
50-
print("No valid I2C bus found.")
33+
34+
finally: # unlock the i2c bus when ctrl-c'ing out of the loop
35+
i2c.unlock()
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// --------------------------------------
2+
// i2c_scanner
3+
//
4+
// Modified from https://playground.arduino.cc/Main/I2cScanner/
5+
// --------------------------------------
6+
7+
#include <Wire.h>
8+
9+
// Set I2C bus to use: Wire, Wire1, etc.
10+
#define WIRE Wire
11+
12+
void setup() {
13+
WIRE.begin();
14+
15+
Serial.begin(9600);
16+
while (!Serial)
17+
delay(10);
18+
Serial.println("\nI2C Scanner");
19+
}
20+
21+
22+
void loop() {
23+
byte error, address;
24+
int nDevices;
25+
26+
Serial.println("Scanning...");
27+
28+
nDevices = 0;
29+
for(address = 1; address < 127; address++ )
30+
{
31+
// The i2c_scanner uses the return value of
32+
// the Write.endTransmisstion to see if
33+
// a device did acknowledge to the address.
34+
WIRE.beginTransmission(address);
35+
error = WIRE.endTransmission();
36+
37+
if (error == 0)
38+
{
39+
Serial.print("I2C device found at address 0x");
40+
if (address<16)
41+
Serial.print("0");
42+
Serial.print(address,HEX);
43+
Serial.println(" !");
44+
45+
nDevices++;
46+
}
47+
else if (error==4)
48+
{
49+
Serial.print("Unknown error at address 0x");
50+
if (address<16)
51+
Serial.print("0");
52+
Serial.println(address,HEX);
53+
}
54+
}
55+
if (nDevices == 0)
56+
Serial.println("No I2C devices found\n");
57+
else
58+
Serial.println("done\n");
59+
60+
delay(5000); // wait 5 seconds for next scan
61+
}

I2C_Scanners/circuitpython/code.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# SPDX-FileCopyrightText: 2017 Limor Fried for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
# pylint: disable=eval-used, unused-import
6+
7+
"""CircuitPython I2C Device Address Scan"""
8+
import time
9+
import board
10+
import busio
11+
12+
# List of potential I2C busses
13+
ALL_I2C = ("board.I2C()", "board.STEMMA_I2C()", "busio.I2C(board.GP1, board.GP0)")
14+
15+
# Determine which busses are valid
16+
found_i2c = []
17+
for name in ALL_I2C:
18+
try:
19+
print("Checking {}...".format(name), end="")
20+
bus = eval(name)
21+
bus.unlock()
22+
found_i2c.append((name, bus))
23+
print("ADDED.")
24+
except Exception as e:
25+
print("SKIPPED:", e)
26+
27+
# Scan valid busses
28+
if len(found_i2c):
29+
print("-" * 40)
30+
print("I2C SCAN")
31+
print("-" * 40)
32+
while True:
33+
for bus_info in found_i2c:
34+
name = bus_info[0]
35+
bus = bus_info[1]
36+
37+
while not bus.try_lock():
38+
pass
39+
40+
print(
41+
name,
42+
"addresses found:",
43+
[hex(device_address) for device_address in bus.scan()],
44+
)
45+
46+
bus.unlock()
47+
48+
time.sleep(2)
49+
else:
50+
print("No valid I2C bus found.")

0 commit comments

Comments
 (0)