Skip to content

Instantly share code, notes, and snippets.

@dj0
Created August 13, 2018 13:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dj0/f80ff740040b9ca3acd4aead1a428824 to your computer and use it in GitHub Desktop.
Save dj0/f80ff740040b9ca3acd4aead1a428824 to your computer and use it in GitHub Desktop.
digispark銅鑼
#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