From 707ddc18f2dd4f5b983a21df2528e88b97be6a20 Mon Sep 17 00:00:00 2001 From: Com1t Date: Wed, 26 Feb 2020 15:57:09 +0800 Subject: [PATCH 1/5] Clean up --- RECEIVE/RECEIVE.ino | 34 ------ SEND/SEND.ino | 24 ----- inertial_sensing_no_lib/sketch_aug11a.ino | 108 -------------------- inertial_sensing_with_lib/sketch_jul12a.ino | 93 ----------------- 4 files changed, 259 deletions(-) delete mode 100644 RECEIVE/RECEIVE.ino delete mode 100644 SEND/SEND.ino delete mode 100644 inertial_sensing_no_lib/sketch_aug11a.ino delete mode 100644 inertial_sensing_with_lib/sketch_jul12a.ino diff --git a/RECEIVE/RECEIVE.ino b/RECEIVE/RECEIVE.ino deleted file mode 100644 index 0dc2b1d..0000000 --- a/RECEIVE/RECEIVE.ino +++ /dev/null @@ -1,34 +0,0 @@ -#include -#define RXD 6 -#define TXD 5 -const uint8_t code[4] = {'O','P','E','N'}; -SoftwareSerial RC( TXD, RXD); // RX, TX - -void setup() { - pinMode(13,OUTPUT); - Serial.begin(9600); - RC.begin(9600); -} - -void loop() { - uint8_t i = 0; - while(RC.available()){ - if( RC.read() != code[i] ){ - break; - } - delay(1); - i ++; - if( i == 4 ){ - lightOn(13); - } - } - lightOff(13); -} -void lightOn( uint8_t pin ){ - digitalWrite( pin, HIGH); - delay(1000); -} -void lightOff( uint8_t pin ){ - digitalWrite( pin, LOW); -} - diff --git a/SEND/SEND.ino b/SEND/SEND.ino deleted file mode 100644 index 3f82b24..0000000 --- a/SEND/SEND.ino +++ /dev/null @@ -1,24 +0,0 @@ -#include -#define RXD 6 -#define TXD 5 -#define EN 12 -#define IN 4 - -SoftwareSerial RC(TXD,RXD); //RX TX - -void setup() { - RC.begin(9600); - pinMode(IN,INPUT); - pinMode(EN,OUTPUT); -} - -void loop() { - digitalWrite(EN,HIGH); - bool state = digitalRead(4); - if(!state){ - digitalWrite(EN,LOW); - delay(1); - RC.print("OPEN"); - delay(200); - } -} diff --git a/inertial_sensing_no_lib/sketch_aug11a.ino b/inertial_sensing_no_lib/sketch_aug11a.ino deleted file mode 100644 index ea4bf34..0000000 --- a/inertial_sensing_no_lib/sketch_aug11a.ino +++ /dev/null @@ -1,108 +0,0 @@ -#include -#define devAddr 0x68 -#define GYRO_CONFIG 0x1B -#define ACCEL_CONFIG 0x1C -#define ACCEL_XOUT_H 0x3B -#define ACCEL_YOUT_H 0x3D -#define ACCEL_ZOUT_H 0x3F -#define PWR_MGMT_1 0x6B -#define PWR_MGMT_2 0x6C -int8_t i = 0; -int16_t ax, ay, az; -float lastY[3] = {}; -float lastZ[3] = {}; - -void getAcceleration( int16_t* x, int16_t* y, int16_t* z); -bool calculateAbsDiff(float x, float y); - -void setup() { - Wire.begin(); - //wake up - Serial.begin(38400); - Wire.beginTransmission(devAddr); //开启MPU6050的传输 - Wire.write(PWR_MGMT_1); //指定寄存器地址 - Wire.write(0); //写入一个字节的数据 - Wire.endTransmission(true); //结束传输,true表示释放总线 - //set to cycle and disable temperature sensor and set clock source - Wire.beginTransmission(devAddr); - Wire.write(PWR_MGMT_1); - Wire.write(B00101001); - Wire.endTransmission(true); - //set gyro scale - Wire.beginTransmission(devAddr); - Wire.write(GYRO_CONFIG); - Wire.write(B00000000); - Wire.endTransmission(true); - //set range to +4g/-4g - Wire.beginTransmission(devAddr); - Wire.write(ACCEL_CONFIG); - Wire.write(B00001000); - Wire.endTransmission(true); - //set wake frequency - Wire.beginTransmission(devAddr); - Wire.write(PWR_MGMT_2); - Wire.write(B01000111); - Wire.endTransmission(true); - pinMode(13,OUTPUT); -} - -void loop() { - // read raw accel measurements from device - getAcceleration(&ax, &ay, &az); - float readAy = ay; - float readAz = az; - readAy = (readAy / 32768) * 39.2; - readAz = (readAz / 32768) * 39.2; - - Serial.print(readAy); Serial.print("\t"); - Serial.print(readAz); Serial.print("\n"); - Serial.print(calculateAbsDiff(lastY[i], readAy)); Serial.print("\t"); - Serial.print(calculateAbsDiff(lastZ[i], readAz)); Serial.print("\n"); - Serial.print("\n"); - bool next = 0; - - if( ((calculateAbsDiff(lastY[i], readAy) | calculateAbsDiff(lastZ[i], readAz)) & readAy > 0 & readAz > 0) ){ - delay(50); - getAcceleration(&ax, &ay, &az); - readAy = ay; - readAz = az; - readAy = (readAy / 32768) * 39.2; - readAz = (readAz / 32768) * 39.2; - if( ((calculateAbsDiff(lastY[i], readAy) | calculateAbsDiff(lastZ[i], readAz)) & readAy > 0 & readAz > 0) ){ - digitalWrite( 13, HIGH); - delay(500); - } - } - else{ - lastY[i] = readAy; - lastZ[i] = readAz; - } - i ++; - if(i == 3){ - i = 0; - } - digitalWrite( 13, LOW); - delay(50); -} -void getAcceleration( int16_t* x, int16_t* y, int16_t* z){ - Wire.beginTransmission(devAddr); //开启MPU6050的传输 - Wire.write(ACCEL_XOUT_H); //指定寄存器地址 - Wire.requestFrom(devAddr, 6, true); //将输据读出到缓存 - Wire.endTransmission(true); //关闭传输模式 - *x = Wire.read() << 8 | Wire.read(); //两个字节组成一个16位整数 - *y = Wire.read() << 8 | Wire.read(); //两个字节组成一个16位整数 - *z = Wire.read() << 8 | Wire.read(); //两个字节组成一个16位整数 -} -bool calculateAbsDiff(float x, float y){ - x = abs(x); - y = abs(y); - float z; - z = x - y; - z = abs(z); - if( z > 0.8 ){ - return true; - } - else{ - return false; - } -} diff --git a/inertial_sensing_with_lib/sketch_jul12a.ino b/inertial_sensing_with_lib/sketch_jul12a.ino deleted file mode 100644 index 4ec3870..0000000 --- a/inertial_sensing_with_lib/sketch_jul12a.ino +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include -#include - -MPU6050 accel; - -int8_t i = 0; -int16_t ax, ay, az; -float lastY[3] = {}; -float lastZ[3] = {}; - -float calculateAbsDiff(float &x, float &y); - -void setup() { - Wire.begin(); - // initialize serial communication - // (38400 chosen because it works as well at 8MHz as it does at 16MHz, but - // it's really up to you depending on your project) - Serial.begin(38400); - // initialize device - Serial.println("Initializing I2C devices..."); - accel.initialize(); - //set range to +4g/-4g - accel.setFullScaleAccelRange(MPU6050_ACCEL_FS_4); - Serial.println(accel.getFullScaleAccelRange()); - //setting to power saving configuration - accel.setWakeCycleEnabled(2); - accel.setTempSensorEnabled(0); - accel.setWakeFrequency(1); - accel.setStandbyXGyroEnabled(1); - accel.setStandbyYGyroEnabled(1); - accel.setStandbyZGyroEnabled(1); - // verify connection - Serial.println("Testing device connections..."); - Serial.println(accel.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed"); - pinMode(13,OUTPUT); -} - -void loop() { - // read raw accel measurements from device - accel.getAcceleration(&ax, &ay, &az); - float readAy = ay; - float readAz = az; - readAy = (readAy / 32768) * 39.2; - readAz = (readAz / 32768) * 39.2; - - Serial.print(readAy); Serial.print("\t"); - Serial.print(readAz); Serial.print("\n"); - Serial.print(calculateAbsDiff(lastY[i], readAy)); Serial.print("\t"); - Serial.print(calculateAbsDiff(lastZ[i], readAz)); Serial.print("\n"); - Serial.print("\n"); - bool next = 0; - - if( calculateAbsDiff(lastY[i], readAy) > 1.00 && calculateAbsDiff(lastZ[i], readAz) > 1.00 && readAy > 0 && readAz > 0 ){ - lastY[i] = readAy; - lastZ[i] = readAz; - next = 1; - i ++; - if(i == 3){ - i = 0; - } - delay(50); - } - - if( next ){ - accel.getAcceleration(&ax, &ay, &az); - readAy = ay; - readAz = az; - readAy = (readAy / 32768) * 39.2; - readAz = (readAz / 32768) * 39.2; - if( calculateAbsDiff(lastY[i], readAy) > 1.00 && calculateAbsDiff(lastZ[i], readAz) > 1.00 && readAy > 0 && readAz > 0 ){ - digitalWrite( 13, HIGH); - delay(500); - } - } - digitalWrite( 13, LOW); - lastY[i] = readAy; - lastZ[i] = readAz; - i ++; - if(i == 3){ - i = 0; - } - delay(50); -} - -float calculateAbsDiff(float &x, float &y){ - x = abs(x); - y = abs(y); - float z; - z = x - y; - z = abs(z); - return z; -} From 5c7e1d94462e321550d376bf414db0bb5eeafb54 Mon Sep 17 00:00:00 2001 From: Com1t Date: Wed, 26 Feb 2020 15:58:51 +0800 Subject: [PATCH 2/5] Create RECEIVE.ino --- RECEIVE/RECEIVE.ino | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 RECEIVE/RECEIVE.ino diff --git a/RECEIVE/RECEIVE.ino b/RECEIVE/RECEIVE.ino new file mode 100644 index 0000000..0dc2b1d --- /dev/null +++ b/RECEIVE/RECEIVE.ino @@ -0,0 +1,34 @@ +#include +#define RXD 6 +#define TXD 5 +const uint8_t code[4] = {'O','P','E','N'}; +SoftwareSerial RC( TXD, RXD); // RX, TX + +void setup() { + pinMode(13,OUTPUT); + Serial.begin(9600); + RC.begin(9600); +} + +void loop() { + uint8_t i = 0; + while(RC.available()){ + if( RC.read() != code[i] ){ + break; + } + delay(1); + i ++; + if( i == 4 ){ + lightOn(13); + } + } + lightOff(13); +} +void lightOn( uint8_t pin ){ + digitalWrite( pin, HIGH); + delay(1000); +} +void lightOff( uint8_t pin ){ + digitalWrite( pin, LOW); +} + From 29271c0286f27879509e45a3221da8429ecafd7f Mon Sep 17 00:00:00 2001 From: Com1t Date: Wed, 26 Feb 2020 16:02:10 +0800 Subject: [PATCH 3/5] Modied RECEIVE.ino Modified RECEIVE.ino to be capable with driving RGB LED strips and with time switch --- RECEIVE/RECEIVE.ino | 34 ------ RGB_LED/RGB_LED.ino | 260 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 260 insertions(+), 34 deletions(-) delete mode 100644 RECEIVE/RECEIVE.ino create mode 100644 RGB_LED/RGB_LED.ino diff --git a/RECEIVE/RECEIVE.ino b/RECEIVE/RECEIVE.ino deleted file mode 100644 index 0dc2b1d..0000000 --- a/RECEIVE/RECEIVE.ino +++ /dev/null @@ -1,34 +0,0 @@ -#include -#define RXD 6 -#define TXD 5 -const uint8_t code[4] = {'O','P','E','N'}; -SoftwareSerial RC( TXD, RXD); // RX, TX - -void setup() { - pinMode(13,OUTPUT); - Serial.begin(9600); - RC.begin(9600); -} - -void loop() { - uint8_t i = 0; - while(RC.available()){ - if( RC.read() != code[i] ){ - break; - } - delay(1); - i ++; - if( i == 4 ){ - lightOn(13); - } - } - lightOff(13); -} -void lightOn( uint8_t pin ){ - digitalWrite( pin, HIGH); - delay(1000); -} -void lightOff( uint8_t pin ){ - digitalWrite( pin, LOW); -} - diff --git a/RGB_LED/RGB_LED.ino b/RGB_LED/RGB_LED.ino new file mode 100644 index 0000000..c48137b --- /dev/null +++ b/RGB_LED/RGB_LED.ino @@ -0,0 +1,260 @@ +#include +#include +#include +// Interrupt pin +#define readPin 2 +// RX TX pin of RC device +#define RXD 3 +#define TXD 4 +// led pins +#define R 9 +#define G 6 +#define B 5 +// EEPROM addresses +#define counterAddr 0x000 +#define Raddr 0x001 +#define Gaddr 0x002 +#define Baddr 0x003 +// DS3231 and time configuration +#define I2C_ADDRESS 0x68 +#define startTime 1630 +#define stopTime 2330 +// MAX44009 I2C address is 0x4A(74) +#define lightAddr 0x4A + +// open light code +const uint8_t code[4] = {'O','P','E','N'}; +// open light gap time +const uint32_t lightGap = 10000; +uint32_t lastTime = 0; +uint32_t thisTime = millis(); +// debouncing parameters +const uint8_t gap = 200; +volatile uint32_t postime = 0; +volatile uint32_t nowtime = millis(); +// R, G, B luminance +volatile uint8_t Rlumi = 0; +volatile uint8_t Glumi = 0; +volatile uint8_t Blumi = 0; +// now phase +volatile uint8_t counter = 0; + +SoftwareSerial RC( TXD, RXD); // RX, TX + +uint8_t bcdTodec(uint8_t val); +uint16_t getTime(); +float getLumi(); +void stateChange(); +void Change(); +void smoothChange(); +void(* resetFunc) (void) = 0; + +void setup() { + RC.begin(9600); + Wire.begin(); + pinMode( 13, OUTPUT); + pinMode( R, OUTPUT); + pinMode( G, OUTPUT); + pinMode( B, OUTPUT); + pinMode( readPin, INPUT); + Wire.beginTransmission(lightAddr); + // Select configuration register + Wire.write(0x02); + // Continuous mode, Integration time = 800 ms + Wire.write(0x80); + // Stop I2C transmission + Wire.endTransmission(); + counter = EEPROM.read(counterAddr); + attachInterrupt(digitalPinToInterrupt(readPin), stateChange, RISING); +} + + +void loop() { + uint8_t j = 0; + char readCode[4] = {}; + while(RC.available()){ + readCode[j] = RC.read(); + delay(1); + j++; + if ( j == 4 ){ + j = 0; + for( int i = 0; i < 4; i++ ){ + if( readCode[i] == code[i] ){ + j++; + } + if( j == 4 ){ + thisTime = millis(); + if( (thisTime - lastTime) >= lightGap ){ + lastTime = millis(); + uint16_t curTime = getTime(); + float lumi = getLumi(); + if( (curTime > startTime) && (curTime < stopTime) && (counter == 0) && (lumi <= 5) ){ + smoothChange(); + break; + } + } + } + } + } + } + switch(counter){ + case 0: + digitalWrite( R, LOW); + digitalWrite( G, LOW); + digitalWrite( B, LOW); + break; + case 1: + change(); + break; + case 2: + smoothChange(); + break; + case 3: + analogWrite( R, EEPROM.read(Raddr)); + analogWrite( G, EEPROM.read(Gaddr)); + analogWrite( B, EEPROM.read(Baddr)); + break; + } +} + +void stateChange(){ + nowtime = millis(); + if( (nowtime - postime) >= gap ){ + counter ++; + if( counter == 4){ + counter = 0; + } + EEPROM.write( Raddr,Rlumi); + EEPROM.write( Gaddr,Glumi); + EEPROM.write( Baddr,Blumi); + EEPROM.write( counterAddr, counter); + postime = millis(); + resetFunc(); + } + else{ + return 0; + } +} + +void change() { + // White + digitalWrite( R, HIGH); + digitalWrite( G, HIGH); + digitalWrite( B, HIGH); + delay(2500); + // Yellow + digitalWrite( B, LOW); + delay(2500); + // Green + digitalWrite( R, LOW); + delay(2500); + // Light Blue + digitalWrite( B, HIGH); + delay(2500); + // Deep Blue + digitalWrite( G, LOW); + delay(2500); + // Purple + digitalWrite( R, HIGH); + delay(2500); + // Red + digitalWrite( B, LOW); + delay(2500); +} +void smoothChange() { + // White + for( int i = 0; i <= 255; i++ ){ + analogWrite( R, i); + analogWrite( G, i); + analogWrite( B, i); + Rlumi = i; + Glumi = i; + Blumi = i; + delay(10); + } + // Yellow + for( int i = 255; i >= 0; i-- ){ + analogWrite( B, i); + delay(10); + Blumi = i; + } + // Green + for( int i = 255; i >= 0; i-- ){ + analogWrite( R, i); + Rlumi = i; + delay(10); + } + // Light Blue + for( int i = 0; i <= 255; i++ ){ + analogWrite( B, i); + Blumi = i; + delay(10); + } + // Deep Blue + for( int i = 255; i >= 0; i-- ){ + analogWrite( G, i); + Glumi = i; + delay(10); + } + // Purple + for( int i = 0; i <= 255; i++ ){ + analogWrite( R, i); + Rlumi = i; + delay(10); + } + // Red + for( int i = 255; i >= 0; i-- ){ + analogWrite( B, i); + Blumi = i; + delay(10); + } + // Nothing + for( int i = 255; i >= 0; i-- ){ + analogWrite( R, i); + Rlumi = i; + delay(10); + } +} +// BCD to DEC +uint8_t bcdTodec(uint8_t val){ + return ((val / 16 * 10) + (val % 16)); +} +// read time from DS3231 +uint16_t getTime(){ + Wire.beginTransmission(I2C_ADDRESS); + Wire.write(0); + Wire.endTransmission(); + Wire.requestFrom(I2C_ADDRESS, 3); + uint16_t curTime, m, s; // minutes, seconds + s = bcdTodec(Wire.read() & 0x7f); + m = bcdTodec(Wire.read()); + curTime = bcdTodec(Wire.read() & 0x7f); + curTime = (curTime * 100) + m; + return curTime; +} +// read luminance from max44009 +float getLumi(){ + unsigned int data[2] = {}; + // Start I2C Transmission + Wire.beginTransmission(lightAddr); + // Select data register + Wire.write(0x03); + // Stop I2C transmission + Wire.endTransmission(); + // Request 2 bytes of data + Wire.requestFrom(lightAddr, 2); + // Read 2 bytes of data + // luminance msb, luminance lsb + if (Wire.available() == 2) + { + data[0] = Wire.read(); + data[1] = Wire.read(); + } + // Convert the data to lux + int exponent = (data[0] & 0xF0) >> 4; + int mantissa = ((data[0] & 0x0F) << 4) | (data[1] & 0x0F); + float luminance = pow(2, exponent) * mantissa * 0.045; + + return luminance; +} + From 1759914236b45e8760de9db0ea18359e8a1dca70 Mon Sep 17 00:00:00 2001 From: Com1t Date: Wed, 26 Feb 2020 16:04:41 +0800 Subject: [PATCH 4/5] Create RGB_LED_without_button.ino Remove onboard button(not a useful feature on board) --- .../RGB_LED_without_button.ino | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 RGB_LED_without_button/RGB_LED_without_button.ino diff --git a/RGB_LED_without_button/RGB_LED_without_button.ino b/RGB_LED_without_button/RGB_LED_without_button.ino new file mode 100644 index 0000000..d75ffb0 --- /dev/null +++ b/RGB_LED_without_button/RGB_LED_without_button.ino @@ -0,0 +1,159 @@ +#include +#include +// RX TX pin of RC device +#define RXD 3 +#define TXD 4 +// led pins +#define R 9 +#define G 6 +#define B 5 +// DS3231 and time configuration +#define I2C_ADDRESS 0x68 +#define startTime 1630 +#define stopTime 2330 +// MAX44009 I2C address is 0x4A(74) +#define lightAddr 0x4A + +// open light code +const char code[4] = {'O','P','E','N'}; + +SoftwareSerial RC( TXD, RXD); // RX, TX + +uint8_t bcdTodec(uint8_t val); +uint16_t getTime(); +float getLumi(); +void smoothChange(); +void(* resetFunc) (void) = 0; + +void setup() { + RC.begin(9600); + Wire.begin(); + pinMode( R, OUTPUT); + pinMode( G, OUTPUT); + pinMode( B, OUTPUT); + Wire.beginTransmission(lightAddr); + // Select configuration register + Wire.write(0x02); + // Continuous mode, Integration time = 800 ms + Wire.write(0x80); + // Stop I2C transmission + Wire.endTransmission(); +} + + +void loop() { + uint8_t j = 0; + char readCode[4] = {}; + while(RC.available()){ + readCode[j] = RC.read(); + delay(2); + j++; + if ( j == 4 ){ + j = 0; + for( int i = 0; i < 4; i++ ){ + if( readCode[i] == code[i] ){ + j++; + } + if( j == 4 ){ + uint16_t curTime = getTime(); + float lumi = getLumi(); + if( (curTime > startTime) && (curTime < stopTime) && (lumi <= 5) ){ + smoothChange(); + } + resetFunc(); + } + } + } + } +} + +void smoothChange() { + // White + for( int i = 0; i <= 255; i++ ){ + analogWrite( R, i); + analogWrite( G, i); + analogWrite( B, i); + delay(10); + } + // Yellow + for( int i = 255; i >= 0; i-- ){ + analogWrite( B, i); + delay(10); + } + // Green + for( int i = 255; i >= 0; i-- ){ + analogWrite( R, i); + delay(10); + } + // Light Blue + for( int i = 0; i <= 255; i++ ){ + analogWrite( B, i); + delay(10); + } + // Deep Blue + for( int i = 255; i >= 0; i-- ){ + analogWrite( G, i); + delay(10); + } + // Purple + for( int i = 0; i <= 255; i++ ){ + analogWrite( R, i); + delay(10); + } + // Red + for( int i = 255; i >= 0; i-- ){ + analogWrite( B, i); + delay(10); + } + // Nothing + for( int i = 255; i >= 0; i-- ){ + analogWrite( R, i); + delay(10); + } +} + +// BCD to DEC +uint8_t bcdTodec(uint8_t val){ + return ((val / 16 * 10) + (val % 16)); +} + +// read time from DS3231 +uint16_t getTime(){ + Wire.beginTransmission(I2C_ADDRESS); + Wire.write(0); + Wire.endTransmission(); + Wire.requestFrom(I2C_ADDRESS, 3); + uint16_t curTime, m, s; // minutes, seconds + s = bcdTodec(Wire.read() & 0x7f); + m = bcdTodec(Wire.read()); + curTime = bcdTodec(Wire.read() & 0x7f); + curTime = (curTime * 100) + m; + return curTime; +} + +// read luminance from max44009 +float getLumi(){ + unsigned int data[2] = {}; + // Start I2C Transmission + Wire.beginTransmission(lightAddr); + // Select data register + Wire.write(0x03); + // Stop I2C transmission + Wire.endTransmission(); + // Request 2 bytes of data + Wire.requestFrom(lightAddr, 2); + // Read 2 bytes of data + // luminance msb, luminance lsb + if (Wire.available() == 2) + { + data[0] = Wire.read(); + data[1] = Wire.read(); + } + // Convert the data to lux + int exponent = (data[0] & 0xF0) >> 4; + int mantissa = ((data[0] & 0x0F) << 4) | (data[1] & 0x0F); + float luminance = pow(2, exponent) * mantissa * 0.045; + + return luminance; +} + From c670cdcfe2a2f5cc93defab757d646fb90d15f5b Mon Sep 17 00:00:00 2001 From: Com1t Date: Wed, 26 Feb 2020 16:42:51 +0800 Subject: [PATCH 5/5] Update README.md --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c3524e4..fa61a27 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,12 @@ # Auto-Light -Light will be control by a inertial sensor +Auto light is consisted by two parts +1. inertial remote controller +2. control board to control the LED strips +# RGB_LED +Provides a button to switch the LED strips into different modes(No restriction), +and a receiver in pair with the remote controller +(while receiving signal from remote controller the LED strips can only be lit on at right time, and right ambient light). +# RGB_LED_without_button +Removed a button to switch the LED strips into different modes(to reduce the control board size, also, it's redundant), +and a receiver in pair with the remote controller +(while receiving signal from remote controller the LED strips can only be lit on at right time, and right ambient light).