# simple range mapper, like Arduino map() def map_range(s, a1, a2, b1, b2): return b1 + ((s - a1) * (b2 - b1) / (a2 - a1)) # example: map 0-0123 value to 0.0-1.0 value val = 768 outval = map_range( val, 0,1023, 0.0,1.0 ) # outval = 0.75
Constrain an input to a min/max
The Python built-in min()
and max()
functions can be used together to make something like Arduino's constrain()
.
# constrain a value to be 0-255 outval = min(max(val, 0), 255) # constrain a value to be 0-255 integer outval = int(min(max(val, 0), 255)) # constrain a value to be -1 to +1 outval = min(max(val, -1), 1)
Preventing Ctrl-C from stopping the program
Put a try
/except KeyboardInterrupt
to catch the Ctrl-C on the inside of your main loop.
while True: try: print("Doing something important...") time.sleep(0.1) except KeyboardInterrupt: print("Nice try, human! Not quitting.")
Also useful for graceful shutdown (turning off neopixels, say) on Ctrl-C.
import time, random import board, neopixel, rainbowio leds = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.4 ) while True: try: rgb = rainbowio.colorwheel(int(time.monotonic()*75) % 255) leds.fill(rgb) time.sleep(0.05) except KeyboardInterrupt: print("shutting down nicely...") leds.fill(0) break # gets us out of the while True
Prevent auto-reload when CIRCUITPY is touched
Normally, CircuitPython restarts anytime the CIRCUITPY drive is written to. This is great normally, but is frustrating if you want your code to keep running, and you want to control exactly when a restart happens.
import supervisor supervisor.disable_autoreload()
To trigger a reload, do a Ctrl-C + Ctrl-D in the REPL or reset your board.
Raspberry Pi Pico boot.py Protection
Also works on other RP2040-based boards like QTPy RP2040. From https://gist.github.com/Neradoc/8056725be1c209475fd09ffc37c9fad4.
# Copy this as 'boot.py' in your Pico's CIRCUITPY drive # Useful in case Pico locks up (which it's done a few times on me) import board import time from digitalio import DigitalInOut,Pull led = DigitalInOut(board.LED) led.switch_to_output() safe = DigitalInOut(board.GP14) # <-- choose your button pin safe.switch_to_input(Pull.UP) def reset_on_pin(): if safe.value is False: import microcontroller microcontroller.on_next_reset(microcontroller.RunMode.SAFE_MODE) microcontroller.reset() led.value = False for x in range(16): reset_on_pin() led.value = not led.value # toggle LED on/off as notice time.sleep(0.1)
Text editor powered by tinymce.