Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
/* DX SLI iRacing Arduino Project Author: Mark Silverwood Using TM1638 library from Ricardo Batista <rjbatista at gmail dot com> This Arduino Sketch creates a simple serial interface for the SLI unit. This Sketch was generated on: 3/8/2014 This Sketch is for a double (2) Display Unit Configuration */ #include <TM1638.h> //////Setup Here #define dataPin 8 #define clockPin 7 #define strobePin1 9 #define strobePin2 10 #define NumberUnits 2 #define NumberTM1638Units 2 //////Setup Finished #define startByte1 255 #define startByte2 37 #define endByte 180 #define messageLength 27 TM1638 module1(dataPin,clockPin,strobePin1,false,0); TM1638 module2(dataPin,clockPin,strobePin2,false,0); //// Variable Declarations word leds; byte segments[8], TM1640segments[16], redLeds, greenLeds, intensity, unit, sum, i, readCount, checkerPosition; byte buttons[NumberTM1638Units], oldbuttons[NumberTM1638Units], lastButtonSend[NumberTM1638Units]; long lastCheck, debounceDelay = 100; boolean sendButtons = false; byte messageHolder[messageLength], message[messageLength-4], messagePosition = -1; void setup() { Serial.begin(28800); for(int u = 0; u < NumberTM1638Units; u++) { oldbuttons[u] = 0; } intensity = 0; lastCheck = millis();} void loop() { buttonsCheck(); if (Serial.available() > 0){ messagePosition++; if(messagePosition == messageLength) messagePosition = 0; messageHolder[messagePosition] = Serial.read(); messageChecker(); } } void messageChecker() { checkerPosition = (messagePosition == 0) ? messageLength-1 : messagePosition - 1; if(messageHolder[checkerPosition] != endByte) return; //end byte checkerPosition = (messagePosition == messageLength -1) ? 0 : messagePosition + 1; if(messageHolder[checkerPosition]!= startByte1) return; //start byte1 checkerPosition = (checkerPosition == messageLength - 1) ? 0 : checkerPosition+1; if(messageHolder[checkerPosition]!= startByte2) return; // start byte 2 checkerPosition++; readCount = 0; sum = 0; while (readCount < messageLength-4) { if(checkerPosition == messageLength) checkerPosition = 0; message[readCount] = messageHolder[checkerPosition]; sum += messageHolder[checkerPosition]; readCount++; checkerPosition++; } if(sum == messageHolder[messagePosition]) messageRead(message); } void messageRead(byte _message[]){ i = 0; intensity = _message[i++]; for(int u = 1; u <= NumberUnits; u++) { unit = _message[i++]; if(false) { for(int x = 0;x<16;x++){ TM1640segments[x] = _message[i++]; } updateDisplay(unit,word(0,0),TM1640segments,intensity); } else { greenLeds = _message[i++]; redLeds = _message[i++]; for(int x = 0;x<8;x++){ segments[x] = _message[i++]; } updateDisplay(unit,word(greenLeds,redLeds),segments,intensity); } } } void buttonsCheck(){ if ((millis() - lastCheck)<debounceDelay) return; lastCheck = millis(); buttons[0] = module1.getButtons(); buttons[1] = module2.getButtons(); sendButtons = false; for(int u = 0; u < NumberTM1638Units; u++) { if (buttons[u] != lastButtonSend[u] && buttons[u] != oldbuttons[u]){ sendButtons = true; } oldbuttons[u] = buttons[u]; } if(sendButtons){ Serial.write(startByte1); for(int u = 0; u < NumberTM1638Units; u++) { lastButtonSend[u] = buttons[u]; Serial.write(lastButtonSend[u]); } } } void updateDisplay(byte unit, word _leds, byte _segments[], byte _intensity){ switch(unit){ case 1: module1.setupDisplay(true,_intensity); module1.setLEDs(_leds); module1.setDisplay(_segments); break; case 2: module2.setupDisplay(true,_intensity); module2.setLEDs(_leds); module2.setDisplay(_segments); break; } } |
Forensoftware: Burning Board® 3.1.8, entwickelt von WoltLab® GmbH