Add files via upload
This commit is contained in:
parent
6ea9c4484e
commit
7776f7f066
10 changed files with 212 additions and 119 deletions
|
|
@ -1,8 +1,10 @@
|
||||||
import time
|
import time
|
||||||
|
import audioio
|
||||||
import random
|
import random
|
||||||
import board
|
import board
|
||||||
import busio
|
import busio
|
||||||
from digitalio import DigitalInOut
|
from digitalio import DigitalInOut
|
||||||
|
import digitalio
|
||||||
import neopixel
|
import neopixel
|
||||||
from adafruit_esp32spi import adafruit_esp32spi
|
from adafruit_esp32spi import adafruit_esp32spi
|
||||||
from adafruit_esp32spi import adafruit_esp32spi_wifimanager
|
from adafruit_esp32spi import adafruit_esp32spi_wifimanager
|
||||||
|
|
@ -10,9 +12,13 @@ import adafruit_fancyled.adafruit_fancyled as fancy
|
||||||
|
|
||||||
print("ESP32 Open Weather API demo")
|
print("ESP32 Open Weather API demo")
|
||||||
|
|
||||||
# Use cityname, country code where countrycode is ISO3166 format.
|
button = digitalio.DigitalInOut(board.A1)
|
||||||
# E.g. "New York, US" or "London, GB"
|
button.switch_to_input(pull=digitalio.Pull.UP)
|
||||||
LOCATION = "Manhattan, US"
|
|
||||||
|
wave_file = open("sound/Rain.wav", "rb")
|
||||||
|
wave = audioio.WaveFile(wave_file)
|
||||||
|
audio = audioio.AudioOut(board.A0)
|
||||||
|
|
||||||
|
|
||||||
# Get wifi details and more from a secrets.py file
|
# Get wifi details and more from a secrets.py file
|
||||||
try:
|
try:
|
||||||
|
|
@ -21,8 +27,12 @@ except ImportError:
|
||||||
print("WiFi secrets are kept in secrets.py, please add them there!")
|
print("WiFi secrets are kept in secrets.py, please add them there!")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
# Use cityname, country code where countrycode is ISO3166 format.
|
||||||
|
# E.g. "New York, US" or "London, GB"
|
||||||
|
LOCATION = secrets['timezone']
|
||||||
|
|
||||||
# Set up where we'll be fetching data from
|
# Set up where we'll be fetching data from
|
||||||
DATA_SOURCE = "http://api.openweathermap.org/data/2.5/weather?q="+LOCATION
|
DATA_SOURCE = "http://api.openweathermap.org/data/2.5/weather?q="+secrets['timezone']
|
||||||
DATA_SOURCE += "&appid="+secrets['openweather_token']
|
DATA_SOURCE += "&appid="+secrets['openweather_token']
|
||||||
|
|
||||||
# If you are using a board with pre-defined ESP32 Pins:
|
# If you are using a board with pre-defined ESP32 Pins:
|
||||||
|
|
@ -34,7 +44,7 @@ spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
|
||||||
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
|
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
|
||||||
status_light = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.2) # Uncomment for Most Boards
|
status_light = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.2) # Uncomment for Most Boards
|
||||||
wifi = adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager(esp, secrets, status_light)
|
wifi = adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager(esp, secrets, status_light)
|
||||||
pixels = neopixel.NeoPixel(board.D2, 16, brightness=1.0, auto_write=False)
|
pixels = neopixel.NeoPixel(board.D2, 150, brightness=1.0, auto_write=False)
|
||||||
pixels.fill(0x050505)
|
pixels.fill(0x050505)
|
||||||
pixels.show()
|
pixels.show()
|
||||||
|
|
||||||
|
|
@ -56,40 +66,108 @@ palette = None # current palette
|
||||||
pal_offset = 0 # Positional offset into color palette to get it to 'spin'
|
pal_offset = 0 # Positional offset into color palette to get it to 'spin'
|
||||||
levels = (0.25, 0.3, 0.15) # Color balance / brightness for gamma function
|
levels = (0.25, 0.3, 0.15) # Color balance / brightness for gamma function
|
||||||
raining = False
|
raining = False
|
||||||
|
snowing = False
|
||||||
thundering = False
|
thundering = False
|
||||||
|
has_sound = False
|
||||||
|
|
||||||
weather_refresh = None
|
weather_refresh = None
|
||||||
weather_type = None
|
weather_type = None
|
||||||
|
button_mode = 4
|
||||||
|
button_select = False
|
||||||
|
|
||||||
|
cloud_on = True
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
if not button.value:
|
||||||
|
button_mode = button_mode + 1
|
||||||
|
print("Button Pressed")
|
||||||
|
if button_mode > 4:
|
||||||
|
button_mode = 0
|
||||||
|
print("Mode is:", button_mode)
|
||||||
|
pressed_time = time.monotonic()
|
||||||
|
button_select = True
|
||||||
|
weather_refresh = None
|
||||||
|
while not button.value:
|
||||||
|
audio.stop()
|
||||||
|
#print("Debounce")
|
||||||
|
if (time.monotonic() - pressed_time) > 4:
|
||||||
|
print("Turning OFF")
|
||||||
|
cloud_on = False
|
||||||
|
pixels.fill(0x000000) # bright white!
|
||||||
|
pixels.show()
|
||||||
|
while not cloud_on:
|
||||||
|
while not button.value:
|
||||||
|
pass
|
||||||
|
#print("Debounce")
|
||||||
|
if not button.value:
|
||||||
|
pressed_time = time.monotonic()
|
||||||
|
print("Button Pressed")
|
||||||
|
cloud_on = True
|
||||||
|
button_select = False
|
||||||
|
weather_refresh = None
|
||||||
|
|
||||||
|
if button_mode == 0:
|
||||||
|
weather_type = 'Sunny'
|
||||||
|
if button_mode == 1:
|
||||||
|
weather_type = 'Clouds'
|
||||||
|
if button_mode == 2:
|
||||||
|
weather_type = 'Rain'
|
||||||
|
if button_mode == 3:
|
||||||
|
weather_type = 'Thunderstorm'
|
||||||
|
if button_mode == 4:
|
||||||
|
weather_type = 'Snow'
|
||||||
|
|
||||||
# only query the weather every 10 minutes (and on first run)
|
# only query the weather every 10 minutes (and on first run)
|
||||||
if (not weather_refresh) or (time.monotonic() - weather_refresh) > 600:
|
if (not weather_refresh) or (time.monotonic() - weather_refresh) > 600:
|
||||||
try:
|
try:
|
||||||
|
if not button_select:
|
||||||
response = wifi.get(DATA_SOURCE).json()
|
response = wifi.get(DATA_SOURCE).json()
|
||||||
print("Response is", response)
|
print("Response is", response)
|
||||||
weather_type = response['weather'][0]['main']
|
weather_type = response['weather'][0]['main']
|
||||||
weather_type = 'Thunderstorm' # manually adjust weather type for testing!
|
#weather_type = 'Rain' # manually adjust weather type for testing!
|
||||||
|
if weather_type == 'Clear':
|
||||||
|
weather_type = 'Sunny'
|
||||||
print(weather_type) # See https://openweathermap.org/weather-conditions
|
print(weather_type) # See https://openweathermap.org/weather-conditions
|
||||||
# default to no rain or thunder
|
# default to no rain or thunder
|
||||||
raining = thundering = False
|
raining = snowing = thundering = has_sound = False
|
||||||
if weather_type == 'Clouds':
|
|
||||||
palette = cloudy_palette
|
|
||||||
if weather_type == 'Rain':
|
|
||||||
palette = cloudy_palette
|
|
||||||
raining = True
|
|
||||||
if weather_type == 'Sunny':
|
if weather_type == 'Sunny':
|
||||||
palette = sunny_palette
|
palette = sunny_palette
|
||||||
|
wave_file = open("sound/Clear.wav", "rb")
|
||||||
|
wave = audioio.WaveFile(wave_file)
|
||||||
|
has_sound = True
|
||||||
|
if weather_type == 'Clouds':
|
||||||
|
palette = cloudy_palette
|
||||||
|
wave_file = open("sound/Clouds.wav", "rb")
|
||||||
|
wave = audioio.WaveFile(wave_file)
|
||||||
|
has_sound = True
|
||||||
|
if weather_type == 'Rain':
|
||||||
|
palette = cloudy_palette
|
||||||
|
wave_file = open("sound/Rain.wav", "rb")
|
||||||
|
wave = audioio.WaveFile(wave_file)
|
||||||
|
raining = True
|
||||||
|
has_sound = True
|
||||||
if weather_type == 'Thunderstorm':
|
if weather_type == 'Thunderstorm':
|
||||||
palette = thunder_palette
|
palette = thunder_palette
|
||||||
raining = thundering = True
|
raining = thundering = True
|
||||||
|
has_sound = True
|
||||||
# pick next thunderbolt time now
|
# pick next thunderbolt time now
|
||||||
next_bolt_time = time.monotonic() + random.randint(1, 5)
|
next_bolt_time = time.monotonic() + random.randint(1, 5)
|
||||||
|
if weather_type == 'Snow':
|
||||||
|
palette = cloudy_palette
|
||||||
|
wave_file = open("sound/Snow.wav", "rb")
|
||||||
|
wave = audioio.WaveFile(wave_file)
|
||||||
|
snowing = True
|
||||||
|
has_sound = True
|
||||||
weather_refresh = time.monotonic()
|
weather_refresh = time.monotonic()
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
print("Some error occured, retrying! -", e)
|
print("Some error occured, retrying! -", e)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if not audio.playing and has_sound:
|
||||||
|
if not thundering:
|
||||||
|
audio.play(wave)
|
||||||
|
|
||||||
if palette:
|
if palette:
|
||||||
for i in range(len(pixels)):
|
for i in range(len(pixels)):
|
||||||
color = fancy.palette_lookup(palette, pal_offset + i / len(pixels))
|
color = fancy.palette_lookup(palette, pal_offset + i / len(pixels))
|
||||||
|
|
@ -100,7 +178,13 @@ while True:
|
||||||
|
|
||||||
if raining:
|
if raining:
|
||||||
# don't have a droplet every time
|
# don't have a droplet every time
|
||||||
if random.randint(0, 25) == 0: # 1 out of 25 times
|
for i in range(random.randint(1, 5)): # up to 3 times...
|
||||||
|
pixels[random.randint(0, len(pixels)-1)] = 0x0000FF # make a random pixel Blue
|
||||||
|
pixels.show()
|
||||||
|
|
||||||
|
if snowing:
|
||||||
|
# don't have a droplet every time
|
||||||
|
for i in range(random.randint(1, 5)): # up to 3 times...
|
||||||
pixels[random.randint(0, len(pixels)-1)] = 0xFFFFFF # make a random pixel white
|
pixels[random.randint(0, len(pixels)-1)] = 0xFFFFFF # make a random pixel white
|
||||||
pixels.show()
|
pixels.show()
|
||||||
|
|
||||||
|
|
@ -116,4 +200,13 @@ while True:
|
||||||
pixels.show()
|
pixels.show()
|
||||||
time.sleep(random.uniform(0.01, 0.3)) # pause
|
time.sleep(random.uniform(0.01, 0.3)) # pause
|
||||||
# pick next thunderbolt time now
|
# pick next thunderbolt time now
|
||||||
|
Thunder = random.randint(0, 2)
|
||||||
|
if Thunder == 0:
|
||||||
|
wave_file = open("sound/Thunderstorm0.wav", "rb")
|
||||||
|
elif Thunder == 1:
|
||||||
|
wave_file = open("sound/Thunderstorm1.wav", "rb")
|
||||||
|
elif Thunder == 2:
|
||||||
|
wave_file = open("sound/Thunderstorm2.wav", "rb")
|
||||||
|
wave = audioio.WaveFile(wave_file)
|
||||||
|
audio.play(wave)
|
||||||
next_bolt_time = time.monotonic() + random.randint(5, 15) # between 5 and 15 s
|
next_bolt_time = time.monotonic() + random.randint(5, 15) # between 5 and 15 s
|
||||||
Binary file not shown.
Binary file not shown.
BIN
CircuitPython_WeatherCloud/sound/Clear.wav
Normal file
BIN
CircuitPython_WeatherCloud/sound/Clear.wav
Normal file
Binary file not shown.
BIN
CircuitPython_WeatherCloud/sound/Clouds.wav
Normal file
BIN
CircuitPython_WeatherCloud/sound/Clouds.wav
Normal file
Binary file not shown.
BIN
CircuitPython_WeatherCloud/sound/Rain.wav
Normal file
BIN
CircuitPython_WeatherCloud/sound/Rain.wav
Normal file
Binary file not shown.
BIN
CircuitPython_WeatherCloud/sound/Snow.wav
Normal file
BIN
CircuitPython_WeatherCloud/sound/Snow.wav
Normal file
Binary file not shown.
BIN
CircuitPython_WeatherCloud/sound/Thunderstorm0.wav
Normal file
BIN
CircuitPython_WeatherCloud/sound/Thunderstorm0.wav
Normal file
Binary file not shown.
BIN
CircuitPython_WeatherCloud/sound/Thunderstorm1.wav
Normal file
BIN
CircuitPython_WeatherCloud/sound/Thunderstorm1.wav
Normal file
Binary file not shown.
BIN
CircuitPython_WeatherCloud/sound/Thunderstorm2.wav
Normal file
BIN
CircuitPython_WeatherCloud/sound/Thunderstorm2.wav
Normal file
Binary file not shown.
Loading…
Reference in a new issue