Created
August 13, 2018 13:11
-
-
Save dj0/f80ff740040b9ca3acd4aead1a428824 to your computer and use it in GitHub Desktop.
digispark銅鑼
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Adafruit_NeoPixel.h> | |
#include <Wire.h> | |
#ifdef __AVR__ | |
#include <avr/power.h> | |
#endif | |
//ADXL345設定 | |
#define ADXL345 (0x1D) //address of Accelerometer 秋月製のモジュールは0x53に直す | |
#define ADXL345_X (0x32) //register for X value from Accelerometer | |
#define ADXL345_Y (0x34) //register for Y value from Accelerometer | |
#define ADXL345_Z (0x36) //register for Z value from Accelerometer | |
//neopixelを接続するPINを設定 | |
#define PIN_LED 1 | |
//-----neopixelのLEDの数を設定 | |
#define NUM_LEDS 19 | |
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN_LED, NEO_GRB + NEO_KHZ800); | |
//-----ADXL345用関数 | |
byte readRegister(uint8_t address, uint8_t reg){ | |
Wire.beginTransmission(address); | |
Wire.write(reg); | |
Wire.endTransmission(); | |
Wire.requestFrom(address, 1); | |
return Wire.read(); | |
} | |
void writeRegister(uint8_t address, uint8_t reg, uint8_t val){ | |
Wire.beginTransmission(address); | |
Wire.write(reg); | |
Wire.write(val); | |
Wire.endTransmission(); | |
} | |
//ADXL345初期設定 | |
void initAccelerometer(){ | |
//if(readRegister(ADXL345,0x00) != 0xE5) | |
writeRegister(ADXL345, 0x2D, 0x08); //power up and enable measurements | |
writeRegister(ADXL345, 0x31, 0x03); //set range to +/-4G | |
writeRegister(ADXL345, 0x2F, 0x20); //INT_MAP | |
writeRegister(ADXL345, 0x2A, 0x07); //AXES | |
writeRegister(ADXL345, 0x21, 0x40); //TAP_DURATION | |
writeRegister(ADXL345, 0x1D, 0x90); //TAP_THRESH | |
writeRegister(ADXL345, 0x2E, 0x40); //INT_ENABLE | |
} | |
uint16_t readAccelerometer(uint8_t reg){ | |
Wire.beginTransmission(ADXL345); | |
Wire.write(reg); | |
Wire.endTransmission(); | |
Wire.requestFrom(ADXL345, 2); | |
return (uint16_t)(Wire.read() | (Wire.read() << 8)); | |
} | |
//-----Neopixel用関数 | |
void showStrip() { | |
#ifdef ADAFRUIT_NEOPIXEL_H | |
strip.show(); | |
#endif | |
#ifndef ADAFRUIT_NEOPIXEL_H | |
FastLED.show(); | |
#endif | |
} | |
void setPixel(int Pixel, byte red, byte green, byte blue) { | |
#ifdef ADAFRUIT_NEOPIXEL_H | |
strip.setPixelColor(Pixel, strip.Color(red, green, blue)); | |
#endif | |
#ifndef ADAFRUIT_NEOPIXEL_H | |
leds[Pixel].r = red; | |
leds[Pixel].g = green; | |
leds[Pixel].b = blue; | |
#endif | |
} | |
void setAll(byte red, byte green, byte blue) { | |
for(int i = 0; i < NUM_LEDS; i++ ) { | |
setPixel(i, red, green, blue); | |
} | |
showStrip(); | |
} | |
// -----NeoPixelのアニメーション | |
void FadeInOut(byte red, byte green, byte blue){ | |
float r, g, b; | |
for(int k = 255; k >= 0; k=k-2) { | |
r = (k/256.0)*red; | |
g = (k/256.0)*green; | |
b = (k/256.0)*blue; | |
setAll(r,g,b); | |
showStrip(); | |
} | |
} | |
void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause){ | |
for(int j = 0; j < StrobeCount; j++) { | |
setAll(red,green,blue); | |
showStrip(); | |
delay(FlashDelay); | |
setAll(0,0,0); | |
showStrip(); | |
delay(FlashDelay); | |
} | |
delay(EndPause); | |
} | |
void beam(byte red, byte green, byte blue, int SpeedDelay){ | |
setAll(red,green,blue); | |
showStrip(); | |
for(int i=0; i<NUM_LEDS; i++){ | |
setPixel(i,0,0,0); | |
delay(SpeedDelay); | |
showStrip(); | |
} | |
} | |
void beam_invert(byte red, byte green, byte blue, int SpeedDelay){ | |
setAll(red,green,blue); | |
showStrip(); | |
for(int i=NUM_LEDS-1; i>=0; i--){ | |
setPixel(i,0,0,0); | |
delay(SpeedDelay); | |
showStrip(); | |
} | |
} | |
// | |
void setup() | |
{ | |
Wire.begin(); | |
initAccelerometer(); | |
pinMode(PIN_LED, OUTPUT); | |
digitalWrite(PIN_LED, LOW); | |
#if defined (__AVR_ATtiny85__) | |
if (F_CPU == 16000000) clock_prescale_set(clock_div_1); | |
#endif | |
strip.begin(); | |
strip.show(); | |
FadeInOut(0x1C, 0xFF, 0xB3); | |
setAll(0x11, 0x00, 0x00); | |
delay(1000); | |
//THRESH_TAPに正しく書き込めてるかチェック | |
if(0x90 == readRegister(ADXL345, 0x1D) & 0x90){ | |
setAll(0x00, 0x11, 0x00); | |
delay(1000); | |
} | |
setAll(0x30,0,0); | |
} | |
uint16_t x, y, z = 0; //加速度値格納するとこ | |
void loop() | |
{ | |
//加速度値読み込み | |
x = readRegister(ADXL345, 0x32); | |
y = readRegister(ADXL345, 0x34); | |
z = readRegister(ADXL345, 0x36); | |
//タップ検知したら実行 | |
if(readRegister(ADXL345, 0x30) & 0x40){ | |
switch(random(0,5)){ | |
case 0: | |
Strobe(random(30,230), random(30,230), random(30,230), 5, 20, 0); | |
break; | |
case 1: | |
beam(0xf9, y, 0x00, 10); | |
break; | |
case 2: | |
beam_invert(0x00, y, 0xf9, 10); | |
break; | |
case 3: | |
FadeInOut(0x99, 0x99, 0x00); | |
break; | |
case 4: | |
Strobe(0xf9, y, 0xf9, 5, 20, 0); | |
break; | |
default: | |
Strobe(0x00, 0xAB, 0xf9, 5, 20, 0); | |
break; | |
} | |
while((readRegister(ADXL345, 0x30) & 0x40) == 0x40){} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment