From 7c154f79b7cb3b93c9b10204a73c803f6127b2ca Mon Sep 17 00:00:00 2001 From: Molly Nicholas Date: Sun, 13 Dec 2015 09:36:59 -0800 Subject: [PATCH] Add version for the Particle Photon --- .../cloud-lightning-photon.ino | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 cloud-lightning-photon/cloud-lightning-photon.ino diff --git a/cloud-lightning-photon/cloud-lightning-photon.ino b/cloud-lightning-photon/cloud-lightning-photon.ino new file mode 100644 index 0000000..a8de13e --- /dev/null +++ b/cloud-lightning-photon/cloud-lightning-photon.ino @@ -0,0 +1,118 @@ +// This #include statement was automatically added by the Particle IDE. +#include "neopixel/neopixel.h" + +// IMPORTANT: Set pixel COUNT, PIN and TYPE +#define PIXEL_COUNT 4 +#define PIXEL_PIN D0 +#define PIXEL_TYPE WS2812B + + +// Parameter 1 = number of pixels in strip +// Parameter 2 = pin number (most are valid) +// note: if not specified, D2 is selected for you. +// Parameter 3 = pixel type [ WS2812, WS2812B, WS2811, TM1803 ] +// note: if not specified, WS2812B is selected for you. +// note: RGB order is automatically applied to WS2811, +// WS2812/WS2812B/TM1803 is GRB order. +// +// 800 KHz bitstream 800 KHz bitstream (most NeoPixel products ... +// ... WS2812 (6-pin part)/WS2812B (4-pin part) ) +// +// 400 KHz bitstream (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) +// (Radio Shack Tri-Color LED Strip - TM1803 driver +// NOTE: RS Tri-Color LED's are grouped in sets of 3) + +Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE); + +const int HIGH_STRIKE_LIKELIHOOD = 5; +const int LOW_STRIKE_LIKELIHOOD = 10; +int currentDataPoint = 0; +int chance = LOW_STRIKE_LIKELIHOOD; + +// Simple moving average plot +int NUM_Y_VALUES = 17; + +float yValues[] = { + 0, + 7, + 10, + 9, + 7.1, + 7.5, + 7.4, + 12, + 15, + 10, + 0, + 3, + 3.5, + 4, + 1, + 7, + 1 +}; + +float simple_moving_average_previous = 0; +float random_moving_average_previous = 0; + +void setup() { + + strip.begin(); // Sends the start protocol for the LEDs. + strip.show(); // Initialize all pixels to 'off' + + Particle.function("lightning", triggerWeather); +} + +void loop() { + +} + +int triggerWeather(String command) { + + if (command==String("f")) { + int led = random(PIXEL_COUNT); + for (int i = 0; i < 10; i++) { + // Use this line to keep the lightning focused in one LED. + // lightningStrike(led): + // Use this line if you want the lightning to spread out among multiple LEDs. + lightningStrike(random(PIXEL_COUNT)); + } + // Once there's been one strike, I make it more likely that there will be a second. + chance = HIGH_STRIKE_LIKELIHOOD; + } else { + chance = LOW_STRIKE_LIKELIHOOD; + } + turnAllPixelsOff(); + delay(1000); +} + +void turnAllPixelsOff() { + for (int i = 0; i < PIXEL_COUNT; i++) { + strip.setPixelColor(i, 0); + } + strip.show(); +} + +void lightningStrike(int pixel) { + float brightness = simple_moving_average(); + float scaledWhite = abs(brightness*500); + + strip.setPixelColor(pixel, strip.Color(scaledWhite, scaledWhite, scaledWhite)); + strip.show(); + delay(random(5, 100)); + currentDataPoint++; + currentDataPoint = currentDataPoint%NUM_Y_VALUES; +} + + +// https://en.wikipedia.org/wiki/Moving_average#Simple_moving_average +float simple_moving_average() { + uint32_t startingValue = currentDataPoint; + uint32_t endingValue = (currentDataPoint+1)%NUM_Y_VALUES; + float simple_moving_average_current = simple_moving_average_previous + + (yValues[startingValue])/NUM_Y_VALUES - + (yValues[endingValue])/NUM_Y_VALUES; + + simple_moving_average_previous = simple_moving_average_current; + return simple_moving_average_current; +}