Skip to content

Commit 7776f7f

Browse files
authored
Add files via upload
1 parent 6ea9c44 commit 7776f7f

File tree

10 files changed

+212
-119
lines changed

10 files changed

+212
-119
lines changed

CircuitPython_WeatherCloud/code.py

Lines changed: 212 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,119 +1,212 @@
1-
import time
2-
import random
3-
import board
4-
import busio
5-
from digitalio import DigitalInOut
6-
import neopixel
7-
from adafruit_esp32spi import adafruit_esp32spi
8-
from adafruit_esp32spi import adafruit_esp32spi_wifimanager
9-
import adafruit_fancyled.adafruit_fancyled as fancy
10-
11-
print("ESP32 Open Weather API demo")
12-
13-
# Use cityname, country code where countrycode is ISO3166 format.
14-
# E.g. "New York, US" or "London, GB"
15-
LOCATION = "Manhattan, US"
16-
17-
# Get wifi details and more from a secrets.py file
18-
try:
19-
from secrets import secrets
20-
except ImportError:
21-
print("WiFi secrets are kept in secrets.py, please add them there!")
22-
raise
23-
24-
# Set up where we'll be fetching data from
25-
DATA_SOURCE = "http://api.openweathermap.org/data/2.5/weather?q="+LOCATION
26-
DATA_SOURCE += "&appid="+secrets['openweather_token']
27-
28-
# If you are using a board with pre-defined ESP32 Pins:
29-
esp32_cs = DigitalInOut(board.ESP_CS)
30-
esp32_ready = DigitalInOut(board.ESP_BUSY)
31-
esp32_reset = DigitalInOut(board.ESP_RESET)
32-
33-
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
34-
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
35-
status_light = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.2) # Uncomment for Most Boards
36-
wifi = adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager(esp, secrets, status_light)
37-
pixels = neopixel.NeoPixel(board.D2, 16, brightness=1.0, auto_write=False)
38-
pixels.fill(0x050505)
39-
pixels.show()
40-
41-
# clouds palette
42-
cloudy_palette = [fancy.CRGB(1.0, 1.0, 1.0), # White
43-
fancy.CRGB(0.5, 0.5, 0.5), # gray
44-
fancy.CRGB(0.5, 0.5, 1.0)] # blue-gray
45-
# sunny palette
46-
sunny_palette = [fancy.CRGB(1.0, 1.0, 1.0), # White
47-
fancy.CRGB(1.0, 1.0, 0.0),# Yellow
48-
fancy.CRGB(1.0, 0.5, 0.0),] # Orange
49-
# thunderstorm palette
50-
thunder_palette = [fancy.CRGB(0.0, 0.0, 1.0), # blue
51-
fancy.CRGB(0.5, 0.5, 0.5), # gray
52-
fancy.CRGB(0.5, 0.5, 1.0)] # blue-gray
53-
last_thunder_bolt = None
54-
55-
palette = None # current palette
56-
pal_offset = 0 # Positional offset into color palette to get it to 'spin'
57-
levels = (0.25, 0.3, 0.15) # Color balance / brightness for gamma function
58-
raining = False
59-
thundering = False
60-
61-
weather_refresh = None
62-
weather_type = None
63-
while True:
64-
# only query the weather every 10 minutes (and on first run)
65-
if (not weather_refresh) or (time.monotonic() - weather_refresh) > 600:
66-
try:
67-
response = wifi.get(DATA_SOURCE).json()
68-
print("Response is", response)
69-
weather_type = response['weather'][0]['main']
70-
weather_type = 'Thunderstorm' # manually adjust weather type for testing!
71-
72-
print(weather_type) # See https://openweathermap.org/weather-conditions
73-
# default to no rain or thunder
74-
raining = thundering = False
75-
if weather_type == 'Clouds':
76-
palette = cloudy_palette
77-
if weather_type == 'Rain':
78-
palette = cloudy_palette
79-
raining = True
80-
if weather_type == 'Sunny':
81-
palette = sunny_palette
82-
if weather_type == 'Thunderstorm':
83-
palette = thunder_palette
84-
raining = thundering = True
85-
# pick next thunderbolt time now
86-
next_bolt_time = time.monotonic() + random.randint(1, 5)
87-
weather_refresh = time.monotonic()
88-
except RuntimeError as e:
89-
print("Some error occured, retrying! -", e)
90-
time.sleep(5)
91-
continue
92-
93-
if palette:
94-
for i in range(len(pixels)):
95-
color = fancy.palette_lookup(palette, pal_offset + i / len(pixels))
96-
color = fancy.gamma_adjust(color, brightness=levels)
97-
pixels[i] = color.pack()
98-
pixels.show()
99-
pal_offset += 0.01 # Bigger number = faster spin
100-
101-
if raining:
102-
# don't have a droplet every time
103-
if random.randint(0, 25) == 0: # 1 out of 25 times
104-
pixels[random.randint(0, len(pixels)-1)] = 0xFFFFFF # make a random pixel white
105-
pixels.show()
106-
107-
# if its time for a thunderbolt
108-
if thundering and (time.monotonic() > next_bolt_time):
109-
print("Ka Bam!")
110-
# fill pixels white, delay, a few times
111-
for i in range(random.randint(1, 3)): # up to 3 times...
112-
pixels.fill(0xFFFFFF) # bright white!
113-
pixels.show()
114-
time.sleep(random.uniform(0.01, 0.2)) # pause
115-
pixels.fill(0x0F0F0F) # gray
116-
pixels.show()
117-
time.sleep(random.uniform(0.01, 0.3)) # pause
118-
# pick next thunderbolt time now
119-
next_bolt_time = time.monotonic() + random.randint(5, 15) # between 5 and 15 s
1+
import time
2+
import audioio
3+
import random
4+
import board
5+
import busio
6+
from digitalio import DigitalInOut
7+
import digitalio
8+
import neopixel
9+
from adafruit_esp32spi import adafruit_esp32spi
10+
from adafruit_esp32spi import adafruit_esp32spi_wifimanager
11+
import adafruit_fancyled.adafruit_fancyled as fancy
12+
13+
print("ESP32 Open Weather API demo")
14+
15+
button = digitalio.DigitalInOut(board.A1)
16+
button.switch_to_input(pull=digitalio.Pull.UP)
17+
18+
wave_file = open("sound/Rain.wav", "rb")
19+
wave = audioio.WaveFile(wave_file)
20+
audio = audioio.AudioOut(board.A0)
21+
22+
23+
# Get wifi details and more from a secrets.py file
24+
try:
25+
from secrets import secrets
26+
except ImportError:
27+
print("WiFi secrets are kept in secrets.py, please add them there!")
28+
raise
29+
30+
# Use cityname, country code where countrycode is ISO3166 format.
31+
# E.g. "New York, US" or "London, GB"
32+
LOCATION = secrets['timezone']
33+
34+
# Set up where we'll be fetching data from
35+
DATA_SOURCE = "http://api.openweathermap.org/data/2.5/weather?q="+secrets['timezone']
36+
DATA_SOURCE += "&appid="+secrets['openweather_token']
37+
38+
# If you are using a board with pre-defined ESP32 Pins:
39+
esp32_cs = DigitalInOut(board.ESP_CS)
40+
esp32_ready = DigitalInOut(board.ESP_BUSY)
41+
esp32_reset = DigitalInOut(board.ESP_RESET)
42+
43+
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
44+
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
45+
status_light = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.2) # Uncomment for Most Boards
46+
wifi = adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager(esp, secrets, status_light)
47+
pixels = neopixel.NeoPixel(board.D2, 150, brightness=1.0, auto_write=False)
48+
pixels.fill(0x050505)
49+
pixels.show()
50+
51+
# clouds palette
52+
cloudy_palette = [fancy.CRGB(1.0, 1.0, 1.0), # White
53+
fancy.CRGB(0.5, 0.5, 0.5), # gray
54+
fancy.CRGB(0.5, 0.5, 1.0)] # blue-gray
55+
# sunny palette
56+
sunny_palette = [fancy.CRGB(1.0, 1.0, 1.0), # White
57+
fancy.CRGB(1.0, 1.0, 0.0),# Yellow
58+
fancy.CRGB(1.0, 0.5, 0.0),] # Orange
59+
# thunderstorm palette
60+
thunder_palette = [fancy.CRGB(0.0, 0.0, 1.0), # blue
61+
fancy.CRGB(0.5, 0.5, 0.5), # gray
62+
fancy.CRGB(0.5, 0.5, 1.0)] # blue-gray
63+
last_thunder_bolt = None
64+
65+
palette = None # current palette
66+
pal_offset = 0 # Positional offset into color palette to get it to 'spin'
67+
levels = (0.25, 0.3, 0.15) # Color balance / brightness for gamma function
68+
raining = False
69+
snowing = False
70+
thundering = False
71+
has_sound = False
72+
73+
weather_refresh = None
74+
weather_type = None
75+
button_mode = 4
76+
button_select = False
77+
78+
cloud_on = True
79+
80+
while True:
81+
if not button.value:
82+
button_mode = button_mode + 1
83+
print("Button Pressed")
84+
if button_mode > 4:
85+
button_mode = 0
86+
print("Mode is:", button_mode)
87+
pressed_time = time.monotonic()
88+
button_select = True
89+
weather_refresh = None
90+
while not button.value:
91+
audio.stop()
92+
#print("Debounce")
93+
if (time.monotonic() - pressed_time) > 4:
94+
print("Turning OFF")
95+
cloud_on = False
96+
pixels.fill(0x000000) # bright white!
97+
pixels.show()
98+
while not cloud_on:
99+
while not button.value:
100+
pass
101+
#print("Debounce")
102+
if not button.value:
103+
pressed_time = time.monotonic()
104+
print("Button Pressed")
105+
cloud_on = True
106+
button_select = False
107+
weather_refresh = None
108+
109+
if button_mode == 0:
110+
weather_type = 'Sunny'
111+
if button_mode == 1:
112+
weather_type = 'Clouds'
113+
if button_mode == 2:
114+
weather_type = 'Rain'
115+
if button_mode == 3:
116+
weather_type = 'Thunderstorm'
117+
if button_mode == 4:
118+
weather_type = 'Snow'
119+
120+
# only query the weather every 10 minutes (and on first run)
121+
if (not weather_refresh) or (time.monotonic() - weather_refresh) > 600:
122+
try:
123+
if not button_select:
124+
response = wifi.get(DATA_SOURCE).json()
125+
print("Response is", response)
126+
weather_type = response['weather'][0]['main']
127+
#weather_type = 'Rain' # manually adjust weather type for testing!
128+
if weather_type == 'Clear':
129+
weather_type = 'Sunny'
130+
print(weather_type) # See https://openweathermap.org/weather-conditions
131+
# default to no rain or thunder
132+
raining = snowing = thundering = has_sound = False
133+
if weather_type == 'Sunny':
134+
palette = sunny_palette
135+
wave_file = open("sound/Clear.wav", "rb")
136+
wave = audioio.WaveFile(wave_file)
137+
has_sound = True
138+
if weather_type == 'Clouds':
139+
palette = cloudy_palette
140+
wave_file = open("sound/Clouds.wav", "rb")
141+
wave = audioio.WaveFile(wave_file)
142+
has_sound = True
143+
if weather_type == 'Rain':
144+
palette = cloudy_palette
145+
wave_file = open("sound/Rain.wav", "rb")
146+
wave = audioio.WaveFile(wave_file)
147+
raining = True
148+
has_sound = True
149+
if weather_type == 'Thunderstorm':
150+
palette = thunder_palette
151+
raining = thundering = True
152+
has_sound = True
153+
# pick next thunderbolt time now
154+
next_bolt_time = time.monotonic() + random.randint(1, 5)
155+
if weather_type == 'Snow':
156+
palette = cloudy_palette
157+
wave_file = open("sound/Snow.wav", "rb")
158+
wave = audioio.WaveFile(wave_file)
159+
snowing = True
160+
has_sound = True
161+
weather_refresh = time.monotonic()
162+
except RuntimeError as e:
163+
print("Some error occured, retrying! -", e)
164+
time.sleep(5)
165+
continue
166+
167+
if not audio.playing and has_sound:
168+
if not thundering:
169+
audio.play(wave)
170+
171+
if palette:
172+
for i in range(len(pixels)):
173+
color = fancy.palette_lookup(palette, pal_offset + i / len(pixels))
174+
color = fancy.gamma_adjust(color, brightness=levels)
175+
pixels[i] = color.pack()
176+
pixels.show()
177+
pal_offset += 0.01 # Bigger number = faster spin
178+
179+
if raining:
180+
# don't have a droplet every time
181+
for i in range(random.randint(1, 5)): # up to 3 times...
182+
pixels[random.randint(0, len(pixels)-1)] = 0x0000FF # make a random pixel Blue
183+
pixels.show()
184+
185+
if snowing:
186+
# don't have a droplet every time
187+
for i in range(random.randint(1, 5)): # up to 3 times...
188+
pixels[random.randint(0, len(pixels)-1)] = 0xFFFFFF # make a random pixel white
189+
pixels.show()
190+
191+
# if its time for a thunderbolt
192+
if thundering and (time.monotonic() > next_bolt_time):
193+
print("Ka Bam!")
194+
# fill pixels white, delay, a few times
195+
for i in range(random.randint(1, 3)): # up to 3 times...
196+
pixels.fill(0xFFFFFF) # bright white!
197+
pixels.show()
198+
time.sleep(random.uniform(0.01, 0.2)) # pause
199+
pixels.fill(0x0F0F0F) # gray
200+
pixels.show()
201+
time.sleep(random.uniform(0.01, 0.3)) # pause
202+
# pick next thunderbolt time now
203+
Thunder = random.randint(0, 2)
204+
if Thunder == 0:
205+
wave_file = open("sound/Thunderstorm0.wav", "rb")
206+
elif Thunder == 1:
207+
wave_file = open("sound/Thunderstorm1.wav", "rb")
208+
elif Thunder == 2:
209+
wave_file = open("sound/Thunderstorm2.wav", "rb")
210+
wave = audioio.WaveFile(wave_file)
211+
audio.play(wave)
212+
next_bolt_time = time.monotonic() + random.randint(5, 15) # between 5 and 15 s
Binary file not shown.
Binary file not shown.
431 KB
Binary file not shown.
455 KB
Binary file not shown.
220 KB
Binary file not shown.
71.8 KB
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)