Skip to content

Commit 35426ee

Browse files
committed
Add address change example
1 parent dedea6f commit 35426ee

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

examples/change_address.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from sys import exit
2+
from machine import I2C
3+
from time import sleep
4+
5+
pinstrap_map = {
6+
0x3C: "BUZZER",
7+
0x7C: "BUTTONS",
8+
0x76: "ENCODER",
9+
0x74: "ENCODER",
10+
0x6C: "SMARTLEDS"
11+
}
12+
13+
def pinstrap_to_name(address):
14+
if address in pinstrap_map:
15+
return pinstrap_map[address]
16+
return "UNKNOWN"
17+
18+
bus = I2C(0)
19+
devices_on_bus = bus.scan()
20+
21+
print()
22+
23+
if len(devices_on_bus) == 0:
24+
print("No devices found on the bus. Try resetting the board.")
25+
exit(1)
26+
27+
print("The following devices were found on the bus:")
28+
29+
for index, device_address in enumerate(devices_on_bus):
30+
pinstrap_address = bus.readfrom(device_address, 1)
31+
device_name = pinstrap_to_name(pinstrap_address[0])
32+
print(f"{index + 1}) {device_name} at {hex(device_address)}")
33+
34+
choice = int(input("\nEnter the device number for which you want to change the address: "))
35+
if choice < 1 or choice > len(devices_on_bus):
36+
print("Invalid choice. Please select a valid device number.")
37+
exit(1)
38+
39+
selected_device_address = devices_on_bus[choice - 1]
40+
41+
# Read address from user input
42+
new_address = int(input("Enter the new address (hexadecimal or decimal): "), 0)
43+
44+
if new_address < 0 or new_address > 127:
45+
print("Invalid address. Address must be between 0 and 127")
46+
exit(1)
47+
48+
print(f"Changing address of device at {hex(selected_device_address)} to {hex(new_address)}...")
49+
50+
data = bytearray(40)
51+
# Set the first two bytes to 'C' and 'F' followed by the new address
52+
data[0:2] = b'CF'
53+
data[2] = new_address * 2
54+
55+
try:
56+
bus.writeto(selected_device_address, data)
57+
except OSError:
58+
pass # Device resets immediately and causes ENODEV to be thrown which is expected
59+
sleep(1)
60+
61+
# Check if the address was successfully changed
62+
devices_on_bus = bus.scan()
63+
if new_address in devices_on_bus:
64+
print(f"✅ Address changed successfully to {hex(new_address)}")
65+
else:
66+
print("❌ Failed to change address. Please try again.")

0 commit comments

Comments
 (0)