diff --git a/Adafruit_Circuit_Playground.h b/Adafruit_Circuit_Playground.h
new file mode 100644
index 0000000..bc844ae
--- /dev/null
+++ b/Adafruit_Circuit_Playground.h
@@ -0,0 +1,156 @@
+/*------------------------------------------------------------------------
+ This file is part of the Adafruit Dot Star library.
+
+ Adafruit Dot Star is free software: you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation, either version 3 of
+ the License, or (at your option) any later version.
+
+ Adafruit Dot Star 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with DotStar. If not, see .
+ ------------------------------------------------------------------------*/
+
+#ifndef _ADAFRUIT_CIRCUITPLAYGROUND_H_
+#define _ADAFRUIT_CIRCUITPLAYGROUND_H_
+
+#include
+#include "utility/Adafruit_CPlay_NeoPixel.h"
+#include "utility/Adafruit_CPlay_LIS3DH.h"
+#include "utility/Adafruit_CPlay_Mic.h"
+#include "utility/Adafruit_CPlay_Speaker.h"
+#include "utility/CP_Firmata.h"
+
+#ifdef __AVR__ // Circuit Playground 'classic'
+ #include "utility/CPlay_CapacitiveSensor.h"
+#else
+ #include "utility/Adafruit_CPlay_FreeTouch.h"
+ #include "utility/IRLibCPE.h"
+#endif
+
+#ifndef NOT_AN_INTERRUPT // Not defined in Arduino 1.0.5
+ #define NOT_AN_INTERRUPT -1
+#endif
+
+#ifdef __AVR__ // Circuit Playground 'classic'
+ #define CPLAY_CAPSENSE_SHARED 30
+ #define CPLAY_REDLED 13
+ #define CPLAY_NEOPIXELPIN 17
+ #define CPLAY_SLIDESWITCHPIN 21
+ #define CPLAY_LEFTBUTTON 4
+ #define CPLAY_RIGHTBUTTON 19
+ #define CPLAY_LIGHTSENSOR A5
+ #define CPLAY_THERMISTORPIN A0
+ #define CPLAY_SOUNDSENSOR A4
+ #define CPLAY_BUZZER 5
+ #define CPLAY_LIS3DH_CS 8
+ #define CPLAY_LIS3DH_INTERRUPT 7
+ #define CPLAY_LIS3DH_ADDRESS 0x18
+#else // Circuit Playground Express
+ #define CPLAY_LEFTBUTTON 4
+ #define CPLAY_RIGHTBUTTON 5
+ #define CPLAY_SLIDESWITCHPIN 7
+ #define CPLAY_NEOPIXELPIN 8
+ #define CPLAY_REDLED 13
+ #define CPLAY_IR_EMITTER 25
+ #define CPLAY_IR_RECEIVER 26
+ #define CPLAY_BUZZER A0
+ #define CPLAY_LIGHTSENSOR A8
+ #define CPLAY_THERMISTORPIN A9
+ #define CPLAY_SOUNDSENSOR A4 // TBD I2S
+ #define CPLAY_LIS3DH_CS -1 // I2C
+ #define CPLAY_LIS3DH_INTERRUPT 27
+ #define CPLAY_LIS3DH_ADDRESS 0x19
+#endif
+
+#define SERIESRESISTOR 10000
+// resistance at 25 degrees C
+#define THERMISTORNOMINAL 10000
+// temp. for nominal resistance (almost always 25 C)
+#define TEMPERATURENOMINAL 25
+
+// The beta coefficient of the thermistor (usually 3000-4000)
+#define BCOEFFICIENT 3380
+// the value of the 'other' resistor
+
+// Configuration to tune the color sensing logic:
+#define LIGHT_SETTLE_MS 100 // Amount of time (in milliseconds) to wait between
+ // changing the pixel color and reading the light
+ // sensor.
+
+
+class Adafruit_CircuitPlayground {
+ public:
+ boolean begin(uint8_t brightness=20);
+
+ Adafruit_CPlay_NeoPixel strip;
+ Adafruit_CPlay_LIS3DH lis;
+ Adafruit_CPlay_Mic mic;
+ Adafruit_CPlay_Speaker speaker;
+
+#ifdef __AVR__ // Circuit Playground 'classic'
+ CPlay_CapacitiveSensor cap[8];
+#else
+ Adafruit_CPlay_FreeTouch cap[7];
+ IRrecvPCI irReceiver;
+ IRdecode irDecoder;
+ IRsend irSend;
+#endif
+
+ boolean slideSwitch(void);
+ void redLED(boolean v);
+ void playTone(uint16_t freq, uint16_t time, boolean wait=true);
+ boolean leftButton(void);
+ boolean rightButton(void);
+ uint16_t lightSensor(void);
+ uint16_t soundSensor(void);
+ float temperature(void);
+ float temperatureF(void);
+
+ uint16_t readCap(uint8_t p, uint8_t samples=10);
+
+ // Accelerometer
+ float motionX(void);
+ float motionY(void);
+ float motionZ(void);
+ void setAccelRange(lis3dh_range_t range) { lis.setRange(range); }
+ void setAccelTap(uint8_t c, uint8_t clickthresh)
+ { lis.setClick(c, clickthresh, 10, 20, 255); }
+ uint8_t getAccelTap(void) { return (lis.getClick() >> 8) & 0x3; }
+
+
+ // neopixels
+ void clearPixels(void) { strip.clear(); strip.show(); }
+ void setPixelColor(uint8_t p, uint32_t c) {strip.setPixelColor(p, c); strip.show();}
+ void setPixelColor(uint8_t p, uint8_t r, uint8_t g, uint8_t b) {strip.setPixelColor(p, r, g, b); strip.show();}
+ void setBrightness(uint16_t b){strip.setBrightness(b);}
+
+ uint32_t colorWheel(uint8_t x);
+
+ // Basic RGB color sensing with the light sensor and nearby neopixel.
+ // Both functions do the same thing and just differ in how they return the
+ // result, either as explicit RGB bytes or a 24-bit RGB color value.
+ void senseColor(uint8_t& red, uint8_t& green, uint8_t& blue);
+ uint32_t senseColor() {
+ // Use the individual color component color sense function and then recombine
+ // tbe components into a 24-bit color value.
+ uint8_t red, green, blue;
+ senseColor(red, green, blue);
+ return ((uint32_t)red << 16) | ((uint32_t)green << 8) | blue;
+ }
+
+ boolean isExpress(void);
+
+ private:
+
+
+};
+
+
+extern Adafruit_CircuitPlayground CircuitPlayground;
+
+#endif
diff --git a/utility/Adafruit_CPlay_Speaker.cpp b/utility/Adafruit_CPlay_Speaker.cpp
index 77de141..1a3d6c6 100644
--- a/utility/Adafruit_CPlay_Speaker.cpp
+++ b/utility/Adafruit_CPlay_Speaker.cpp
@@ -12,17 +12,6 @@
void Adafruit_CPlay_Speaker::begin(void) {
#ifdef __AVR__
- // Set up Timer4 for fast PWM on !OC4A
- PLLFRQ = (PLLFRQ & 0xCF) | 0x30; // Route PLL to async clk
- TCCR4A = _BV(COM4A0) | _BV(PWM4A); // Clear on match, PWMA on
- TCCR4B = _BV(PWM4X) |_BV(CS40); // PWM invert, 1:1 prescale
- TCCR4D = 0; // Fast PWM mode
- TCCR4E = 0; // Not enhanced mode
- TC4H = 0; // Not 10-bit mode
- DT4 = 0; // No dead time
- OCR4C = 255; // TOP
- OCR4A = 127; // 50% duty (idle position) to start
- started = true;
pinMode(5, OUTPUT); // Enable output
#else
pinMode(CPLAY_SPEAKER_SHUTDOWN, OUTPUT);
@@ -80,9 +69,24 @@ void Adafruit_CPlay_Speaker::set(uint8_t value) {
void Adafruit_CPlay_Speaker::playSound(
const uint8_t *data, uint32_t len, uint16_t sampleRate, boolean tenBit) {
- if(!started) begin();
-
uint32_t i;
+
+ if(!started) {
+#ifdef __AVR__
+ // Set up Timer4 for fast PWM on !OC4A
+ PLLFRQ = (PLLFRQ & 0xCF) | 0x30; // Route PLL to async clk
+ TCCR4A = _BV(COM4A0) | _BV(PWM4A); // Clear on match, PWMA on
+ TCCR4B = _BV(PWM4X) |_BV(CS40); // PWM invert, 1:1 prescale
+ TCCR4D = 0; // Fast PWM mode
+ TCCR4E = 0; // Not enhanced mode
+ TC4H = 0; // Not 10-bit mode
+ DT4 = 0; // No dead time
+ OCR4C = 255; // TOP
+ OCR4A = 127; // 50% duty (idle position) to start
+ started = true;
+#endif
+ }
+
#ifdef __AVR__
uint16_t interval = 1000000L / sampleRate;
#else