Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define ADDRESS 0x15EUL
- #define INTENSITY_RED 0x11U
- #define INTENSITY_RGB 0x14U
- #define CURRENT_RED 0x21U
- #define DMXOFF 0x30U
- #define DMXON 0x31U
- #define DMXSLOT 0x32U
- #define DMX8BIT 0x33U
- #define DMX16BIT 0x34U
- #define OFFTIME_RED 0x41U
- #define WALKTIME 0x50U
- #define DIMMINGLEVEL 0x60U
- #define FADERATE 0x61U
- #define _CHANGE_ADDRESS 0x70U
- #define READ_INTENSITY_RED 0x81U
- #define READ_CURRENT_RED 0x84U
- #define READ_OFFTIME_RED 0x87U
- #define READ_WALKTIME 0x8AU
- #define READ_DIMMINGLEVEL 0x8BU
- #define READ_FADERATE 0x8CU
- #define DIRECTACCESS_READ 0x90U // read twice
- #define DIRECTACCESS_MOVE 0x91U
- #define DIRECTACCESS_AND 0x92U
- #define DIRECTACCESS_OR 0x93U
- #define SAVEPARAMETERS 0xA0U
- #define BCCUMODID 0x50030008U
- #define CHIPID 0x40010004U
- #define REDINTS 0x500300A0U // BCCU_CH5
- #define REDINT 0x500300A4U
- #define BLUEINTS 0x50030078U
- #define STARTWALK 0x50030018U
- #include <Wire.h>
- unsigned int c[2] = {0};
- unsigned int d[4] = {0};
- unsigned int on = 0;
- unsigned int message = 0;
- unsigned long redcurr = 0;
- unsigned long redoff = 0;
- unsigned long redint = 0x00;
- unsigned long fadetime = 0x00;
- unsigned long walk = 0x00;
- unsigned long brightness = 1;
- void setup() {
- Serial.begin(9600);
- Wire.begin();
- while (on != 1) // Wait for shield to respond
- {
- I2CDMX (ADDRESS, DMXOFF); // disable DMX
- I2CWRITE2BYTES (ADDRESS, FADERATE, 0x0000); // Immediate fade
- I2CWRITE2BYTES (ADDRESS, DIMMINGLEVEL, 0x0000); // 0% brightness level
- on = I2CREAD(ADDRESS, READ_DIMMINGLEVEL); // Request for brightness level
- if (message == 1 && on == 0) // If message received and brightness level = 9%
- {
- message = 0;
- Serial.println("ON");
- on = 1; // break out of loop
- }
- }
- while (redcurr != 0x15 || redoff != 0x38 || brightness != 0)
- {
- I2CWRITE6BYTES (ADDRESS, INTENSITY_RGB, 0x0000, 0x000, 0x0000); // Off Light
- // Ensure that parameters are set up correctly. Read back and check. If wrong, write and read again.
- redcurr = I2CREAD (ADDRESS, READ_CURRENT_RED); // Read the red current intensity
- redoff = I2CREAD (ADDRESS, READ_OFFTIME_RED); // Read the off-time of the red channel
- brightness = I2CREAD (ADDRESS, READ_DIMMINGLEVEL); // Read the dimming level
- I2CWRITE2BYTES (ADDRESS, OFFTIME_RED, 0x38); // Set off-time of red channel to 0x38
- I2CWRITE2BYTES (ADDRESS, CURRENT_RED, 0x15); // Set current intensity of red channel to 0x15
- I2CWRITE2BYTES (ADDRESS, DIMMINGLEVEL, 0x0000);
- }
- delay(100);
- I2CWRITE2BYTES (ADDRESS, FADERATE, 0x0014); // Fade Rate --> 0.7s
- I2CWRITE2BYTES (ADDRESS, WALKTIME, 0x000F);
- I2CWRITE6BYTES (ADDRESS, INTENSITY_RGB, 0x0555, 0x0555, 0x0555); // White Light
- I2CWRITE2BYTES (ADDRESS, DIMMINGLEVEL, 0x0FFF); // Maximum Brightness
- delay(2000); // wait 2 sec
- // change lamp colour to red
- I2CWRITE2BYTES (ADDRESS, INTENSITY_RED, 0x0FFF); // change red colour intensity to 0xFFF
- delay(1000);
- I2CWRITE2BYTES (ADDRESS, INTENSITY_RED, 0x0000);
- delay(1000);
- delay(1000); // Read back values from slave
- Serial.print("Red Int: ");
- redint = I2CREAD (ADDRESS, READ_INTENSITY_RED); // request from shield red colour intensity
- Serial.print("Red Curr: ");
- redcurr = I2CREAD (ADDRESS, READ_CURRENT_RED); // request from shield peak current reference of red channel
- Serial.print("Red PWM: ");
- redoff = I2CREAD (ADDRESS, READ_OFFTIME_RED); // request from shield off-time of red channel
- Serial.print("Walk: ");
- walk = I2CREAD (ADDRESS, READ_WALKTIME); // request from shield walk-time
- Serial.print("Brightness: ");
- brightness = I2CREAD (ADDRESS, READ_DIMMINGLEVEL); // request from shield brightness level
- Serial.print("FadeTime: ");
- fadetime = I2CREAD (ADDRESS, READ_FADERATE); // request from shield fade rate
- I2CWRITE2BYTES (ADDRESS, WALKTIME, 48); // set walk-time 480ms
- }
- // the loop routine runs over and over again forever:
- void loop() {
- // change lamp colour to red
- I2CWRITE2BYTES (ADDRESS, INTENSITY_RED, 0x0FFF); // RED
- delay(500); // wait 500ms
- I2CWRITE2BYTES (ADDRESS, INTENSITY_RED, 0x0000); // OFF
- delay(500); // wait 500ms
- }
- /*
- Parameters (IN): int Address - Address of RGB LED Shield, Default 0x15E
- int Command - Defined I2C Commands i.e. INTENSITY_RED, INTENSITY_GREEN, INTENSITY_BLUE
- unsigned int Data - 16bit data to be written to slave
- Parameters (OUT): None
- Return Value: None
- Description: This function will write 2 bytes of word to the I2C bus line
- */
- void I2CWRITE2BYTES (int Address, int Command, unsigned int Data)
- {
- unsigned int upperByte, lowerByte; // Separate 4 byte data into 2 byte values
- lowerByte = Data;
- upperByte = Data >> 8;
- unsigned int lowerSLAD = (unsigned int) (Address & 0x00FF); // Putting address into correct format
- unsigned int upperSLAD = Address >> 8;
- upperSLAD |= 0x79; // First 5 bits 11110 and last bit '1' for a write
- Wire.beginTransmission(byte(upperSLAD)); // Start I2C transmission
- Wire.write(byte(lowerSLAD)); // address lower 8 bits of i2c address
- Wire.write(byte(Command)); // write command
- Wire.write(byte(upperByte)); // write data
- Wire.write(byte(lowerByte));
- Wire.endTransmission(true);
- }
- /*
- Parameters (IN): int Address - Address of RGB LED Shield, Default 0x15E
- int Command - Defined I2C Commands i.e. INTENSITY_RGB, CURRENT_RGB
- unsigned int DataOne, unsigned int DataTwo, unsigned int DataThree - Three 16bit data to be written to slave
- Parameters (OUT): None
- Return Value: None
- Description: This function will write 6 bytes of word to the I2C bus line
- */
- void I2CWRITE6BYTES (unsigned int Address, unsigned int Command, unsigned int DataOne, unsigned int DataTwo, unsigned int DataThree) // DataOne: Red, DataTwo: Green, DataThree: Blue
- {
- unsigned int upperByte, lowerByte; // Split each Data parameter into upper and lower 8 bytes because I2C format sends 8 bytes of data each time
- lowerByte = DataOne;
- upperByte = DataOne >> 8;
- unsigned int lowerSLAD = (unsigned int) (Address & 0x00FF);
- unsigned int upperSLAD = Address >> 8;
- upperSLAD |= 0x79; // First 5 bits 11110 and last bit '1' for a write
- Wire.beginTransmission(byte(upperSLAD)); // Red
- Wire.write(byte(lowerSLAD));
- Wire.write(byte(Command));
- Wire.write(byte(upperByte));
- Wire.write(byte(lowerByte));
- lowerByte = DataTwo;
- upperByte = DataTwo >> 8;
- Wire.write(byte(upperByte));
- Wire.write(byte(lowerByte));
- lowerByte = DataThree;
- upperByte = DataThree >> 8;
- Wire.write(byte(upperByte));
- Wire.write(byte(lowerByte));
- Wire.endTransmission(true);
- }
- /*
- Parameters (IN): int Address - Address of RGB LED Shield, Default 0x15E
- int Command - Defined I2C Commands i.e. DMX16Bit
- unsigned int DataOne, unsigned int DataTwo, unsigned int DataThree, usigned int DataFour, unsigned int DataFive - Three 16bit data to be written to slave
- Parameters (OUT): None
- Return Value: None
- Description: This function will write 12 bytes of word to the I2C bus line
- */
- void I2CWRITE12BYTES (unsigned int Address, unsigned int Command, unsigned int DataOne, unsigned int DataTwo, unsigned int DataThree, unsigned int DataFour, unsigned int DataFive, unsigned int DataSix) // DataOne: Red, DataTwo: Green, DataThree: Blue
- {
- unsigned int upperByte, lowerByte;
- lowerByte = DataOne;
- upperByte = DataOne >> 8;
- unsigned int lowerSLAD = (unsigned int) (Address & 0x00FF);
- unsigned int upperSLAD = Address >> 8;
- upperSLAD |= 0x79; // First 5 bits 11110 and last bit '1' for a write
- Wire.beginTransmission(byte(upperSLAD));
- Wire.write(byte(lowerSLAD));
- Wire.write(byte(Command)); // write command
- Wire.write(byte(upperByte)); // write 2 bytes
- Wire.write(byte(lowerByte));
- lowerByte = DataTwo;
- upperByte = DataTwo >> 8;
- Wire.write(byte(upperByte)); // write next two bytes
- Wire.write(byte(lowerByte));
- lowerByte = DataThree;
- upperByte = DataThree >> 8;
- Wire.write(byte(upperByte));
- Wire.write(byte(lowerByte));
- lowerByte = DataFour;
- upperByte = DataFour >> 8;
- Wire.write(byte(upperByte));
- Wire.write(byte(lowerByte));
- lowerByte = DataFive;
- upperByte = DataFive >> 8;
- Wire.write(byte(upperByte));
- Wire.write(byte(lowerByte));
- lowerByte = DataSix;
- upperByte = DataSix >> 8;
- Wire.write(byte(upperByte));
- Wire.write(byte(lowerByte));
- Wire.endTransmission(true);
- }
- /*
- Parameters (IN): int Address - Address of RGB LED Shield, Default 0x15E
- int Command - Defined read I2C Commands i.e. READ_INTENSITY_RED, READ_INTENSITY_GREEN, READ_INTENSITY_BLUE
- Parameters (OUT): None
- Return Value: Requested data from Shield will be sent back
- Description: This function will request 2 bytes of word from the shield
- */
- unsigned int I2CREAD (unsigned int Address, unsigned int Command) // Returns data sent by slave
- {
- int i = 0;
- unsigned int lowerSLAD = (unsigned int) (Address & 0x00FF);
- unsigned int upperSLAD = Address >> 8;
- upperSLAD |= 0x79;
- Wire.beginTransmission(byte(upperSLAD)); // Red
- Wire.write(byte(lowerSLAD));
- Wire.write(byte(Command));
- Wire.endTransmission(false); // false for Repeated Start
- Wire.beginTransmission(byte(upperSLAD));
- Wire.write(byte(lowerSLAD));
- Wire.requestFrom(upperSLAD, 2, true);
- unsigned int data = 0;
- while(Wire.available()) // slave may send less than requested. Print out received data byte
- {
- message = 1;
- c[i] = Wire.read(); // receive a byte as character
- i++;
- }
- Wire.endTransmission(true);
- data = c[1]; // write data to serial monitor. c[1] is higher byte
- data = (data << 8) | c[0]; // shift left and combine with lower byte
- Serial.print("0x");
- if (data < 0x1000)
- Serial.print("0");
- Serial.println(data, HEX);
- return data;
- }
- /*
- Parameters (IN): int Address - Address of RGB LED Shield, Default 0x15E
- int Command - DIRECTACCESS_READ
- Parameters (OUT): None
- Return Value: Requested data from the Shield will be returned
- Description: This function will request 4 bytes of data from shield.
- */
- unsigned long I2CREAD_DIRECTACCESS (unsigned int Address, unsigned int Command, unsigned long registerAddress)
- {
- int i = 0;
- unsigned int lowerSLAD = (unsigned int) (Address & 0x00FF); // sending command + address
- unsigned int upperSLAD = Address >> 8;
- upperSLAD |= 0x79; // First 5 bits 11110 and last bit '1' for a write
- Wire.beginTransmission(byte(upperSLAD));
- Wire.write(byte(lowerSLAD));
- Wire.write(byte(Command));
- unsigned int firstByte, secondByte, thirdByte, fourthByte;
- firstByte = registerAddress >> 24; // top byte
- secondByte = registerAddress >> 16;
- thirdByte = registerAddress >> 8;
- fourthByte = registerAddress; // bottom byte
- Wire.write(byte(firstByte));
- Wire.write(byte(secondByte));
- Wire.write(byte(thirdByte));
- Wire.write(byte(fourthByte));
- Wire.endTransmission(false); // false for Repeated Start
- Wire.beginTransmission(byte(upperSLAD)); // request for read
- Wire.write(byte(lowerSLAD));
- Wire.requestFrom(upperSLAD, 4, true);
- unsigned long data = 0;
- while(Wire.available()) // slave may send less than requested. Print out received data byte
- {
- d[i] = 0;
- d[i] = Wire.read(); // receive a byte as character
- i++;
- }
- Wire.endTransmission(true);
- data = d[3]; // combining into one variable. Highest byte received first
- data = (data << 8) | d[2];
- data = (data << 8) | d[1];
- data = (data << 8) | d[0];
- Serial.print("0x");
- if (data < 0x10000000)
- Serial.print("0");
- Serial.println(data, HEX);
- return data;
- }
- /*
- Parameters (IN): int Address - Address of RGB LED Shield, Default 0x15E
- int Command - Defined I2C Commands i.e. DIRECTACCESS_OR, DIRECTACCESS_AND, DIRECTACCESS_MOVE
- unsigned long registerAddress - address of target register
- unsigned long Data - 32 bits data to be written to register
- Parameters (OUT): None
- Return Value: None
- Description: This function will write 4 bytes of data to specified register
- */
- void I2CWRITE_DIRECTACCESS (unsigned int Address, unsigned int Command, unsigned long registerAddress, unsigned long Data) // For accessing registers directly
- {
- int i = 0;
- unsigned int lowerSLAD = (unsigned int) (Address & 0x00FF); // sending command + address
- unsigned int upperSLAD = Address >> 8;
- upperSLAD |= 0x79; // First 5 bits 11110 and last bit '1' for a write
- Wire.beginTransmission(byte(upperSLAD));
- Wire.write(byte(lowerSLAD));
- Wire.write(byte(Command));
- unsigned int firstByte, secondByte, thirdByte, fourthByte; // Send address of register first
- firstByte = registerAddress >> 24; // top byte
- secondByte = registerAddress >> 16;
- thirdByte = registerAddress >> 8;
- fourthByte = registerAddress; // bottom byte
- Wire.write(byte(firstByte));
- Wire.write(byte(secondByte));
- Wire.write(byte(thirdByte));
- Wire.write(byte(fourthByte));
- firstByte = Data >> 24; // top byte
- secondByte = Data >> 16;
- thirdByte = Data >> 8;
- fourthByte = Data; // bottom byte
- Wire.write(byte(firstByte)); // send 4 bytes of data
- Wire.write(byte(secondByte));
- Wire.write(byte(thirdByte));
- Wire.write(byte(fourthByte));
- Wire.endTransmission(true);
- }
- /*
- Parameters (IN): int Address - Address of RGB LED Shield, Default 0x15E
- unsigned int newAddress - Address the shield should change to
- Parameters (OUT): None
- Return Value: None
- Description: This function will change the I2C address of the slave
- */
- void CHANGEADDRESS (unsigned int Address, unsigned int newAddress)
- {
- unsigned int lowerSLAD = (unsigned int) (Address & 0x00FF);
- unsigned int upperSLAD = Address >> 8;
- upperSLAD |= 0x79; // First 5 bits 11110 and last bit '1' for a write
- Wire.beginTransmission(byte(upperSLAD)); // Red
- Wire.write(byte(lowerSLAD));
- Wire.write(byte(0x70)); // Command to change address
- lowerSLAD = (unsigned int) (newAddress & 0x00FF);
- upperSLAD = newAddress >> 7; // Split address into 2 bytes
- upperSLAD |= 0xF0; // 10 bit addressing: First 5 bits have to be 11110.
- upperSLAD &= 0xFE;
- Wire.write(byte(upperSLAD));
- Wire.write(byte(lowerSLAD));
- Wire.endTransmission(true);
- }
- /*
- Parameters (IN): int Address - Address of RGB LED Shield, Default 0x15E
- unsigned int Command - DMXON, DMXOFF
- Parameters (OUT): None
- Return Value: None
- Description: This function will enable or disable DMX512 control on shield
- */
- void I2CDMX (unsigned int Address, unsigned int Command) // Switch off / on the DMX
- {
- unsigned int lowerSLAD = (unsigned int) (Address & 0x00FF); // Putting address into correct format
- unsigned int upperSLAD = Address >> 8;
- upperSLAD |= 0x79;
- Wire.beginTransmission(byte(upperSLAD)); // Start I2C transmission
- Wire.write(byte(lowerSLAD));
- Wire.write(byte(Command));
- Wire.endTransmission(true);
- }
- /*
- Parameters (IN): int Address - Address of RGB LED Shield, Default 0x15E
- Parameters (OUT): None
- Return Value: None
- Description: This function will request the shield to save configurations to flash memory
- */
- void I2CSAVEPARAM (unsigned int Address)
- {
- int i = 0;
- unsigned int lowerSLAD = (unsigned int) (Address & 0x00FF);
- unsigned int upperSLAD = Address >> 8;
- upperSLAD |= 0x79;
- Wire.beginTransmission(byte(upperSLAD));
- Wire.write(byte(lowerSLAD));
- Wire.write(byte(SAVEPARAMETERS)); // write SAVEPARAMETERS command
- Wire.endTransmission(false); // false for Repeated Start
- Wire.beginTransmission(byte(upperSLAD));
- Wire.write(byte(lowerSLAD)); // write to address lower 8 bits of slave address
- Wire.requestFrom(upperSLAD, 2, true); // send READ request with upper slave address
- unsigned int data = 0;
- while(Wire.available()) // slave may send less than requested. Print out received data byte
- {
- message = 1;
- c[i] = Wire.read(); // receive a byte as character3
- i++;
- }
- Wire.endTransmission(true); // STOP condition
- data = c[1]; // print the data on serial monitor
- data = (data << 8) | c[0];
- Serial.print("0x");
- if (data < 0x1000)
- Serial.print("0");
- Serial.println(data, HEX);
- }
Advertisement
Add Comment
Please, Sign In to add comment