1
+
2
+ """
3
+ Read the barometric reading in the air
4
+ Visualize air reading changes over time as a color animation on a NeoPixel strip
5
+ Display a "sinking" or "rising" graphic on the screen along with recent reading data
6
+
7
+ Code by Erin St Blaine for Adafruit Industries
8
+ """
9
+
10
+ import time
11
+ import board
12
+ import neopixel
13
+ from adafruit_clue import clue
14
+ import adafruit_fancyled .adafruit_fancyled as fancy
15
+ import displayio
16
+ from adafruit_display_text import label
17
+ from adafruit_bitmap_font import bitmap_font
18
+
19
+
20
+ num_leds = 79 #number of LEDs in your strip
21
+ timeToCheck = 100 # set the amount of time between sensor checks. 7800 is approx. 1 hour
22
+
23
+ # Barometer or Thermometer? Uncomment the section you want to use
24
+
25
+ # BAROMETER RANGES (hPa)
26
+ # set desired reading range -- the NeoPixel palette choice will be determined by these thresholds
27
+ deviceType = 0
28
+ min_reading = 960
29
+ med_reading = 965
30
+ high_reading = 970
31
+ max_reading = 975
32
+
33
+ """
34
+ # THERMOMETER RANGES (C)
35
+ # set desired temperature range -- the NeoPixel palette choice will be determined by these thresholds
36
+ deviceType = 1
37
+ min_reading = 25
38
+ med_reading = 27
39
+ high_reading= 31
40
+ max_reading = 33
41
+ """
42
+
43
+ #get an initial sensor reading
44
+ if deviceType == 0 :
45
+ reading = clue .pressure
46
+ else :
47
+ reading = clue .temperature
48
+
49
+ #set up variables for "remembering" past readings
50
+ reading1 = reading
51
+ reading2 = reading1
52
+ reading3 = reading2
53
+ counter = 0
54
+ toggle = 1 #for on/off switch on button A
55
+ displayOn = 1 #to turn the display on and off with button B
56
+
57
+ clue .display .brightness = 0.8
58
+ clue_display = displayio .Group (max_size = 4 )
59
+
60
+ # draw the rising image
61
+ rising_file = open ("rising.bmp" , "rb" )
62
+ rising_bmp = displayio .OnDiskBitmap (rising_file )
63
+ rising_sprite = displayio .TileGrid (rising_bmp , pixel_shader = displayio .ColorConverter ())
64
+ clue_display .append (rising_sprite )
65
+
66
+ # draw the sinking image
67
+ sinking_file = open ("sinking.bmp" , "rb" )
68
+ sinking_bmp = displayio .OnDiskBitmap (sinking_file )
69
+ sinking_sprite = displayio .TileGrid (sinking_bmp , pixel_shader = displayio .ColorConverter ())
70
+ clue_display .append (sinking_sprite )
71
+
72
+ # Create text
73
+ # first create the group
74
+ text_group = displayio .Group (max_size = 5 , scale = 1 )
75
+ # Make a label
76
+ reading_font = bitmap_font .load_font ("/font/RacingSansOne-Regular-29.bdf" )
77
+ reading_font .load_glyphs ("0123456789ADSWabcdefghijklmnopqrstuvwxyz:!" .encode ('utf-8' ))
78
+ reading_label = label .Label (reading_font , color = 0xffffff , max_glyphs = 15 )
79
+ reading_label .x = 10
80
+ reading_label .y = 24
81
+ text_group .append (reading_label )
82
+
83
+ reading2_label = label .Label (reading_font , color = 0xdaf5f4 , max_glyphs = 15 )
84
+ reading2_label .x = 10
85
+ reading2_label .y = 54
86
+ text_group .append (reading2_label )
87
+
88
+ reading3_label = label .Label (reading_font , color = 0x4f3ab1 , max_glyphs = 15 )
89
+ reading3_label .x = 10
90
+ reading3_label .y = 84
91
+ text_group .append (reading3_label )
92
+
93
+ timer_label = label .Label (reading_font , color = 0x072170 , max_glyphs = 15 )
94
+ timer_label .x = 10
95
+ timer_label .y = 114
96
+ text_group .append (timer_label )
97
+
98
+ clue_display .append (text_group )
99
+ clue .display .show (clue_display )
100
+
101
+ # Define color Palettes
102
+ waterPalette = [
103
+ 0x00d9ff ,
104
+ 0x006f82 ,
105
+ 0x43bfb9 ,
106
+ 0x0066ff ]
107
+ icePalette = [
108
+ 0x8080FF ,
109
+ 0x8080FF ,
110
+ 0x8080FF ,
111
+ 0x0000FF ,
112
+ 0xC88AFF ]
113
+ sunPalette = [
114
+ 0xffaa00 ,
115
+ 0xffdd00 ,
116
+ 0x7d5b06 ,
117
+ 0xfffca8 ]
118
+ firePalette = [
119
+ 0xff0000 ,
120
+ 0xff5500 ,
121
+ 0x8a3104 ,
122
+ 0xffaa00 ]
123
+ forestPalette = [
124
+ 0xccffa8 ,
125
+ 0x69f505 ,
126
+ 0x05f551 ,
127
+ 0x2c8247 ]
128
+
129
+ #set up default initial palettes, just for startup
130
+ palette = forestPalette
131
+ palette2 = waterPalette
132
+ palette3 = icePalette
133
+
134
+ # Declare a NeoPixel object on pin A4 with num_leds pixels, no auto-write.
135
+ # Set brightness to max because we'll be using FancyLED's brightness control.
136
+ pixels = neopixel .NeoPixel (board .A4 , num_leds , brightness = 1.0 ,
137
+ auto_write = False )
138
+
139
+ offset = 0 # Positional offset into color palette to get it to 'spin'
140
+
141
+ while True :
142
+ # use button A to toggle the NeoPixels on or off by changing brightness
143
+ if clue .button_a :
144
+ if toggle == 1 :
145
+ toggle = 0
146
+ pixels .brightness = 0
147
+ clue .display .brightness = 0
148
+ elif toggle == 0 :
149
+ toggle = 1
150
+ pixels .brightness = 1.0
151
+ clue .display .brightness = 0.8
152
+ if clue .button_b :
153
+ #Toggle only the display on and off
154
+ if displayOn == 0 :
155
+ clue .display .brightness = 0.8
156
+ displayOn = 1
157
+ else :
158
+ clue .display .brightness = 0
159
+ displayOn = 0
160
+
161
+ #assign color palette to NeoPixel section 1 based on the current reading reading
162
+ if reading1 < min_reading :
163
+ palette = firePalette
164
+ elif reading1 > min_reading and reading1 < med_reading :
165
+ palette = sunPalette
166
+ elif reading1 > med_reading and reading1 < high_reading :
167
+ palette = forestPalette
168
+ elif reading1 > high_reading and reading1 < max_reading :
169
+ palette = waterPalette
170
+ else :
171
+ palette = icePalette
172
+ #Map colors to pixels. Adjust range numbers to light up specific pixels. This configuration
173
+ # maps to a reflected gradient, with pixel 0 in the upper left corner
174
+ # Load each pixel's color from the palette using an offset, run it
175
+ # through the gamma function, pack RGB value and assign to pixel.
176
+ for i in range (23 , 31 ): #center right -- present moment
177
+ color = fancy .palette_lookup (palette , offset + i / num_leds )
178
+ color = fancy .gamma_adjust (color , brightness = 0.25 )
179
+ pixels [i ] = color .pack ()
180
+
181
+ for i in range (63 , 71 ): #center left -- present moment
182
+ color = fancy .palette_lookup (palette , offset + i / num_leds )
183
+ color = fancy .gamma_adjust (color , brightness = 0.25 )
184
+ pixels [i ] = color .pack ()
185
+
186
+ for i in range (16 , 23 ): #top mid right -- 1 cycle ago
187
+ color = fancy .palette_lookup (palette2 , offset + i / num_leds )
188
+ color = fancy .gamma_adjust (color , brightness = 0.25 )
189
+ pixels [i ] = color .pack ()
190
+
191
+ for i in range (71 , 78 ): #top mid left -- 1 cycle ago
192
+ color = fancy .palette_lookup (palette2 , offset + i / num_leds )
193
+ color = fancy .gamma_adjust (color , brightness = 0.25 )
194
+ pixels [i ] = color .pack ()
195
+
196
+ for i in range (31 , 38 ): #bottom mid right -- 1 cycle ago
197
+ color = fancy .palette_lookup (palette2 , offset + i / num_leds )
198
+ color = fancy .gamma_adjust (color , brightness = 0.25 )
199
+ pixels [i ] = color .pack ()
200
+
201
+ for i in range (56 , 63 ): #bottom mid left -- 1 cycle ago
202
+ color = fancy .palette_lookup (palette2 , offset + i / num_leds )
203
+ color = fancy .gamma_adjust (color , brightness = 0.25 )
204
+ pixels [i ] = color .pack ()
205
+
206
+ for i in range (0 , 16 ): #top right -- 2 cycles ago
207
+ color = fancy .palette_lookup (palette3 , offset + i / num_leds )
208
+ color = fancy .gamma_adjust (color , brightness = 0.25 )
209
+ pixels [i ] = color .pack ()
210
+
211
+ for i in range (77 , 79 ): #top left -- 2 cycles ago
212
+ color = fancy .palette_lookup (palette3 , offset + i / num_leds )
213
+ color = fancy .gamma_adjust (color , brightness = 0.25 )
214
+ pixels [i ] = color .pack ()
215
+
216
+ for i in range (38 , 56 ): #bottom -- 2 cycles ago
217
+ color = fancy .palette_lookup (palette3 , offset + i / num_leds )
218
+ color = fancy .gamma_adjust (color , brightness = 0.25 )
219
+ pixels [i ] = color .pack ()
220
+
221
+ pixels .show ()
222
+ offset += 0.01 # Bigger number = faster spin
223
+
224
+ reading_label .text = "Now {:.1f}" .format (reading1 )
225
+ reading2_label .text = "Last {:.1f}" .format (reading2 )
226
+ reading3_label .text = "Prev {:.1f}" .format (reading3 )
227
+ timer_label .text = "{}" .format (counter )
228
+ clue .display .show (clue_display )
229
+
230
+ #Is it time to update?
231
+ if counter > timeToCheck :
232
+ #This moves the current data to the "1 hour old" section of pixels and the "1 hour old" data
233
+ #to the "2 hours old" section of pixels
234
+ palette3 = palette2
235
+ palette2 = palette
236
+ reading3 = reading2
237
+ reading2 = reading1
238
+ reading1 = reading
239
+ #take a new sensor reading and reset the counter
240
+ if deviceType == 0 :
241
+ reading = clue .pressure
242
+ else :
243
+ reading = clue .temperature
244
+ counter = 0
245
+ #if reading is rising, show rising image and position text at the bottom
246
+ if reading1 > reading2 :
247
+ sinking_sprite .x = 300
248
+ reading_label .y = 134
249
+ reading2_label .y = 164
250
+ reading3_label .y = 194
251
+ timer_label .y = 224
252
+ #if reading is falling, show sinking image and position text at the top
253
+ elif reading2 < reading3 : #reading is falling
254
+ sinking_sprite .x = 0
255
+ reading_label .y = 24
256
+ reading2_label .y = 54
257
+ reading3_label .y = 84
258
+ timer_label .y = 114
259
+ #otherwise keep counting up
260
+ else :
261
+ counter = counter + 1
0 commit comments