/*
* @file testWS2815_HC_SR501.ino
* \brief Use PIR sensor to trigger LED strip illumination
* @author https://github.com/FastLED/FastLED/blob/master/examples/ColorPalette/ColorPalette.ino
* @version 0.1 2020-08-12 Initial DRAFT
* @change 0.2 2020-12-19 added ISR handler
* @descr
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses></https:>.
*
* Copyright (c) 2020, Original developers; All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* Neither the name of the driver nor the names of its contributors may not be
* used to endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* Notes:
* ADC0 A0 D0 GPIO16 WAKE
* Reserved D1 GPIO5 SCL
* Reserved D2 GPIO4 SDA
* SSD3 GPIO10 SD3 D3 GPIO0 FLASH
* SDD2 GPIO9 SD2 D4 GPIO2 TXD1
* SDD1 MOSI SD1 3V3 3.3v
* SDCMD CS CMD GND GND
* SDD0 MISO SDO D5 GPIO14 SCLK
* SDCLK SCLK CLK D6 GPIO12 MISO
* GND GND D7 GPIO13 MOSI TXD2
* 3.3V 3V3 D8 GPIO15 CS TXD2
* EN EN RX GPIO3 RXD0
* RST RST TX GPIO1 TXD0
* GND GND GND GND
* Vin Vin 3V3 3.3V
* The shield must have the following preset assignments:
* MAC address
* static IP address
*
* HC-SR501
* Bottom view
* GND Data +Vcc
* H: repeat trigger
* L: single trigger
* Sensitivity TimeDelay
*
* 1 +Vcc 5-12V
* 2 Data
* 3 GND
* Trigger modes
* L Data goes high only once until time delay period expires
* H Data goes high as many times as object moves in detection range
*
* This example avoids the use of Serial Monitor intentionally because
* the goal is to operate the more advanced solutions without any interface to a desktop.
* It may not be a textbook quality example for emulation purposes.
*
* References:
* Libraries
* @see [FastLED](https://github.com/FastLED/FastLED/blob/master/examples/ColorPalette/ColorPalette.ino)
* @see [SPI](https://www.arduino.cc/en/Reference/SPI)
* @see [Ethernet](https://www.arduino.cc/en/Reference/Ethernet)
* @see [PubSubClient](https://github.com/knolleary/pubsubclient)
* @see [JSON](https://github.com/arduino-libraries/Arduino_JSON)
*/
#include <FastLED.h>
/*
For LED strips like WS281x (5050 LED chipset), which have:
- a data line
- ground, and
- power
only DATA_PIN needs to be defined even if a fourth wire is available.
For LED chipsets that are SPI based using four wires:
- data
- clock
- ground
- power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
Clock pin only needed for SPI based chipsets when not using hardware SPI
*/
#define DATA_PIN 2 // NOT GPIO4, NOT 4, NOT D2 BUT simply 2!!!
#define CLOCK_PIN 13 // unused for WS281x
#define NUM_LEDS 300
#define pinHC_SR501 D3 // D1 on ESP8266 NodeMCU board
CRGB leds[NUM_LEDS];
volatile boolean motionDetected = false; // flag for HC-SR501 state
/** Callback function for interrupt service routine to handle HC-SR501
*
* Check digital pin
*
* @param none
* No parameters for ISR function
*
* @return void
*/
void ICACHE_RAM_ATTR ISR_HC_SR501()
{
motionDetected = true;
}
/** Callback function for interrupt service routine to handle HC-SR501
*
* Check digital pin
*
* @param none
* No parameters for ISR function
*
* @return void
*/
void fillBlank()
{
for (int i = 0; i < NUM_LEDS; i++)
{
leds[i] = CRGB(0, 0, 0);
}
FastLED.show();
delay(1000);
}
void setup()
{
attachInterrupt(digitalPinToInterrupt(pinHC_SR501), ISR_HC_SR501, CHANGE); // LOW, CHANGE, FALLING
delay(2000); // for w/LEDs
FastLED.addLeds<WS2813, DATA_PIN, GRB>(leds, NUM_LEDS); // changed from RGB
fillBlank();
}
void fillStack()
{
int j = random(0, 6);
for (int k = 0; k < j; k++)
{
leds[k] = CRGB(0, 0, 255);
}
for (int i = j; i < NUM_LEDS; i++)
{
leds[i] = CRGB(255, 0, 0);
leds[++i] = CRGB( 0, 255, 0);
leds[++i] = CRGB( 0, 255, 0);
leds[++i] = CRGB( 0, 0, 255);
leds[++i] = CRGB( 0, 0, 255);
leds[++i] = CRGB( 0, 0, 255);
leds[++i] = CRGB( 0, 0, 0);
FastLED.show();
delay(100);
}
delay(1000);
}
void loop()
{
if (motionDetected)
{
for (int i = 0; i < 5; i++)
{
fillStack();
fillBlank();
}
motionDetected = false;
}
}
/*
// Additional notes on FastLED compact palettes:
//
// Normally, in computer graphics, the palette (or "color lookup table")
// has 256 entries, each containing a specific 24-bit RGB color. You can then
// index into the color palette using a simple 8-bit (one byte) value.
// A 256-entry color palette takes up 768 bytes of RAM, which on Arduino
// is quite possibly "too many" bytes.
//
// FastLED does offer traditional 256-element palettes, for setups that
// can afford the 768-byte cost in RAM.
//
// However, FastLED also offers a compact alternative. FastLED offers
// palettes that store 16 distinct entries, but can be accessed AS IF
// they actually have 256 entries; this is accomplished by interpolating
// between the 16 explicit entries to create fifteen intermediate palette
// entries between each pair.
//
// So for example, if you set the first two explicit entries of a compact
// palette to Green (0,255,0) and Blue (0,0,255), and then retrieved
// the first sixteen entries from the virtual palette (of 256), you'd get
// Green, followed by a smooth gradient from green-to-blue, and then Blue.
*/
Comments