diff --git a/Adafruit_Feather_RP2040_DVI/I2S/Tone/code.py b/Adafruit_Feather_RP2040_DVI/I2S/Tone/code.py new file mode 100644 index 000000000..df1875ad2 --- /dev/null +++ b/Adafruit_Feather_RP2040_DVI/I2S/Tone/code.py @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython I2S Tone playback example. +Plays a tone for one second on, one second off, in a loop. +""" +import time +import array +import math +import audiocore +import board +import audiobusio + +audio = audiobusio.I2SOut(board.A0, board.A1, board.A2) + +tone_volume = 0.1 # Increase this to increase the volume of the tone. +frequency = 440 # Set this to the Hz of the tone you want to generate. +length = 8000 // frequency +sine_wave = array.array("h", [0] * length) +for i in range(length): + sine_wave[i] = int((math.sin(math.pi * 2 * i / length)) * tone_volume * (2 ** 15 - 1)) +sine_wave_sample = audiocore.RawSample(sine_wave) + +while True: + audio.play(sine_wave_sample, loop=True) + time.sleep(1) + audio.stop() + time.sleep(1) diff --git a/Adafruit_Feather_RP2040_DVI/I2S/WAV/StreetChicken.wav b/Adafruit_Feather_RP2040_DVI/I2S/WAV/StreetChicken.wav new file mode 100644 index 000000000..55d4eb0f2 Binary files /dev/null and b/Adafruit_Feather_RP2040_DVI/I2S/WAV/StreetChicken.wav differ diff --git a/Adafruit_Feather_RP2040_DVI/I2S/WAV/code.py b/Adafruit_Feather_RP2040_DVI/I2S/WAV/code.py new file mode 100644 index 000000000..6f33a81ba --- /dev/null +++ b/Adafruit_Feather_RP2040_DVI/I2S/WAV/code.py @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython I2S WAV file playback. +Plays a WAV file once. +""" +import audiocore +import board +import audiobusio + +audio = audiobusio.I2SOut(board.A0, board.A1, board.A2) + +with open("StreetChicken.wav", "rb") as wave_file: + wav = audiocore.WaveFile(wave_file) + + print("Playing wav file!") + audio.play(wav) + while audio.playing: + pass + +print("Done!") diff --git a/Adafruit_Feather_RP2040_DVI/Storage/code.py b/Adafruit_Feather_RP2040_DVI/Storage/code.py new file mode 100644 index 000000000..951f87254 --- /dev/null +++ b/Adafruit_Feather_RP2040_DVI/Storage/code.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython Essentials Storage CP Filesystem boot.py file +""" +import board +import digitalio +import storage + +button = digitalio.DigitalInOut(board.BUTTON) +button.switch_to_input(pull=digitalio.Pull.UP) + +# If the button is connected to ground, the filesystem is writable by CircuitPython +storage.remount("/", readonly=button.value) diff --git a/Adafruit_Feather_RP2040_DVI/asyncio/code.py b/Adafruit_Feather_RP2040_DVI/asyncio/code.py new file mode 100644 index 000000000..fccc89980 --- /dev/null +++ b/Adafruit_Feather_RP2040_DVI/asyncio/code.py @@ -0,0 +1,80 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 Dan Halbert for Adafruit Industries +# SPDX-FileCopyrightText: Copyright (c) 2023 Kattni Rembor for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +CircuitPython asyncio example for two NeoPixel rings and one button. +""" +import asyncio +import board +import neopixel +import keypad +from rainbowio import colorwheel + +button_pin = board.BUTTON # The pin the button is connected to. +num_pixels = 16 # The number of NeoPixels on a single ring. +brightness = 0.2 # The LED brightness. + +# Set up NeoPixel rings. +ring_one = neopixel.NeoPixel(board.A1, num_pixels, brightness=brightness, auto_write=False) +ring_two = neopixel.NeoPixel(board.A2, num_pixels, brightness=brightness, auto_write=False) + + +class AnimationControls: + """The controls to allow you to vary the rainbow and blink animations.""" + def __init__(self): + self.reverse = False + self.wait = 0.0 + self.delay = 0.5 + + +async def rainbow_cycle(controls): + """Rainbow cycle animation on ring one.""" + while True: + for j in range(255, -1, -1) if controls.reverse else range(0, 256, 1): + for i in range(num_pixels): + rc_index = (i * 256 // num_pixels) + j + ring_one[i] = colorwheel(rc_index & 255) + ring_one.show() + await asyncio.sleep(controls.wait) + + +async def blink(controls): + """Blink animation on ring two.""" + while True: + ring_two.fill((0, 0, 255)) + ring_two.show() + await asyncio.sleep(controls.delay) + ring_two.fill((0, 0, 0)) + ring_two.show() + await asyncio.sleep(controls.delay) + await asyncio.sleep(controls.wait) + + +async def monitor_button(button, controls): + """Monitor button that reverses rainbow direction and changes blink speed. + Assume button is active low. + """ + with keypad.Keys((button,), value_when_pressed=False, pull=True) as key: + while True: + key_event = key.events.get() + if key_event: + if key_event.pressed: + controls.reverse = True + controls.delay = 0.1 + elif key_event.released: + controls.reverse = False + controls.delay = 0.5 + await asyncio.sleep(0) + + +async def main(): + animation_controls = AnimationControls() + button_task = asyncio.create_task(monitor_button(button_pin, animation_controls)) + animation_task = asyncio.create_task(rainbow_cycle(animation_controls)) + blink_task = asyncio.create_task(blink(animation_controls)) + + # This will run forever, because no tasks ever finish. + await asyncio.gather(button_task, animation_task, blink_task) + +asyncio.run(main()) diff --git a/Adafruit_Feather_RP2040_RFM69/Capacitive_Touch/One_Pin/code.py b/Adafruit_Feather_RP2040_RFM69/Capacitive_Touch/One_Pin/code.py new file mode 100644 index 000000000..ea1bd7d46 --- /dev/null +++ b/Adafruit_Feather_RP2040_RFM69/Capacitive_Touch/One_Pin/code.py @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython Capacitive Touch Pin Example - Print to the serial console when one pin is touched. +""" +import time +import board +import touchio + +touch = touchio.TouchIn(board.A3) + +while True: + if touch.value: + print("Pin touched!") + time.sleep(0.1) diff --git a/Adafruit_Feather_RP2040_RFM69/Capacitive_Touch/Two_Pins/code.py b/Adafruit_Feather_RP2040_RFM69/Capacitive_Touch/Two_Pins/code.py new file mode 100644 index 000000000..3dc49f38d --- /dev/null +++ b/Adafruit_Feather_RP2040_RFM69/Capacitive_Touch/Two_Pins/code.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython Capacitive Two Touch Pin Example - Print to the serial console when a pin is touched. +""" +import time +import board +import touchio + +touch_one = touchio.TouchIn(board.A3) +touch_two = touchio.TouchIn(board.D24) + +while True: + if touch_one.value: + print("Pin one touched!") + if touch_two.value: + print("Pin two touched!") + time.sleep(0.1) diff --git a/Adafruit_Feather_RP2040_RFM69/I2S/Tone/code.py b/Adafruit_Feather_RP2040_RFM69/I2S/Tone/code.py new file mode 100644 index 000000000..1e3725520 --- /dev/null +++ b/Adafruit_Feather_RP2040_RFM69/I2S/Tone/code.py @@ -0,0 +1,29 @@ +# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython I2S Tone playback example. +Plays a tone for one second on, one +second off, in a loop. +""" +import time +import array +import math +import audiocore +import board +import audiobusio + +audio = audiobusio.I2SOut(board.A0, board.A1, board.A2) + +tone_volume = 0.1 # Increase this to increase the volume of the tone. +frequency = 440 # Set this to the Hz of the tone you want to generate. +length = 8000 // frequency +sine_wave = array.array("h", [0] * length) +for i in range(length): + sine_wave[i] = int((math.sin(math.pi * 2 * i / length)) * tone_volume * (2 ** 15 - 1)) +sine_wave_sample = audiocore.RawSample(sine_wave) + +while True: + audio.play(sine_wave_sample, loop=True) + time.sleep(1) + audio.stop() + time.sleep(1) diff --git a/Adafruit_Feather_RP2040_RFM69/I2S/WAV/StreetChicken.wav b/Adafruit_Feather_RP2040_RFM69/I2S/WAV/StreetChicken.wav new file mode 100644 index 000000000..55d4eb0f2 Binary files /dev/null and b/Adafruit_Feather_RP2040_RFM69/I2S/WAV/StreetChicken.wav differ diff --git a/Adafruit_Feather_RP2040_RFM69/I2S/WAV/code.py b/Adafruit_Feather_RP2040_RFM69/I2S/WAV/code.py new file mode 100644 index 000000000..6f33a81ba --- /dev/null +++ b/Adafruit_Feather_RP2040_RFM69/I2S/WAV/code.py @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython I2S WAV file playback. +Plays a WAV file once. +""" +import audiocore +import board +import audiobusio + +audio = audiobusio.I2SOut(board.A0, board.A1, board.A2) + +with open("StreetChicken.wav", "rb") as wave_file: + wav = audiocore.WaveFile(wave_file) + + print("Playing wav file!") + audio.play(wav) + while audio.playing: + pass + +print("Done!") diff --git a/Adafruit_Feather_RP2040_RFM69/Storage/boot.py b/Adafruit_Feather_RP2040_RFM69/Storage/boot.py new file mode 100644 index 000000000..79274e1b4 --- /dev/null +++ b/Adafruit_Feather_RP2040_RFM69/Storage/boot.py @@ -0,0 +1,14 @@ +# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython Essentials Storage CP Filesystem boot.py file +""" +import board +import digitalio +import storage + +button = digitalio.DigitalInOut(board.BUTTON) +button.switch_to_input(pull=digitalio.Pull.UP) + +# If the OBJECT_NAME is connected to ground, the filesystem is writable by CircuitPython +storage.remount("/", readonly=button.value) diff --git a/Adafruit_Feather_RP2040_RFM69/Storage/code.py b/Adafruit_Feather_RP2040_RFM69/Storage/code.py new file mode 100644 index 000000000..f3223da73 --- /dev/null +++ b/Adafruit_Feather_RP2040_RFM69/Storage/code.py @@ -0,0 +1,37 @@ +# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython Essentials Storage CP Filesystem code.py file +""" +import time +import board +import digitalio +import microcontroller + +led = digitalio.DigitalInOut(board.LED) +led.switch_to_output() + +try: + with open("/temperature.txt", "a") as temp_log: + while True: + # The microcontroller temperature in Celsius. Include the + # math to do the C to F conversion here, if desired. + temperature = microcontroller.cpu.temperature + + # Write the temperature to the temperature.txt file every 10 seconds. + temp_log.write('{0:.2f}\n'.format(temperature)) + temp_log.flush() + + # Blink the LED on every write... + led.value = True + time.sleep(1) # ...for one second. + led.value = False # Then turn it off... + time.sleep(9) # ...for the other 9 seconds. + +except OSError as e: # When the filesystem is NOT writable by CircuitPython... + delay = 0.5 # ...blink the LED every half second. + if e.args[0] == 28: # If the file system is full... + delay = 0.15 # ...blink the LED every 0.15 seconds! + while True: + led.value = not led.value + time.sleep(delay) diff --git a/Adafruit_Feather_RP2040_RFM69/asyncio/code.py b/Adafruit_Feather_RP2040_RFM69/asyncio/code.py new file mode 100644 index 000000000..fccc89980 --- /dev/null +++ b/Adafruit_Feather_RP2040_RFM69/asyncio/code.py @@ -0,0 +1,80 @@ +# SPDX-FileCopyrightText: Copyright (c) 2022 Dan Halbert for Adafruit Industries +# SPDX-FileCopyrightText: Copyright (c) 2023 Kattni Rembor for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +CircuitPython asyncio example for two NeoPixel rings and one button. +""" +import asyncio +import board +import neopixel +import keypad +from rainbowio import colorwheel + +button_pin = board.BUTTON # The pin the button is connected to. +num_pixels = 16 # The number of NeoPixels on a single ring. +brightness = 0.2 # The LED brightness. + +# Set up NeoPixel rings. +ring_one = neopixel.NeoPixel(board.A1, num_pixels, brightness=brightness, auto_write=False) +ring_two = neopixel.NeoPixel(board.A2, num_pixels, brightness=brightness, auto_write=False) + + +class AnimationControls: + """The controls to allow you to vary the rainbow and blink animations.""" + def __init__(self): + self.reverse = False + self.wait = 0.0 + self.delay = 0.5 + + +async def rainbow_cycle(controls): + """Rainbow cycle animation on ring one.""" + while True: + for j in range(255, -1, -1) if controls.reverse else range(0, 256, 1): + for i in range(num_pixels): + rc_index = (i * 256 // num_pixels) + j + ring_one[i] = colorwheel(rc_index & 255) + ring_one.show() + await asyncio.sleep(controls.wait) + + +async def blink(controls): + """Blink animation on ring two.""" + while True: + ring_two.fill((0, 0, 255)) + ring_two.show() + await asyncio.sleep(controls.delay) + ring_two.fill((0, 0, 0)) + ring_two.show() + await asyncio.sleep(controls.delay) + await asyncio.sleep(controls.wait) + + +async def monitor_button(button, controls): + """Monitor button that reverses rainbow direction and changes blink speed. + Assume button is active low. + """ + with keypad.Keys((button,), value_when_pressed=False, pull=True) as key: + while True: + key_event = key.events.get() + if key_event: + if key_event.pressed: + controls.reverse = True + controls.delay = 0.1 + elif key_event.released: + controls.reverse = False + controls.delay = 0.5 + await asyncio.sleep(0) + + +async def main(): + animation_controls = AnimationControls() + button_task = asyncio.create_task(monitor_button(button_pin, animation_controls)) + animation_task = asyncio.create_task(rainbow_cycle(animation_controls)) + blink_task = asyncio.create_task(blink(animation_controls)) + + # This will run forever, because no tasks ever finish. + await asyncio.gather(button_task, animation_task, blink_task) + +asyncio.run(main()) diff --git a/CircuitPython_Templates/cap_touch_pin_script/code.py b/CircuitPython_Templates/cap_touch_pin_script/code.py index 30c0048c4..14bde317e 100644 --- a/CircuitPython_Templates/cap_touch_pin_script/code.py +++ b/CircuitPython_Templates/cap_touch_pin_script/code.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# SPDX-FileCopyrightText: 2021-2023 Kattni Rembor for Adafruit Industries # SPDX-License-Identifier: MIT """ CircuitPython Touch-Compatible Pin Identification Script @@ -45,6 +45,14 @@ def get_pin_names(): "ACCELEROMETER_SCL", "MICROPHONE_CLOCK", "MICROPHONE_DATA", + "RFM_RST", + "RFM_CS", + "RFM_IO0", + "RFM_IO1", + "RFM_IO2", + "RFM_IO3", + "RFM_IO4", + "RFM_IO5", ] pins = [ pin diff --git a/CircuitPython_Templates/i2c_find_pins/code.py b/CircuitPython_Templates/i2c_find_pins/code.py index 39e4ee7ea..0d8104820 100644 --- a/CircuitPython_Templates/i2c_find_pins/code.py +++ b/CircuitPython_Templates/i2c_find_pins/code.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# SPDX-FileCopyrightText: 2021-2023 Kattni Rembor for Adafruit Industries # SPDX-License-Identifier: MIT """CircuitPython I2C possible pin-pair identifying script""" import board @@ -35,6 +35,14 @@ def get_unique_pins(): "VOLTAGE_MONITOR", "MICROPHONE_CLOCK", "MICROPHONE_DATA", + "RFM_RST", + "RFM_CS", + "RFM_IO0", + "RFM_IO1", + "RFM_IO2", + "RFM_IO3", + "RFM_IO4", + "RFM_IO5", ] if p in dir(board) ]