Created
January 18, 2019 10:32
-
-
Save LongClipeus/ed5102da7e904e6dc621b52341253f7d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* ------------------ Config ------------------ */ | |
#define ST 3 // CHAN ST | |
#define SH 2 // CHAN SH | |
#define DS0 5 // CHAN D | |
#define DS1 4 // CHAN C | |
/* | |
#define ST digitalRead(3) // CHAN ST | |
#define SH digitalRead(2) // CHAN SCK | |
#define DS0 digitalRead(5) // CHAN DataR | |
#define DS1 digitalRead(4) // CHAN DataC | |
*/ | |
#define LED_ROW_NUMBER 1 | |
#define LED_COL_NUMBER 3 | |
/* ------------------ Config ------------------ */ | |
#define TEMP_MAX 40 // ngưỡng cảnh báo: nhiệt độ quá cao | |
#define TEMP_MIN 10 // ngưỡng cảnh báo: nhiệt độ quá thấp | |
#define LIGHT_TIME_TEMP 1 | |
#define LIGHT_TIME_FLICKER_TEMP 10 | |
#define SLEEP_TIME_TEMP 100 | |
#define NUMBER_FLASH 1 | |
#define SPEED_RUN_TEMP 1 | |
#define LOOP_RUN_TEMP 10 | |
/* -------------------------------------------- */ | |
const unsigned int LedRow = LED_ROW_NUMBER << 3; | |
const unsigned int LedCol = LED_COL_NUMBER << 3; | |
const unsigned int MaxLenStr = (LED_COL_NUMBER << 2) / 3; | |
const char FontD[] = {0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE}; | |
const char FontC[][8] = { | |
{0x7E, 0x85, 0x89, 0x91, 0x7E, 0x00, 0x00, 0x00}, /*0*/ | |
{0x00, 0x21, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00}, /*1*/ | |
{0x43, 0x85, 0x89, 0x91, 0x61, 0x00, 0x00, 0x00}, /*2*/ | |
{0x82, 0x81, 0x91, 0xA9, 0xC6, 0x00, 0x00, 0x00}, /*3*/ | |
{0x18, 0x28, 0x48, 0xFF, 0x08, 0x00, 0x00, 0x00}, /*4*/ | |
{0xF2, 0x91, 0x91, 0x91, 0x8E, 0x00, 0x00, 0x00}, /*5*/ | |
{0x3E, 0x51, 0x91, 0x91, 0x0E, 0x00, 0x00, 0x00}, /*6*/ | |
{0x80, 0x80, 0x8F, 0x90, 0xE0, 0x00, 0x00, 0x00}, /*7*/ | |
{0x6E, 0x91, 0x91, 0x91, 0x6E, 0x00, 0x00, 0x00}, /*8*/ | |
{0x60, 0x91, 0x91, 0x92, 0x7C, 0x00, 0x00, 0x00}, /*9*/ | |
{0x7F, 0x90, 0x90, 0x90, 0x7F, 0x00, 0x00, 0x00}, /*A ==> 10*/ | |
{0xFF, 0x91, 0x91, 0x91, 0x6E, 0x00, 0x00, 0x00}, /*B ==> 11*/ | |
{0x7E, 0x81, 0x81, 0x81, 0x42, 0x00, 0x00, 0x00}, /*C ==> 12*/ | |
{0xFF, 0x81, 0x81, 0x42, 0x3C, 0x00, 0x00, 0x00}, /*D ==> 13*/ | |
{0xFF, 0x91, 0x91, 0x91, 0x81, 0x00, 0x00, 0x00}, /*E ==> 14*/ | |
{0xFF, 0x90, 0x90, 0x90, 0x80, 0x00, 0x00, 0x00}, /*F ==> 15*/ | |
{0x7E, 0x81, 0x89, 0x8F, 0x08, 0x00, 0x00, 0x00}, /*G ==> 16*/ | |
{0xFF, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x00, 0x00}, /*H ==> 17*/ | |
{0x81, 0x81, 0xFF, 0x81, 0x81, 0x00, 0x00, 0x00}, /*I ==> 18*/ | |
{0x82, 0x81, 0xFE, 0x80, 0x80, 0x00, 0x00, 0x00}, /*J ==> 19*/ | |
{0xFF, 0x18, 0x24, 0x42, 0x81, 0x00, 0x00, 0x00}, /*K ==> 20*/ | |
{0xFF, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00}, /*L ==> 21*/ | |
{0xFF, 0x20, 0x10, 0x20, 0xFF, 0x00, 0x00, 0x00}, /*M ==> 22*/ | |
{0xFF, 0x20, 0x10, 0x08, 0xFF, 0x00, 0x00, 0x00}, /*N ==> 23*/ | |
{0x7E, 0x81, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00}, /*O ==> 24*/ | |
{0xFF, 0x90, 0x90, 0x90, 0x60, 0x00, 0x00, 0x00}, /*P ==> 25*/ | |
{0x7E, 0x81, 0x85, 0x82, 0x7D, 0x00, 0x00, 0x00}, /*Q ==> 26*/ | |
{0xFF, 0x98, 0x94, 0x92, 0x61, 0x00, 0x00, 0x00}, /*R ==> 27*/ | |
{0x62, 0x91, 0x91, 0x91, 0x4E, 0x00, 0x00, 0x00}, /*S ==> 28*/ | |
{0x80, 0x80, 0xFF, 0x80, 0x80, 0x00, 0x00, 0x00}, /*T ==> 29*/ | |
{0xFE, 0x01, 0x01, 0x01, 0xFE, 0x00, 0x00, 0x00}, /*U ==> 30*/ | |
{0xFC, 0x02, 0x01, 0x02, 0xFC, 0x00, 0x00, 0x00}, /*V ==> 31*/ | |
{0xFF, 0x04, 0x08, 0x04, 0xFF, 0x00, 0x00, 0x00}, /*W ==> 32*/ | |
{0xC7, 0x28, 0x10, 0x28, 0xC7, 0x00, 0x00, 0x00}, /*X ==> 33*/ | |
{0xE0, 0x10, 0x0F, 0x10, 0xE0, 0x00, 0x00, 0x00}, /*Y ==> 34*/ | |
{0x87, 0x89, 0x91, 0xA1, 0xC1, 0x00, 0x00, 0x00}, /*Z ==> 35*/ | |
{0x02, 0x15, 0x15, 0x15, 0x0F, 0x00, 0x00, 0x00}, /*a ==> 36*/ | |
{0xFF, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x00, 0x00}, /*b ==> 37*/ | |
{0x0E, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00}, /*c ==> 38*/ | |
{0x0E, 0x11, 0x11, 0x0A, 0xFF, 0x00, 0x00, 0x00}, /*d ==> 39*/ | |
{0x0E, 0x15, 0x15, 0x15, 0x0C, 0x00, 0x00, 0x00}, /*e ==> 40*/ | |
{0x08, 0x3F, 0x48, 0x40, 0x20, 0x00, 0x00, 0x00}, /*f ==> 41*/ | |
{0x18, 0x25, 0x25, 0x25, 0x3E, 0x00, 0x00, 0x00}, /*g ==> 42*/ | |
{0x7F, 0x04, 0x08, 0x08, 0x07, 0x00, 0x00, 0x00}, /*h ==> 43*/ | |
{0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00}, /*i ==> 44*/ | |
{0x00, 0x02, 0x01, 0x11, 0x5E, 0x00, 0x00, 0x00}, /*j ==> 45*/ | |
{0x00, 0x7F, 0x04, 0x0A, 0x11, 0x00, 0x00, 0x00}, /*k ==> 46*/ | |
{0x00, 0x41, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00}, /*l ==> 47*/ | |
{0x1F, 0x10, 0x08, 0x10, 0x0F, 0x00, 0x00, 0x00}, /*m ==> 48*/ | |
{0x1F, 0x08, 0x10, 0x10, 0x0F, 0x00, 0x00, 0x00}, /*n ==> 49*/ | |
{0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00, 0x00, 0x00}, /*o ==> 50*/ | |
{0x3F, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00}, /*p ==> 51*/ | |
{0x18, 0x24, 0x24, 0x3F, 0x00, 0x00, 0x00, 0x00}, /*q ==> 52*/ | |
{0x1F, 0x08, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00}, /*r ==> 53*/ | |
{0x09, 0x15, 0x15, 0x12, 0x00, 0x00, 0x00, 0x00}, /*s ==> 54*/ | |
{0x10, 0x7E, 0x11, 0x01, 0x02, 0x00, 0x00, 0x00}, /*t ==> 55*/ | |
{0x1E, 0x01, 0x01, 0x02, 0x1F, 0x00, 0x00, 0x00}, /*u ==> 56*/ | |
{0x1C, 0x02, 0x01, 0x02, 0x1C, 0x00, 0x00, 0x00}, /*v ==> 57*/ | |
{0x1E, 0x01, 0x02, 0x01, 0x1E, 0x00, 0x00, 0x00}, /*w ==> 58*/ | |
{0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00, 0x00, 0x00}, /*x ==> 59*/ | |
{0x18, 0x05, 0x05, 0x05, 0x1E, 0x00, 0x00, 0x00}, /*y ==> 60*/ | |
{0x11, 0x13, 0x15, 0x19, 0x11, 0x00, 0x00, 0x00}, /*z ==> 61*/ | |
{0x70, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00, 0x00}, /*oC ==> 62*/ | |
{0xFF, 0xA9, 0x91, 0xA9, 0xFF, 0x00, 0x00, 0x00}, /*[x] ==> 63*/ | |
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*null == > 64*/ | |
{0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00} | |
}; /*- == > 65*/ | |
void setup() { | |
//Serial.begin(9600); | |
pinMode(ST, OUTPUT); | |
pinMode(SH, OUTPUT); | |
pinMode(DS0, OUTPUT); | |
pinMode(DS1, OUTPUT); | |
} | |
inline void pop() { | |
digitalWrite(SH, LOW); | |
digitalWrite(SH, HIGH); | |
} | |
inline void push() { | |
digitalWrite(ST, HIGH); | |
digitalWrite(ST, LOW); | |
} | |
void resetLed() { | |
digitalWrite(DS0, LOW); | |
digitalWrite(DS1, LOW); | |
unsigned int cnt = LedCol; | |
while (cnt--) { | |
pop(); | |
} | |
push(); | |
} | |
void ShowTemperature(char temp, char mRun) { | |
char tempArr[4]; | |
if (temp & 0x80) { // temp < 0 | |
// convert negative integer to integers | |
--temp; | |
temp ^= 0xff; | |
tempArr[0] = 65; | |
if (temp < 10) | |
tempArr[1] = temp; | |
else | |
tempArr[1] = 9; | |
} else { | |
if (temp < 10) { | |
tempArr[0] = 64; | |
tempArr[1] = temp; | |
} else if (10 <= temp && temp < 100) { | |
tempArr[0] = (temp / 5) >> 1; | |
tempArr[1] = temp % 10; | |
} else { | |
tempArr[0] = 9; | |
tempArr[1] = 9; | |
} | |
} | |
tempArr[2] = 62; | |
tempArr[3] = 12; | |
if (TEMP_MIN < temp && temp < TEMP_MAX) { | |
if (mRun) { | |
ShowRunLetter(tempArr, 4, SPEED_RUN_TEMP, LOOP_RUN_TEMP); | |
} else { | |
ShowLetter(tempArr, 4, LIGHT_TIME_TEMP); | |
} | |
} else { | |
FlickerLed(tempArr, 4, NUMBER_FLASH, LIGHT_TIME_FLICKER_TEMP, SLEEP_TIME_TEMP); | |
} | |
} | |
void FlickerLed(char *string, int len, int cycleShow, int lightTime, int sleepTime) { | |
while (cycleShow--) { | |
ShowLetter(string, len, lightTime); | |
resetLed(); | |
delay(sleepTime); | |
} | |
} | |
void ChangeTheFont(char *string, int len) { | |
while (len--) { | |
if (47 < string[len] && string[len] < 58) | |
string[len] -= 48; | |
else if (64 < string[len] && string[len] < 91) | |
string[len] -= 55; | |
else if (96 < string[len] && string[len] < 123) | |
string[len] -= 61; | |
else if (string[len] == 32) | |
string[len] = 64; | |
else | |
string[len] = 63; | |
} | |
} | |
void ShowLed(char *string, int len, int cycle_speed, int loopNumber) { | |
if (len < MaxLenStr) | |
ShowLetter(string, len, cycle_speed); | |
else | |
ShowRunLetter(string, len, cycle_speed, loopNumber); | |
} | |
void ShowLetter(char *string, int len, int lightTime) { | |
char posC, posD, bitC, D; | |
unsigned int row = LedRow, col; | |
while (lightTime--) { | |
posC = 0x80; | |
for (row = 0; row < LedRow; ++row) { | |
D = FontD[row]; | |
posD = 0x80; | |
for (col = 0; col < LedCol; ++col) { | |
if (col > 23) { | |
if (D & posD) | |
digitalWrite(DS0, HIGH); | |
else | |
digitalWrite(DS0, LOW); | |
posD >>= 1; | |
} | |
/*set font vàn chân C*/ | |
if (col < 6) | |
bitC = FontC[string[0]][col]; | |
else if (len > 1 && col < 12) | |
bitC = FontC[string[1]][col - 6]; | |
else if (len > 2 && col < 18) | |
bitC = FontC[string[2]][col - 12]; | |
else if (len > 3 && col < 24) | |
bitC = FontC[string[3]][col - 18]; | |
else if (len == 5 && col < 30) | |
bitC = FontC[string[4]][col - 24]; | |
else | |
bitC = FontC[64][0]; | |
if (bitC & posC) | |
digitalWrite(DS1, HIGH); | |
else | |
digitalWrite(DS1, LOW); | |
pop(); | |
} | |
push(); | |
posC >>= 1; /*quét 8 hàng led*/ | |
} | |
} | |
resetLed(); | |
} | |
void ShowRunLetter(char *StringShow, int len, int speedLed, int loopNumber) { | |
int i, j; | |
char posC, posD, fontC, D; | |
int scanFont = 0; | |
int cntCol, cntRow, cntSpeed; | |
int lenCol = LedCol - 8; | |
int scanFL = 0; | |
len <<= 3; | |
while (loopNumber) { | |
scanFL = LedCol - scanFont; | |
for (cntSpeed = 0; cntSpeed < speedLed; ++cntSpeed) { | |
posC = 0x80; | |
for (cntRow = 0; cntRow < LedRow; ++cntRow) { | |
/*lấy font vào chân D*/ | |
D = FontD[cntRow]; | |
posD = 0x80; | |
for (cntCol = 0; cntCol < lenCol; ++cntCol) { | |
if (cntCol < scanFL || cntCol > scanFL - 1 + len) { /*lấy font null*/ | |
fontC = FontC[64][0]; | |
} else { /*lấy font chữ*/ | |
i = cntCol - scanFL; | |
j = i & 0x07; /*tmp2 = tmp1 % 8;*/ | |
i >>= 3; /*tmp1 /= 8;*/ | |
fontC = FontC[StringShow[i]][j]; | |
} | |
if (fontC & posC) | |
digitalWrite(DS1, HIGH); | |
else | |
digitalWrite(DS1, LOW); | |
pop(); | |
} | |
while (cntCol < LedCol) { | |
if (D & posD) | |
digitalWrite(DS0, HIGH); | |
else | |
digitalWrite(DS0, LOW); | |
posD >>= 1; | |
if (cntCol < scanFL || cntCol > scanFL - 1 + len) { /*lấy font null*/ | |
fontC = FontC[64][0]; | |
} else { /*lấy font chữ*/ | |
i = cntCol - scanFL; | |
j = i & 0x07; /*tmp2 = tmp1 % 8;*/ | |
i >>= 3; /*tmp1 /= 8;*/ | |
fontC = FontC[StringShow[i]][j]; | |
} | |
if (fontC & posC) | |
digitalWrite(DS1, HIGH); | |
else | |
digitalWrite(DS1, LOW); | |
pop(); | |
++cntCol; | |
} | |
push(); | |
posC >>= 1; /*quét 8 hàng led*/ | |
} | |
} | |
if (scanFont > LedCol + len) { | |
scanFont = 0; | |
--loopNumber; | |
} else | |
++scanFont; | |
} | |
resetLed(); | |
} | |
void loop() { | |
// put your main code here, to run repeatedly: | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment