You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
9.4 KiB
232 lines
9.4 KiB
5 years ago
|
/*!
|
||
|
* @file Adafruit_Circuit_Playground.h
|
||
|
*
|
||
|
* This is part of Adafruit's CircuitPlayground driver for the Arduino platform. It is
|
||
|
* designed specifically to work with the Adafruit CircuitPlayground boards.
|
||
|
*
|
||
|
* Adafruit invests time and resources providing this open source code,
|
||
|
* please support Adafruit and open-source hardware by purchasing
|
||
|
* products from Adafruit!
|
||
|
*
|
||
|
* Written by Ladyada and others for Adafruit Industries.
|
||
|
*
|
||
|
* BSD license, all text here must be included in any redistribution.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef _ADAFRUIT_CIRCUITPLAYGROUND_H_
|
||
|
#define _ADAFRUIT_CIRCUITPLAYGROUND_H_
|
||
|
|
||
|
#include <Arduino.h>
|
||
|
#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 ///< Pin is not on an interrupt
|
||
|
#endif
|
||
|
|
||
|
#ifdef __AVR__ // Circuit Playground 'classic'
|
||
|
#define CPLAY_CAPSENSE_SHARED 30 ///< capacitive sense pin
|
||
|
#define CPLAY_REDLED 13 ///< red LED pin
|
||
|
#define CPLAY_NEOPIXELPIN 17 ///< neopixel pin
|
||
|
#define CPLAY_SLIDESWITCHPIN 21 ///< slide switch pin
|
||
|
#define CPLAY_LEFTBUTTON 4 ///< left button pin
|
||
|
#define CPLAY_RIGHTBUTTON 19 ///< right button pin
|
||
|
#define CPLAY_LIGHTSENSOR A5 ///< light sensor pin
|
||
|
#define CPLAY_THERMISTORPIN A0 ///< thermistor pin
|
||
|
#define CPLAY_SOUNDSENSOR A4 ///< sound sensor pin
|
||
|
#define CPLAY_BUZZER 5 ///< buzzer pin
|
||
|
#define CPLAY_LIS3DH_CS 8 ///< LIS3DH chip select pin
|
||
|
#define CPLAY_LIS3DH_INTERRUPT 7 ///< LIS3DH interrupt pin
|
||
|
#define CPLAY_LIS3DH_ADDRESS 0x18 ///< LIS3DH I2C address
|
||
|
#else // Circuit Playground Express
|
||
|
#define CPLAY_LEFTBUTTON 4 ///< left button pin
|
||
|
#define CPLAY_RIGHTBUTTON 5 ///< right button pin
|
||
|
#define CPLAY_SLIDESWITCHPIN 7 ///< slide switch pin
|
||
|
#define CPLAY_NEOPIXELPIN 8 ///< neopixel pin
|
||
|
#define CPLAY_REDLED 13 ///< red led pin
|
||
|
#define CPLAY_IR_EMITTER 25 ///< IR emmitter pin
|
||
|
#define CPLAY_IR_RECEIVER 26 ///< IR receiver pin
|
||
|
#define CPLAY_BUZZER A0 ///< buzzer pin
|
||
|
#define CPLAY_LIGHTSENSOR A8 ///< light sensor pin
|
||
|
#define CPLAY_THERMISTORPIN A9 ///< thermistor pin
|
||
|
#define CPLAY_SOUNDSENSOR A4 ///< TBD I2S
|
||
|
#define CPLAY_LIS3DH_CS -1 ///< LIS3DH chip select pin
|
||
|
#define CPLAY_LIS3DH_INTERRUPT 27 ///< LIS3DH interrupt pin
|
||
|
#define CPLAY_LIS3DH_ADDRESS 0x19 ///< LIS3DH I2C address
|
||
|
#endif
|
||
|
|
||
|
#define SERIESRESISTOR 10000 ///< series resistor for thermistor
|
||
|
#define THERMISTORNOMINAL 10000 ///< resistance of thermistor at 25 degrees C
|
||
|
#define TEMPERATURENOMINAL 25 ///< temp. for nominal resistance (almost always 25 C)
|
||
|
|
||
|
#define BCOEFFICIENT 3380 ///< The beta coefficient of the thermistor (usually 3000-4000)
|
||
|
|
||
|
/*!
|
||
|
@brief Configuration to tune the color sensing logic:
|
||
|
Amount of time (in milliseconds) to wait between
|
||
|
changing the pixel color and reading the light
|
||
|
sensor.
|
||
|
*/
|
||
|
#define LIGHT_SETTLE_MS 100
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
@brief Class that stores state and functions for interacting with CircuitPlayground hardware
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
class Adafruit_CircuitPlayground {
|
||
|
public:
|
||
|
boolean begin(uint8_t brightness=20);
|
||
|
|
||
|
Adafruit_CPlay_NeoPixel strip; ///< the neopixel strip object
|
||
|
Adafruit_CPlay_LIS3DH lis; ///< the accelerometer object
|
||
|
Adafruit_CPlay_Mic mic; ///< the microphone object
|
||
|
Adafruit_CPlay_Speaker speaker; ///< the speaker object
|
||
|
|
||
|
#ifdef __AVR__ // Circuit Playground 'classic'
|
||
|
CPlay_CapacitiveSensor cap[8]; ///< the array of capacitive touch sensors
|
||
|
#else
|
||
|
Adafruit_CPlay_FreeTouch cap[7]; ///< the array of capacitive touch sensors
|
||
|
IRrecvPCI irReceiver; ///< the IR receiver object
|
||
|
IRdecode irDecoder; ///< the IR decoder object
|
||
|
IRsend irSend; ///< the IR send object
|
||
|
#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);
|
||
|
int16_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);
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
@brief set the range of the MEMS accelerometer.
|
||
|
@param range the range to set the accelerometer to. LIS3DH_RANGE_2_G
|
||
|
is the smallest (+-2G) but will give the greatest precision, while LIS3DH_RANGE_8_G
|
||
|
is the largest (+-8G) but with the lease precision. LIS3DH_RANGE_4_G is in the middle.
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
void setAccelRange(lis3dh_range_t range) { lis.setRange(range); }
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
@brief turn on tap detection. Tap detection can detect single taps or 'double taps'
|
||
|
(like a double-click).
|
||
|
@param c If c is 1 you will only detect single taps, one at a time.
|
||
|
If c is 2, you will be able to detect both single taps and double taps.
|
||
|
@param clickthresh the threshold over which to register a tap
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
void setAccelTap(uint8_t c, uint8_t clickthresh)
|
||
|
{ lis.setClick(c, clickthresh, 10, 20, 255); }
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
@brief test whether or not a tap has been detected
|
||
|
@return 0 if no tap is detected, 1 if a single tap is detected, and 2 or 3 if double tap is detected.
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
uint8_t getAccelTap(void) { return (lis.getClick() >> 8) & 0x3; }
|
||
|
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
@brief turn off all neopixels on the board
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
void clearPixels(void) { strip.clear(); strip.show(); }
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
@brief set the color of a neopixel on the board
|
||
|
@param p the pixel to set. Pixel 0 is above the pad labeled 'GND' right next to the
|
||
|
USB connector, while pixel 9 is above the pad labeled '3.3V' on the other side of
|
||
|
the USB connector.
|
||
|
@param c a 24bit color value to set the pixel to
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
void setPixelColor(uint8_t p, uint32_t c) {strip.setPixelColor(p, c); strip.show();}
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
@brief set the color of a neopixel on the board
|
||
|
@param p the pixel to set. Pixel 0 is above the pad labeled 'GND' right next to the
|
||
|
USB connector, while pixel 9 is above the pad labeled '3.3V' on the other side of
|
||
|
the USB connector.
|
||
|
@param r a 0 to 255 value corresponding to the red component of the desired color.
|
||
|
@param g a 0 to 255 value corresponding to the green component of the desired color.
|
||
|
@param b a 0 to 255 value corresponding to the blue component of the desired color.
|
||
|
*/
|
||
|
/**************************************************************************/
|
||
|
void setPixelColor(uint8_t p, uint8_t r, uint8_t g, uint8_t b) {strip.setPixelColor(p, r, g, b); strip.show();}
|
||
|
|
||
|
/*! @brief set the global brightness of all neopixels.
|
||
|
@param b a 0 to 255 value corresponding to the desired brightness. The default brightness
|
||
|
of all neopixels is 30. */
|
||
|
void setBrightness(uint16_t b){strip.setBrightness(b);}
|
||
|
|
||
|
/*! @brief Get a sinusoidal value from a sine table
|
||
|
@param x a 0 to 255 value corresponding to an index to the sine table
|
||
|
@returns An 8-bit sinusoidal value back */
|
||
|
uint8_t sine8(uint8_t x) { return strip.sine8(x); }
|
||
|
|
||
|
/*! @brief Get a gamma-corrected value from a gamma table
|
||
|
@param x a 0 to 255 value corresponding to an index to the gamma table
|
||
|
@returns An 8-bit gamma-corrected value back */
|
||
|
uint8_t gamma8(uint8_t x) { return strip.gamma8(x); }
|
||
|
|
||
|
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);
|
||
|
|
||
|
/**************************************************************************/
|
||
|
/*!
|
||
|
@brief detect a color using the onboard light sensor
|
||
|
@return a 24 bit color. The most significant byte is red, followed by green, and
|
||
|
the least significant byte is 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; ///< instantiated by default
|
||
|
|
||
|
#endif
|