Aliexpressなどで販売されている64x32のフルカラードットマトリクスLED2枚とNucleo F401REを利用して、 E233系の駅停車時、路線名表示ありのLED側面行先表示を再現するプログラムです。 3秒間隔、3段階切替で、路線名、種別、行先、次停車駅を個別に指定することが可能です。
Dependencies: SDFileSystem mbed
Revision 24:7232abdf7884, committed 2015-01-04
- Comitter:
- chirashi
- Date:
- Sun Jan 04 16:01:31 2015 +0000
- Parent:
- 23:6fb1181345a7
- Child:
- 25:8b1da0f21d32
- Commit message:
- ??????????
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Thu Dec 04 12:28:33 2014 +0000
+++ b/main.cpp Sun Jan 04 16:01:31 2015 +0000
@@ -50,6 +50,9 @@
#define DisplayWait 15
+//最大停車駅数
+#define MaxStopStation 100
+
SDFileSystem sd(D11, D12, D13, D10, "sd");
Serial pc(USBTX,USBRX );
BusOut ABC(D8,D9,PB_13,PC_5); // Row address.
@@ -112,13 +115,13 @@
int DisplayMode = 1;
//スクロール有効/無効(テスト用)
-bool Scroll = 1;
+bool Scroll = 0;
int ChangeCount = 0;
-int LineNumber = 37;
-int KindNumber = 1;
-int ForNumber = 1;
+int LineNumber = 12;
+int KindNumber = 22;
+int ForNumber = 114;
int NextStaNumber = 1;
char SerialBuffer[30];
int count = 0;
@@ -135,7 +138,10 @@
unsigned char gm[32][6]; // Buffer with 32x6 bytes. Graphics memory if you like.
unsigned long CT; // Counter for demo code
-int StopStationCode[100] = {2,3,7,11,14,20,24,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,0};
+//int StopStationCode[MaxStopStation] = {2,3,7,11,14,20,24,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,0};
+//Keihin-Tohoku Rapid Ofuna
+//int StopStationCode[MaxStopStation] = {202,203,204,205,206,207,208,209,210,211,212,213,214,218,220,222,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,0};
+int StopStationCode[MaxStopStation] = {320,319,318,317,316,315,314,313,312,311,310,309,308,307,306,305,304,303,302,301,351,352,353,354,355,356,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,0};
int StationNameLength[100] = {0,2,2,4,3,3,3,3,3,4,3,2,3,3,2,3,4,2,3,3,2,3,4,5,3,4,2,2,2,2,3,4,2,3,2,3,3,2,2,2,2,3,3,2,2,3,3,7,4,2,3,1,5,3,3,3,8,3};
@@ -306,20 +312,21 @@
//16 Green(Utsunomiya Line)
//17 Green(Joban Local Local)
-bool R1Data1[32]={0,1,0,0,1,0,1,1,0,1,1,1,1,0,1,1,0,0};
-bool R1Data2[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0};
-bool R1Data3[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0};
-bool R1Data4[32]={0,1,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0};
+//18 Keikyu Logo(Gray
+bool R1Data1[32]={0,1,0,0,1,0,1,1,0,1,1,1,1,0,1,1,0,0,1};
+bool R1Data2[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0,1};
+bool R1Data3[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0};
+bool R1Data4[32]={0,1,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0,0,0};
-bool G1Data1[32]={0,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1};
-bool G1Data2[32]={0,0,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1};
-bool G1Data3[32]={0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1};
-bool G1Data4[32]={0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1};
+bool G1Data1[32]={0,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1,1};
+bool G1Data2[32]={0,0,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1,1,1};
+bool G1Data3[32]={0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0};
+bool G1Data4[32]={0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0};
-bool B1Data1[32]={0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,1,0,1};
-bool B1Data2[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1};
-bool B1Data3[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0};
-bool B1Data4[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0};
+bool B1Data1[32]={0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,1,0,1,1};
+bool B1Data2[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1};
+bool B1Data3[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0};
+bool B1Data4[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0};
@@ -613,6 +620,7 @@
void TimerTick(){
+ //OE = HIGH;
//DisplayMode = 1 3段階表示ならば
if(DisplayMode == 1){
@@ -632,7 +640,8 @@
}
//DisplayMode = 2 2段階表示ならば
//次駅表示なし2段階表示に使用
- else if (DisplayMode == 2){
+
+ if (DisplayMode == 2){
if(ChangeCount == 0 ){
CopyBuffer(LEDBuffer,LEDMainBuffer);
@@ -646,13 +655,13 @@
}
}
//DisplayMode = 3 ならば LEDBuffer2を固定表示
- else if (DisplayMode == 3){
+ if (DisplayMode == 3){
CopyBuffer(LEDBuffer2,LEDMainBuffer);
ChangeCount = 1;
}
//2段階表示 次駅表示あり、路線名なしパターンに使用
- else if(DisplayMode == 4){
+ if(DisplayMode == 4){
if(ChangeCount == 1 ){
CopyBuffer(LEDBuffer2,LEDMainBuffer);
ChangeCount = ChangeCount + 1;
@@ -661,6 +670,8 @@
ChangeCount = 1;
}
}
+
+ //OE = LOW;
}
void ScrollTimerTick(){
@@ -699,14 +710,13 @@
//スクロールバッファへの書込み用 読み出し高さは16固定
//書込み対象バッファ,書込み開始位置x,書込み開始位置y,読み出し幅x,読み出し高さy
void SDScrollBufferWrite(int8_t TargetBuffer[16][2048], int Startx, int Starty, int Readx, int Ready){
- pc.printf("SDScrollBufferWrite\r\n");
+ //pc.printf("SDScrollBufferWrite\r\n");
FILE *fp = fopen(SDFilePath, "r");
if(fp == NULL) {
pc.printf("SDFileOpen Error %s\r\n",SDFilePath);
//error("Could not open file for write\r\n");
}else{
- //fprintf(fp, "Hello fun SD Card World!");
- pc.printf("SDFileOpen Success %s\r\n",SDFilePath);
+ //pc.printf("SDFileOpen Success %s\r\n",SDFilePath);
//SDDataReadtest
int8_t Data;
@@ -804,7 +814,8 @@
}else{
DisplayMode = 1;
}
-
+
+ //2段階(次駅なし)
//次駅コードが0なら次駅なしの2段階表示に変更
// 2段階表示 LEDBuffer [種別]路線名
// LEDBuffer2 [種別]行先(次駅表示なし)
@@ -832,6 +843,23 @@
}
}
+
+ //全面種別固定表示
+ //路線名、行先、次駅がすべて0なら種別を全面に固定表示
+ if(LineNumber == 0 && ForNumber == 0 && NextStaNumber == 0){
+
+ //種別
+ sprintf(SDFilePath,"/sd/E233/Kind/%d.bin",KindNumber);
+ SDBufferWrite(LEDBuffer2,0,0,48,32);
+ sprintf(SDFilePath,"/sd/E233/Kind2/%d.bin",KindNumber);
+ SDBufferWrite(LEDBuffer2,0,0,128,32);
+
+ //固定表示に変更
+ DisplayMode = 3;
+ }
+
+
+
//WriteMode = 3 固定表示 LEDBuffer2 行先(次駅表示なし 32x128)
//else if(WriteMode == 3){
if(WriteMode == 3){
@@ -875,7 +903,8 @@
if (count > 30 || SerialBuffer[count] == '$') { // 文字数が既定の個数を超えた場合、又は終了文字を受信した場合
SerialBuffer[count] = '\0'; // 末尾に終端文字を入れる
count = 0;
-
+
+ //路線名 L
if(SerialBuffer[0] == 'L'){
unsigned char Sertemp1 = SerialBuffer[1];
unsigned char Sertemp2 = SerialBuffer[2];
@@ -909,6 +938,7 @@
pc.printf("Line:%d\r\n",n);
}
+ //種別 K
if(SerialBuffer[0] == 'K'){
unsigned char Sertemp1 = SerialBuffer[1];
unsigned char Sertemp2 = SerialBuffer[2];
@@ -942,6 +972,7 @@
pc.printf("Kind:%d\r\n",n);
}
+ //行先 F
if(SerialBuffer[0] == 'F'){
unsigned char Sertemp1 = SerialBuffer[1];
unsigned char Sertemp2 = SerialBuffer[2];
@@ -975,6 +1006,7 @@
pc.printf("For:%d\r\n",n);
}
+ //次停車駅 K
if(SerialBuffer[0] == 'N'){
unsigned char Sertemp1 = SerialBuffer[1];
unsigned char Sertemp2 = SerialBuffer[2];
@@ -1008,6 +1040,25 @@
pc.printf("NextStation:%d\r\n",n);
}
+ //スクロール有効/無効 S
+ if(SerialBuffer[0] == 'S'){
+ unsigned char Sertemp1 = SerialBuffer[1];
+ int n1 = 0 ;
+ int n = 0;
+
+ if ( Sertemp1 < '0' || Sertemp1 > '9' ) {
+ // error
+ } else {
+ n1 = (int)(Sertemp1 - '0') ;
+ //pc.printf("%d,",n1);
+ }
+
+ n = n1;
+ Scroll = n;
+ pc.printf("Scroll:%d\r\n",n);
+ }
+
+ //起動 Set
if(SerialBuffer[0] == 'S' && SerialBuffer[1] == 'e' && SerialBuffer[2] == 't'){
pc.printf("Set\r\n");
SDFileRead();
@@ -1077,16 +1128,31 @@
sprintf(SDFilePath,"/sd/E233/StopStation/StopStation%d.bin",2);
SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,80,16);
ScrollWriteCount = ScrollWriteCount + 80;
- for(int i = 0; i < 100; i++){
-
+
+ for(int i = 0; i < MaxStopStation; i++){
if(StopStationCode[i] == 0){
break;
}
//駅名
sprintf(SDFilePath,"/sd/E233/StationName/%d.bin",StopStationCode[i]);
- SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,128,16);
- ScrollWriteCount = ScrollWriteCount + (StationNameLength[StopStationCode[i]] * 16);
+ SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,128,16);
+
+ //駅名文字数取得
+ int test = 0;
+ sprintf(SDFilePath,"/sd/E233/StationNameLength.bin");
+ FILE *fp = fopen(SDFilePath, "r");
+ if(fp == NULL) {
+ pc.printf("SDFileOpen Error %s\r\n",SDFilePath);
+ }else{
+ //pc.printf("SDFileOpen Success %s\r\n",SDFilePath);
+ fseek(fp, StopStationCode[i], SEEK_SET);
+ test = getc(fp);
+ //pc.printf("StationNameLength:%d\r\n",test);
+ fclose(fp);
+ }
+
+ ScrollWriteCount = ScrollWriteCount + (test * 16);
sprintf(SDFilePath,"/sd/E233/StopStation/0x8132.bin");
SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,16,16);
ScrollWriteCount = ScrollWriteCount + 16;
@@ -1122,8 +1188,8 @@
}
//test
-// sprintf(SDFilePath,"/sd/E233/test.bin");
-// SDBufferWrite(LEDBuffer,0,0,128,32);
+ //sprintf(SDFilePath,"/sd/E233/test2.bin");
+ //SDBufferWrite(LEDBuffer,0,0,128,32);
//Serial