arduino/libraries/Adafruit_Circuit_Playground/examples/mega_demo/mega_demo.ino
2018-11-03 20:21:33 +00:00

122 lines
4.7 KiB
C++

// Circuit Playground MEGA Demo
//
// Showcases interesting demos of all the components on Circuit Playground.
// This is a somewhat advanced sketch that's broken across multiple files (see
// the tabs above for all the files). When run on Circuit Playground you can
// press the left button to cycle through each demo, and the right button to
// cycle through each mode inside a demo. When the slide switch is in the -/right
// position the board will 'turn off' and go into deep sleep (pullin around 5mA
// of current), and when moved into the +/left position it will turn on and run
// the demos. Make sure the switch is on the +/left side after you upload or else
// the board won't do anything!
//
// NOTE: This example requires the Adafruit SleepyDog sleep & watchdog library
// be installed. Use the library manager to install, or grab it from its home:
// - https://github.com/adafruit/Adafruit_SleepyDog
// - https://github.com/adafruit/Adafruit_ASFcore (for Express)
//
// The following demos are available (in order):
// - NeoPixel color rainbow cycle
// This animates all 10 neopixels with a rainbow cycle. Changing the mode
// changes the speed of animation.
// - Volume level meter
// This uses the microphone to display a volume level meter. The louder the
// volume the more lights light up (and a peak level dot animates back down).
// Changing mode changes the sensitivity from medium to very high to very low
// and back to medium again (3 levels).
// - Capacitive touch instrument
// This uses the capacitive touch pads (0, 1, 2, 3, 6, 9, 10, 12) and lights up
// a nearby pixel when a pad is touched. Pressing the mode toggles between
// playing a different tone for each pad too (8 notes total covering the basic
// C4 scale).
// - Accelerometer tilt demo
// This lights up all the pixels to a color between blue and red depending on
// the value of the accelerometer. Try tilting the board around axes to see
// how it behaves. Pressing mode toggles between the X, Y, Z axis as the one
// under measurements (starts with X axis).
// - Temperature & light sensor demo
// The left half of the pixels light up blue proportional to the temperature
// of the thermistor, and the right half of the pixels light up red proportional
// to the light sensor. Pressing mode toggles between small, medium, and big
// ranges of measurements for each sensor.
//
// Author: Tony DiCola
// License: MIT License (https://opensource.org/licenses/MIT)
#include <Adafruit_CircuitPlayground.h>
#include <Wire.h>
#include <SPI.h>
#include "Adafruit_SleepyDog.h"
// Include all the demos, note that each demo is defined in a separate class to keep the sketch
// code below clean and simple.
#include "Demo.h"
#include "RainbowCycleDemo.h"
#include "VUMeterDemo.h"
#include "CapTouchDemo.h"
#include "TiltDemo.h"
#include "SensorDemo.h"
// Create an instance of each demo class.
RainbowCycleDemo rainbowCycleDemo;
VUMeterDemo vuMeterDemo;
CapTouchDemo capTouchDemo;
TiltDemo tiltDemo;
SensorDemo sensorDemo;
// Make a list of all demo class instances and keep track of the currently selected one.
int currentDemo = 0;
Demo* demos[] = {
&rainbowCycleDemo,
&vuMeterDemo,
&capTouchDemo,
&tiltDemo,
&sensorDemo
};
void setup() {
// Initialize serial port and circuit playground library.
Serial.begin(115200);
Serial.println("Circuit Playground MEGA Demo!");
CircuitPlayground.begin();
}
void loop() {
// Check if slide switch is on the left (false) and go to sleep.
while (!CircuitPlayground.slideSwitch()) {
// Turn off the pixels, then go into deep sleep for a second.
CircuitPlayground.clearPixels();
Watchdog.sleep(1000);
}
// Check for any button presses by checking their state twice with
// a delay inbetween. If the first press state is different from the
// second press state then something was pressed/released!
bool leftFirst = CircuitPlayground.leftButton();
bool rightFirst = CircuitPlayground.rightButton();
delay(10);
// Run current demo's main loop.
demos[currentDemo]->loop();
// Now check for buttons that were released.
bool leftSecond = CircuitPlayground.leftButton();
bool rightSecond = CircuitPlayground.rightButton();
// Left button will change the current demo.
if (leftFirst && !leftSecond) {
// Turn off all the pixels when entering new mode.
CircuitPlayground.clearPixels();
// Increment the current demo (looping back to zero if at end).
currentDemo += 1;
if (currentDemo >= (sizeof(demos)/sizeof(Demo*))) {
currentDemo = 0;
}
Serial.print("Changed to demo: "); Serial.println(currentDemo, DEC);
}
// Right button will change the mode of the current demo.
if (rightFirst && !rightSecond) {
demos[currentDemo]->modePress();
}
}