diff --git a/examples/plasma_2040/plasma2040_rainbow.cmake b/examples/plasma_2040/plasma2040_rainbow.cmake index c0558e65..ceb1bd09 100644 --- a/examples/plasma_2040/plasma2040_rainbow.cmake +++ b/examples/plasma_2040/plasma2040_rainbow.cmake @@ -1,10 +1,15 @@ -add_executable(plasma2040_rainbow plasma2040_rainbow.cpp) +set(OUTPUT_NAME plasma2040_rainbow) +add_executable(${OUTPUT_NAME} plasma2040_rainbow.cpp) -target_link_libraries(plasma2040_rainbow +target_link_libraries(${OUTPUT_NAME} pico_stdlib plasma2040 rgbled button + analog ) -pico_add_extra_outputs(plasma2040_rainbow) +# enable usb output +pico_enable_stdio_usb(${OUTPUT_NAME} 1) + +pico_add_extra_outputs(${OUTPUT_NAME}) diff --git a/examples/plasma_2040/plasma2040_rainbow.cpp b/examples/plasma_2040/plasma2040_rainbow.cpp index bdeef29d..13b4799d 100644 --- a/examples/plasma_2040/plasma2040_rainbow.cpp +++ b/examples/plasma_2040/plasma2040_rainbow.cpp @@ -9,6 +9,7 @@ #include "common/pimoroni_common.hpp" #include "rgbled.hpp" #include "button.hpp" +#include "analog.hpp" /* Press "B" to speed up the LED cycling effect. @@ -27,6 +28,7 @@ const uint DEFAULT_SPEED = 10; // How many times the LEDs will be updated per second const uint UPDATES = 60; + // Pick *one* LED type by uncommenting the relevant line below: // APA102-style LEDs with Data/Clock lines. AKA DotStar @@ -40,6 +42,7 @@ Button user_sw(plasma::USER_SW, Polarity::ACTIVE_LOW, 0); Button button_a(plasma::BUTTON_A, Polarity::ACTIVE_LOW, 50); Button button_b(plasma::BUTTON_B, Polarity::ACTIVE_LOW, 50); RGBLED led(plasma::LED_R, plasma::LED_G, plasma::LED_B); +Analog sense(plasma::PIN_SENSE, plasma::ADC_GAIN, plasma::SHUNT_RESISTOR); int main() { @@ -50,6 +53,7 @@ int main() { int speed = DEFAULT_SPEED; float offset = 0.0f; + uint count = 0; while (true) { bool sw = user_sw.read(); bool a = button_a.read(); @@ -73,6 +77,13 @@ int main() { led.set_rgb(speed, 0, 255 - speed); + count += 1; + if(count >= UPDATES) { + // Display the current value once every second + printf("Current = %f A\n", sense.read_current()); + count = 0; + } + // Sleep time controls the rate at which the LED buffer is updated // but *not* the actual framerate at which the buffer is sent to the LEDs sleep_ms(1000 / UPDATES); diff --git a/libraries/plasma2040/plasma2040.hpp b/libraries/plasma2040/plasma2040.hpp index d57a66e8..c4d14272 100644 --- a/libraries/plasma2040/plasma2040.hpp +++ b/libraries/plasma2040/plasma2040.hpp @@ -12,6 +12,13 @@ const uint LED_B = 18; const uint BUTTON_A = 12; const uint BUTTON_B = 13; +const uint USER_SW = 23; + const uint PIN_CLK = 14; // Used only for APA102 const uint PIN_DAT = 15; // Used for both APA102 and WS2812 + +const uint PIN_SENSE = 29; // The pin used for current sensing + +constexpr float ADC_GAIN = 50; +constexpr float SHUNT_RESISTOR = 0.015f; } \ No newline at end of file diff --git a/micropython/examples/plasma_2040/rainbow.py b/micropython/examples/plasma_2040/rainbow.py index d364f433..40b0b80f 100644 --- a/micropython/examples/plasma_2040/rainbow.py +++ b/micropython/examples/plasma_2040/rainbow.py @@ -1,29 +1,67 @@ import plasma import time -# Import helper for Analog -from pimoroni import Analog +# Import helpers for RGB LEDs, Buttons, and Analog +from pimoroni import RGBLED, Button, Analog +# Press "B" to speed up the LED cycling effect. +# Press "A" to slow it down again. +# Press "Boot" to reset the speed back to default. + +# Set how many LEDs you have NUM_LEDS = 30 + +# The speed that the LEDs will start cycling at +DEFAULT_SPEED = 10 + +# How many times the LEDs will be updated per second UPDATES = 60 -# WS2812 / NeoPixel™ LEDs -led_strip = plasma.WS2812(NUM_LEDS, 0, 0, 15) -# APA102 / DotStar™ LEDs -# led_strip = plasma.APA102(NUM_LEDS, 0, 0, 15, 14) -# Set up the ADC for reading current +# Pick *one* LED type by uncommenting the relevant line below: + +# APA102 / DotStar™ LEDs +# led_strip = plasma.APA102(NUM_LEDS, 0, 0, plasma.PIN_DAT, plasma.PIN_CLK) + +# WS2812 / NeoPixel™ LEDs +led_strip = plasma.WS2812(NUM_LEDS, 0, 0, plasma.PIN_DAT) + +user_sw = Button(plasma.PIN_USER_SW) +button_a = Button(plasma.PIN_BUTTON_A) +button_b = Button(plasma.PIN_BUTTON_B) +led = RGBLED(plasma.PIN_LED_R, plasma.PIN_LED_G, plasma.PIN_LED_B) sense = Analog(plasma.PIN_CURRENT_SENSE, plasma.ADC_GAIN, plasma.SHUNT_RESISTOR) # Start updating the LED strip led_strip.start() +speed = DEFAULT_SPEED +offset = 0.0 + count = 0 # Make rainbows while True: - t = time.ticks_ms() / 1000.0 / 5.0 + sw = user_sw.read() + a = button_a.read() + b = button_b.read() + + if sw: + speed = DEFAULT_SPEED + else: + if a: + speed -= 1 + if b: + speed += 1 + + speed = min(255, max(1, speed)) + + offset += float(speed) / 2000.0 + for i in range(NUM_LEDS): - led_strip.set_hsv(i, t + (i / NUM_LEDS)) + hue = float(i) / NUM_LEDS + led_strip.set_hsv(i, hue + offset, 1.0, 1.0) + + led.set_rgb(speed, 0, 255 - speed) count += 1 if count >= UPDATES: