DIY en magiska ljus Box (12 / 12 steg)
Steg 12: Arduino kod kopplad
#include //use timer lib
#include
#define Funktionsid 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
int ADXAddress = 0xA7 >> 1.
variabel att hålla info av accelerometer
int X0, X1, Xg;
int Y0, Y1, Yg;
int Z1, Z0, Zg;
stift för tre färg
int ledx = 9.
int ledy = 5;
int Jonna = 6;
deklarera 7 räknare
int counterX, counterY, counterZ, counterT, counterx, countery, counterz;
3 variabel att hålla staten
int stateX, stateY, stateZ;
andning värde
int valx = 60.
int valy = 130;
int valz = 195;
andning hastighet
int fadeAmount1 = 3;
int fadeAmount2 = 6;
int fadeAmount3 = 9;
void setup() {
Serial.BEGIN(9600); Använd den seriella porten att felsöka
inledande
Wire.BEGIN();
Delay(10);
Wire.beginTransmission(ADXAddress);
Wire.write(Register_2D);
Wire.write(8);
Wire.endTransmission();
pinMode (ledx, produktionen);
pinMode (ledy, produktionen);
pinMode (Jonna, produktionen);
counterY = 0;
counterX = 0;
counterT = 0;
Ange tillståndet för X, Y, Z i off stat
stateX = 0;
stateY = 0;
stateZ = 0;
}
void loop() {
allt bort
digitalWrite (ledx, 0);
digitalWrite (ledy, 0);
digitalWrite (Jonna, 0);
Läs acc info av X, Y, Z
Wire.beginTransmission(ADXAddress);
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom (ADXAddress, 2);
om (Wire.available() < = 2);
{
X0 = Wire.read();
X1 = Wire.read();
X1 = X1 << 8.
XG = X0 + X1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Y0);
Wire.write(Register_Y1);
Wire.endTransmission();
Wire.requestFrom (ADXAddress, 2);
om (Wire.available() < = 2);
{
Y0 = Wire.read();
Y1 = Wire.read();
Y1 = Y1 << 8.
Yg = Y0 + Y1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Z0);
Wire.write(Register_Z1);
Wire.endTransmission();
Wire.requestFrom (ADXAddress, 2);
om (Wire.available() < = 2);
{
Z0 = Wire.read();
Z1 = Wire.read();
Z1 = Z1 << 8.
ZG = Z0 + Z1;
}
bedöma om acc värdet av X anländer ingången, lägga till räknaren
om (Xg > = 500 || XG < =-500) {
counterX ++;
När räknaren X startar timern börjar, och ange tydliga funktion efter 0.5s
om (counterX == 1) {
MsTimer2::set (500, Clear);
MsTimer2::start();
}
}
om counterX är mer än 16 innan clearing, öppna X trig stat (auto-changing färg)
om (counterX > = 16) {//16 kan ändras till annat nummer, de mindre ju mer känsliga
stateX =! stateX;
medan (stateX == 1) {
fading();
}
}
om (Yg > = 500 || Yg < =-500) {
kontroll av Y
counterY ++;
om (counterY == 1) {
MsTimer2::set (500, Clear);
MsTimer2::start();
}
}
om (counterY > = 16) {
stateY =! stateY;
medan (stateY == 1) {
following();
}
}
om (Zg > = 500 || ZG < =-500) {
kontroll av Z
counterZ ++;
om (counterZ == 1) {
MsTimer2::set (500, Clear);
MsTimer2::start();
}
}
om (counterZ > = 14) {
stateZ =! stateZ;
medan (stateZ == 1) {
White();
}
}
Delay(6);
Serial.Print("X=");
Serial.Print(XG);
Serial.Print ("Y =");
Serial.Print(yg);
Serial.Print ("Z =");
Serial.Print(ZG);
Serial.Print ("CX =");
Serial.Print(counterX);
Serial.Print ("CY =");
Serial.Print(counterY);
Serial.Print ("CZ =");
Serial.println(counterZ);
}
void förloppsindikatorförekomstens {
Rensa alla räknare
counterX = 0;
counterx = 0;
counterY = 0;
countery = 0;
counterZ = 0;
counterz = 0;
}
void white() {
vit färg
digitalWrite (ledx, 1);
digitalWrite (ledy, 1);
digitalWrite (Jonna, 1);
Läs acc av Z
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Z0);
Wire.write(Register_Z1);
Wire.endTransmission();
Wire.requestFrom (ADXAddress, 2);
om (Wire.available() < = 2);
{
Z0 = Wire.read();
Z1 = Wire.read();
Z1 = Z1 << 8.
ZG = Z0 + Z1;
}
om (Zg > = 500 || ZG < =-500) {
counterz ++;
om (counterz == 1) {
MsTimer2::set (500, Clear);
MsTimer2::start();
}
}
om counterZ är mer än 140, nära trig delstaten Z och gå tillbaka till den huvudsakliga funktionen
om (counterz > = 140) {
stateZ =! stateZ;
hemkomst.
}
Serial.Print("Z=");
Serial.Print(ZG);
Serial.Print ("CZ =");
Serial.println(counterz);
}
void following() {
跟随姿态变色的程序
int xfollow, yfollow, zfollow;
Wire.beginTransmission(ADXAddress);
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom (ADXAddress, 2);
om (Wire.available() < = 2);
{
X0 = Wire.read();
X1 = Wire.read();
X1 = X1 << 8.
XG = X0 + X1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Y0);
Wire.write(Register_Y1);
Wire.endTransmission();
Wire.requestFrom (ADXAddress, 2);
om (Wire.available() < = 2);
{
Y0 = Wire.read();
Y1 = Wire.read();
Y1 = Y1 << 8.
Yg = Y0 + Y1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Z0);
Wire.write(Register_Z1);
Wire.endTransmission();
Wire.requestFrom (ADXAddress, 2);
om (Wire.available() < = 2);
{
Z0 = Wire.read();
Z1 = Wire.read();
Z1 = Z1 << 8.
ZG = Z0 + Z1;
}
hålla färgen stadig av contraining värdet av X, Z. Y används för att avsluta
XG = begränsa (Xg,-272, 272);
Yg = begränsa (Yg,-272, 272);
ZG = begränsa (Zg,-272, 272);
xfollow = karta (Xg,-272, 272, 5, 250);
analogWrite (ledx, xfollow);
yfollow = karta (Yg,-290, 290, 5, 250);
analogWrite (ledy, yfollow);
zfollow = karta (Zg,-272, 272, 5, 250);
analogWrite (Jonna, zfollow);
hålla färgen stadig av contraining värde
xfollow = begränsa (xfollow, 1, 255);
yfollow = begränsa (yfollow, 1, 255);
zfollow = begränsa (zfollow, 1, 255);
om (Yg > = 500 || Yg < =-500) {
countery ++;
om (countery == 1) {
MsTimer2::set (500, Clear);
MsTimer2::start();
}
}
om (countery > = 40) {
stateY =! stateY;
hemkomst.
}
Serial.Print("Y=");
Serial.Print(yg);
Serial.Print ("CY =");
Serial.println(countery);
}
void fading() {
Auto-chaning färg
analogWrite (ledx, valx);
analogWrite (ledy, valy);
analogWrite (Jonna, valz);
VALX = valx + fadeAmount1;
Valy = valy + fadeAmount2;
Valz = valz + fadeAmount3;
om (valx < = 4 || valx > = 252) {
fadeAmount1 = - fadeAmount1;
}
om (valy < = 7 || valy > = 249) {
fadeAmount2 = - fadeAmount2;
}
om (valz < = 10 || valz > = 246) {
fadeAmount3 = - fadeAmount3;
}
Delay(90);
Wire.beginTransmission(ADXAddress);
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom (ADXAddress, 2);
om (Wire.available() < = 2);
{
X0 = Wire.read();
X1 = Wire.read();
X1 = X1 << 8.
XG = X0 + X1;
}
om (Xg > = 500 || XG < =-500) {
counterx ++;
om (counterx == 1) {
MsTimer2::set (500, Clear);
MsTimer2::start();
}
}
om (counterx > = 2) {
stateX =! stateX;
hemkomst.
}
Serial.Print("X=");
Serial.Print(XG);
Serial.Print ("CX =");
Serial.println(counterx);