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;
}
}
|