/* ****************************************************************************************** * Program ID: Arduino_I2C_Device.pde * Created by: CH, Chen (Taiwan) 2011.8.28 * * ****************************************************************************************** */ #include "Wire.h" #define THIS_DEVICE 0x31 #define COMMAND_DEVICE_INFO 0x00 #define COMMAND_DISPLAY_NUMBER 0x42 #define COMMAND_DISPLAY_TEXT 0x43 #define SEVEN_SEG_LED 0x38 #define THERMOMETER 0x49 #define RED_LED 3 #define GREEN_LED 5 #define BLUE_LED 6 #define NUM_OF_DIGITS 4 #define MAX_TEXT_LENGTH 16 uint8_t deviceInfo[9] = "UNO-0x31"; // Seven segment display pattern: // Numberals 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, blank,- const byte NumPattern[12] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D ,0x07, 0x7F, 0x6F, 0x00, 0x40}; // Alphabet A, b, C, d E F G H I J K L M // n O P q r s T U v W X y Z const byte AlphaPattern[26] = {0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x3D, 0x76, 0x06, 0x1E, 0x7A, 0x38, 0x15, 0x54, 0x3F, 0x73, 0x67, 0x31, 0x6D, 0x07, 0x3E, 0x1C, 0x2A, 0x49, 0x6E, 0x52}; const byte BlankPattern = 0x00; const byte DotPattern = 0x80; byte requestRegister; int receiveNumber; char ReceiveText[MAX_TEXT_LENGTH]; boolean isDisplayNumber, isDisplayText; void setup() { Serial.begin(9600); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); pinMode(BLUE_LED, OUTPUT); digitalWrite(RED_LED, HIGH); digitalWrite(GREEN_LED, LOW); digitalWrite(BLUE_LED, LOW); // Join I2C bus as Master Wire.begin(); // Initialize SAA1064 7-Segment LED driver (0x38) Wire.beginTransmission(SEVEN_SEG_LED); Wire.send(B00000000); // Instruction byte, the next byte is the control byte Wire.send(B01000111); // Control byte, dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current Wire.endTransmission(); // Initialize digital Thermometer (0x49) Wire.beginTransmission(THERMOMETER); Wire.send(1); // Set TMP75 pointer register to configuration register Wire.send(B01100000); // Set TMP75 12 bits resolution(R1,R0)=(0,0), b6,b5 of configuration register Wire.endTransmission(); Wire.beginTransmission(THERMOMETER); Wire.send(0); // Set TMP75 pointer register to temperature register Wire.endTransmission(); delay(1000); // Join I2C bus as slave Wire.begin(THIS_DEVICE); Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, HIGH); } void loop() { if (isDisplayNumber) { displayInteger(receiveNumber); isDisplayNumber = false; } else if (isDisplayText) { displayString(ReceiveText); isDisplayText = false; } } void receiveEvent(int howMany) { requestRegister = Wire.receive(); if (requestRegister == COMMAND_DISPLAY_NUMBER) { byte receiveSign = Wire.receive(); receiveNumber = Wire.receive(); if (receiveSign == 0) receiveNumber *= (-1); isDisplayNumber = true; } else if (requestRegister == COMMAND_DISPLAY_TEXT) { int nbytesReady = Wire.available(); if (nbytesReady > 0) { for (int xcnt=0; xcnt= 'A' && displayStr[xii] <= 'Z') { displayPattern[numOfBytes] = AlphaPattern[displayStr[xii] - 'A']; numOfBytes++; } else if (displayStr[xii] >= 'a' && displayStr[xii] <= 'z') { displayPattern[numOfBytes] = AlphaPattern[displayStr[xii] - 'a']; numOfBytes++; } else if (displayStr[xii] >= '0' && displayStr[xii] <= '9') { displayPattern[numOfBytes] = NumPattern[displayStr[xii] - '0']; numOfBytes++; } else if (displayStr[xii] == ' ') { displayPattern[numOfBytes] = NumPattern[10]; numOfBytes++; } else if (displayStr[xii] == '-') { displayPattern[numOfBytes] = NumPattern[11]; numOfBytes++; } else if (displayStr[xii] == '.') { displayPattern[numOfBytes] = DotPattern; numOfBytes++; } } if (numOfBytes > 0) displayFlyFromRightSide(displayPattern, numOfBytes); } // Display pattern array with fly-in effect void displayFlyFromRightSide(const byte displayArray[], int numberOfBytes) { int xindex = 0; clearDisplay(); while (xindex < numberOfBytes+NUM_OF_DIGITS) { Wire.beginTransmission(SEVEN_SEG_LED); Wire.send(0x01); // Write sub-address, point to register of the 1st digit(Right Hand Side) for (int xdigit=0, xdisplayIdx=xindex; xdigit=0; xdigit++, xdisplayIdx--) { if (xdisplayIdx < numberOfBytes) Wire.send(displayArray[xdisplayIdx]); else Wire.send(BlankPattern); } Wire.endTransmission(); delay(600); xindex++; } }