1+ """
2+ Bluetooth Controlled Room Lights using a Circuit Playground Bluetooth
3+ Scroll between 7 modes and control brightness with your smartphone via Bluetooth
4+ Full tutorial: https://learn.adafruit.com/easy-no-solder-bluetooth-controlled-room-lights/overview
5+ Code by Kattni Rembor & Erin St Blaine for Adafruit Industries
6+ Adafruit invests time and resources to bring you this code! Please support our shop!
7+ """
8+
9+ # pylint: disable=attribute-defined-outside-init
10+ # pylint: disable=too-few-public-methods
11+
12+ import board
13+ import neopixel
14+ from adafruit_led_animation .animation .solid import Solid
15+ from adafruit_led_animation .animation .comet import Comet
16+ from adafruit_led_animation .animation .rainbow import Rainbow
17+ from adafruit_led_animation .animation .rainbowcomet import RainbowComet
18+ from adafruit_led_animation .animation .sparkle import Sparkle
19+ from adafruit_led_animation .animation .sparklepulse import SparklePulse
20+ from adafruit_led_animation .sequence import AnimationSequence
21+ from adafruit_led_animation .group import AnimationGroup
22+ from adafruit_led_animation .animation import Animation
23+ from adafruit_led_animation .sequence import AnimateOnce
24+ from adafruit_led_animation .color import (
25+ AMBER ,
26+ ORANGE ,
27+ WHITE ,
28+ RED ,
29+ BLACK ,
30+ colorwheel ,
31+ )
32+
33+
34+ from adafruit_ble import BLERadio
35+ from adafruit_ble .advertising .standard import ProvideServicesAdvertisement
36+ from adafruit_ble .services .nordic import UARTService
37+
38+ from adafruit_bluefruit_connect .packet import Packet
39+ from adafruit_bluefruit_connect .button_packet import ButtonPacket
40+ from adafruit_bluefruit_connect .color_packet import ColorPacket
41+
42+ NUM_LEDS = 240 # change to reflect your LED strip
43+ NEOPIXEL_PIN = board .A1 # change to reflect your wiring
44+
45+ # Declare a NeoPixel object on NEOPIXEL_PIN with NUM_LEDS pixels,
46+ # no auto-write.
47+ # Set brightness to max, we'll control it later in the code
48+ pixels = neopixel .NeoPixel (NEOPIXEL_PIN , NUM_LEDS , brightness = 1.0 ,
49+ auto_write = False ,
50+ #pixel_order=(1,0,2,3) #uncomment if using RGBW NeoPixels
51+ )
52+
53+
54+ ble = BLERadio ()
55+ uart_service = UARTService ()
56+ advertisement = ProvideServicesAdvertisement (uart_service )
57+
58+ class RainbowFade (Animation ):
59+ ''' fades the entire strip through the whole spectrum '''
60+ _color_index = 150 # choose start color (0-255)
61+ def __init__ (self , pixel_object , speed , name ): # define animation
62+ super ().__init__ (pixel_object , speed = speed , color = WHITE , name = name )
63+
64+ def draw (self ): # draw the animation
65+ ''' fades the entire strip through the whole spectrum '''
66+ self .color = colorwheel (self ._color_index + 1 )
67+ self ._color_index = (self ._color_index + 1 ) % 256
68+ self .fill (self .color )
69+
70+ # ANIMATION DEFINITIONS --
71+ # create as many animations as you'd like and define their attributes here.
72+ # They can be a single line or a group of animations - the groups will play
73+ # at the same time, overlaid on top of each other.
74+
75+
76+ readingLight = Solid (pixels , color = 0xFF7D13 ) #warm white color HEX code
77+ brightWhite = Solid (pixels , color = (150 , 150 , 150 ))
78+ rainbow = Rainbow (pixels , speed = 0.1 , period = 10 , step = 0.5 )
79+ rainbowfade = RainbowFade (pixels , speed = 0.4 , name = "rainbowfade" )
80+ powerup = RainbowComet (pixels , speed = 0 , tail_length = 50 , bounce = False )
81+ off = Solid (pixels , color = BLACK )
82+
83+ #startup animation will play just once
84+ startup = AnimateOnce (powerup )
85+
86+ #starrynight and fire are animation groups with layered effects.
87+ starrynight = AnimationGroup (
88+ SparklePulse (pixels , speed = 0.01 , color = (0 , 0 , 150 ), period = 1 ),
89+ Comet (pixels , speed = 0 , tail_length = 8 , color = (150 , 150 , 150 ), bounce = False ),)
90+
91+ fire = AnimationGroup (
92+ Comet (pixels , speed = 0 , tail_length = 1 , color = BLACK ),
93+ Sparkle (pixels , speed = 0.05 , num_sparkles = 10 , color = AMBER ),
94+ Sparkle (pixels , speed = 0.05 , num_sparkles = 10 , color = RED ),
95+ Sparkle (pixels , speed = 0.05 , num_sparkles = 20 , color = ORANGE ),
96+ Sparkle (pixels , speed = 0.05 , num_sparkles = 5 , color = 0xFF7D13 ),
97+ Sparkle (pixels , speed = 0.05 , num_sparkles = 10 , color = BLACK ),
98+ )
99+
100+ # Here is the animation playlist where you set the order of modes
101+
102+ animations = AnimationSequence (
103+ readingLight ,
104+ fire ,
105+ rainbow ,
106+ starrynight ,
107+ rainbowfade ,
108+ brightWhite ,
109+ auto_clear = True ,
110+ )
111+
112+
113+
114+ MODE = 0
115+
116+ while True :
117+ if MODE == 0 : # If currently off...
118+ startup .animate ()
119+ while startup .animate ():
120+ pass
121+ MODE = 1
122+ # Advertise when not connected
123+
124+ elif MODE >= 1 : # If not OFF MODE...
125+ ble .start_advertising (advertisement )
126+ while not ble .connected :
127+ if MODE == 2 :
128+ pass
129+ elif MODE == 1 :
130+ animations .animate ()
131+ # Now we're connected
132+
133+ while ble .connected :
134+ if uart_service .in_waiting :
135+ packet = Packet .from_stream (uart_service )
136+ # Color Picker Functionality
137+ if isinstance (packet , ColorPacket ):
138+ MODE = 2
139+ # Set all the pixels to one color and stay there.
140+ pixels .fill (packet .color )
141+ pixels .show ()
142+ # Control Pad Functionality
143+ elif isinstance (packet , ButtonPacket ):
144+ if packet .pressed :
145+ if packet .button == ButtonPacket .BUTTON_1 :
146+ MODE = 1
147+ animations .activate (1 )
148+ elif packet .button == ButtonPacket .BUTTON_2 :
149+ MODE = 1
150+ animations .activate (2 )
151+ elif packet .button == ButtonPacket .BUTTON_3 :
152+ MODE = 1
153+ animations .activate (3 )
154+ elif packet .button == ButtonPacket .BUTTON_4 :
155+ MODE = 1
156+ animations .activate (4 )
157+ # change the mode with right arrow
158+ elif packet .button == ButtonPacket .RIGHT :
159+ MODE = 1
160+ animations .next ()
161+ elif packet .button == ButtonPacket .LEFT :
162+ MODE = 4
163+ off .animate ()
164+ #change the brightness with up and down arrows
165+ elif packet .button == ButtonPacket .UP :
166+ pixels .brightness = pixels .brightness + 0.1
167+ pixels .show ()
168+ if pixels .brightness > 1 :
169+ pixels .brightness = 1
170+ elif packet .button == ButtonPacket .DOWN :
171+ pixels .brightness = pixels .brightness - 0.1
172+ pixels .show ()
173+ if pixels .brightness < 0.1 :
174+ pixels .brightness = 0.1
175+ if MODE == 1 :
176+ animations .animate ()
177+ if MODE == 4 :
178+ animations .freeze ()
0 commit comments