Skip to content

Commit 6f9e497

Browse files
committed
Add example code for Adafruit IO + QR Codes guide
1 parent a68a5c2 commit 6f9e497

1 file changed

Lines changed: 137 additions & 0 deletions

File tree

CircuitPython_qr_io/code.py

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2021 Jeff Epler for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: Unlicense
4+
5+
"""
6+
This demo is designed for the Kaluga development kit version 1.3 with the
7+
ILI9341 display. Your secrets.py must be populated with your wifi credentials
8+
and your Adafruit IO credentials.
9+
"""
10+
11+
import ssl
12+
from secrets import secrets
13+
from ulab import numpy as np
14+
from terminalio import FONT
15+
import board
16+
import busio
17+
import displayio
18+
import qrio
19+
import socketpool
20+
import wifi
21+
import adafruit_ov2640
22+
from adafruit_display_text.bitmap_label import Label
23+
from adafruit_ili9341 import ILI9341
24+
from adafruit_io.adafruit_io import IO_MQTT
25+
import adafruit_minimqtt.adafruit_minimqtt as MQTT
26+
27+
# To change the name of the feed on adafruit_io, just modify this string:
28+
feed_name = "qrstring"
29+
30+
print("Initializing display")
31+
displayio.release_displays()
32+
spi = busio.SPI(MOSI=board.LCD_MOSI, clock=board.LCD_CLK)
33+
display_bus = displayio.FourWire(
34+
spi, command=board.LCD_D_C, chip_select=board.LCD_CS, reset=board.LCD_RST
35+
)
36+
display = ILI9341(display_bus, width=320, height=240, rotation=90)
37+
38+
print("Initializing camera")
39+
bus = busio.I2C(scl=board.CAMERA_SIOC, sda=board.CAMERA_SIOD)
40+
cam = adafruit_ov2640.OV2640(
41+
bus,
42+
data_pins=board.CAMERA_DATA,
43+
clock=board.CAMERA_PCLK,
44+
vsync=board.CAMERA_VSYNC,
45+
href=board.CAMERA_HREF,
46+
mclk=board.CAMERA_XCLK,
47+
mclk_frequency=20_000_000,
48+
size=adafruit_ov2640.OV2640_SIZE_QQVGA,
49+
)
50+
cam.flip_x = False
51+
cam.flip_y = False
52+
cam.colorspace = adafruit_ov2640.OV2640_COLOR_YUV
53+
54+
print("Connecting to WIFI")
55+
wifi.radio.connect(secrets["ssid"], secrets["password"])
56+
pool = socketpool.SocketPool(wifi.radio)
57+
58+
print("Connecting to Adafruit IO")
59+
mqtt_client = MQTT.MQTT(
60+
broker="io.adafruit.com",
61+
username=secrets["aio_username"],
62+
password=secrets["aio_key"],
63+
socket_pool=pool,
64+
ssl_context=ssl.create_default_context(),
65+
)
66+
mqtt_client.connect()
67+
io = IO_MQTT(mqtt_client)
68+
# Blank out any previously published message
69+
io.publish(feed_name, "\ufeff")
70+
71+
qrdecoder = qrio.QRDecoder(cam.width, cam.height)
72+
bitmap = displayio.Bitmap(cam.width, cam.height, 65536)
73+
74+
# Create a greyscale palette
75+
pal = displayio.Palette(256)
76+
for i in range(256):
77+
pal[i] = 0x10101 * i
78+
79+
label = Label(
80+
font=FONT,
81+
text="Scan QR Code...",
82+
color=0xFFFFFF,
83+
background_color=0x0,
84+
padding_top=2,
85+
padding_left=2,
86+
padding_right=2,
87+
padding_bottom=2,
88+
anchor_point=(0.5, 1.0),
89+
anchored_position=(160, 230),
90+
)
91+
# Show the camera image at 2x size
92+
g1 = displayio.Group(scale=2)
93+
view = np.frombuffer(bitmap, dtype=np.uint8)
94+
tg = displayio.TileGrid(
95+
bitmap,
96+
pixel_shader=pal,
97+
)
98+
tg.flip_y = True
99+
g1.append(tg)
100+
g = displayio.Group()
101+
g.append(g1)
102+
g.append(label)
103+
display.show(g)
104+
display.auto_refresh = False
105+
106+
i = 0
107+
spin = ".oOo"
108+
old_payload = None
109+
while True:
110+
cam.capture(bitmap)
111+
112+
for row in qrdecoder.decode(bitmap, qrio.PixelPolicy.EVEN_BYTES):
113+
payload = row.payload
114+
try:
115+
payload = payload.decode("utf-8")
116+
except UnicodeError:
117+
payload = str(payload)
118+
if payload != old_payload:
119+
label.text = payload
120+
print(payload)
121+
for i in range(3):
122+
try:
123+
io.publish(feed_name, payload)
124+
old_payload = payload
125+
break
126+
except OSError as e:
127+
print(e)
128+
mqtt_client.reconnect()
129+
old_payload = payload
130+
else:
131+
print(end="+")
132+
print(spin[(i := (i + 1) % len(spin))], end="\10")
133+
134+
# Clear out the odd bytes, so that the bitmap displays as greyscale
135+
view[1::2] = 0
136+
bitmap.dirty()
137+
display.refresh(minimum_frames_per_second=0)

0 commit comments

Comments
 (0)