Aliexpressなどで販売されている64x32のフルカラードットマトリクスLED2枚とNucleo F401REを利用して、 E233系の駅停車時、路線名表示ありのLED側面行先表示を再現するプログラムです。 3秒間隔、3段階切替で、路線名、種別、行先、次停車駅を個別に指定することが可能です。

Dependencies:   SDFileSystem mbed

Revision:
19:26e0fae24da6
Parent:
18:b8563e3319fd
Child:
20:4f9719182866
--- a/main.cpp	Sat Nov 15 16:12:28 2014 +0000
+++ b/main.cpp	Thu Nov 20 10:12:50 2014 +0000
@@ -75,6 +75,21 @@
 bool Debug = 0;
 
 
+//Mode
+
+//3:固定表示 LEDBuffer3固定
+
+//1固定
+int WriteMode = 1;
+
+
+
+//1:3段階 LEDBuffer-LEDBuffer2-LEDBuffer3
+//2:2段階 LEDBuffer-LEDBuffer2
+//3:固定  LEDBuffer2
+//4:2段階 LEDBuffer2-LEDBuffer3
+int DisplayMode = 1;
+
 int ChangeCount = 0;
 int LineNumber = 37;
 int KindNumber = 1;
@@ -199,26 +214,35 @@
 {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
 
 };
-
+//01 Red
+//02 Green
+//03 Blue
+//04 Yellow(R,G)
+//05(G,B)
+//06 purple(R,B)
+//08 Blue(Keihin-tohoku Line)
 //10 Yellow(Nambu Local)
 //11 Green (Yokohama Line)
 //12 Orange(Rapid Acty,Urbun)
 
+//13 Green(Saikyo Line)
+
 //16 Green(Utsunomiya Line)
-bool R1Data1[32]={0,1,0,0,1,0,1,1,0,1,1,1,1,0,1,1,0};
-bool R1Data2[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0};
-bool R1Data3[32]={0,1,0,0,1,0,1,1,0,1,1,0,1,0,0,0,0};
-bool R1Data4[32]={0,1,0,0,1,0,1,1,0,1,0,0,1,0,0,0,0};
+//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};
 
-bool G1Data1[32]={0,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1};
-bool G1Data2[32]={0,0,1,0,1,1,0,1,1,0,1,1,0,0,0,0,1};
-bool G1Data3[32]={0,0,1,0,1,1,0,1,0,0,0,0,0,0,0,0,0};
-bool G1Data4[32]={0,0,1,0,1,1,0,1,0,0,0,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 B1Data1[32]={0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,1,0};
-bool B1Data2[32]={0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0};
-bool B1Data3[32]={0,0,0,1,0,1,1,1,1,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};
+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};
 
   
 
@@ -463,16 +487,50 @@
 }
 
 void TimerTick(){
-    if (ChangeCount == 0){
-        ChangeCount = ChangeCount + 1;
-    }else if(ChangeCount == 1 ){
-        ChangeCount = ChangeCount + 1;
-        //ChangeCount = 0;
-    }else if(ChangeCount == 2){     
-        ChangeCount = 0;
-    }else{
-         
-    }   
+    
+    //DisplayMode = 1 3段階表示ならば
+    if(DisplayMode == 1){
+        if (ChangeCount == 0){
+            ChangeCount = ChangeCount + 1;
+        }else if(ChangeCount == 1 ){
+            ChangeCount = ChangeCount + 1;
+            //ChangeCount = 0;
+        }else if(ChangeCount == 2){     
+            ChangeCount = 0;
+        }else{
+            ChangeCount = 0;
+        }   
+    }
+    //DisplayMode = 2 2段階表示ならば
+    //次駅表示なし2段階表示に使用
+    else if (DisplayMode == 2){
+        
+        if(ChangeCount == 0 ){
+            ChangeCount = ChangeCount + 1;
+            //ChangeCount = 0;
+        }else if(ChangeCount == 1){     
+            ChangeCount = 0;
+        }else{
+            ChangeCount = 0;
+        }    
+    }
+    //DisplayMode = 3 ならば LEDBuffer2を固定表示
+    else if (DisplayMode == 3){
+        ChangeCount = 1;
+    }
+    
+    //2段階表示 次駅表示あり、路線名なしパターンに使用
+    else if(DisplayMode == 4){    
+        if(ChangeCount == 1 ){
+            ChangeCount = ChangeCount + 1;
+        }else{
+            ChangeCount = 1;
+        }  
+    }
+    
+    
+    
+    
 }
 
 //書込み対象バッファ,書込み開始位置x,書込み開始位置y,読み出し幅x,読み出し高さy
@@ -527,53 +585,89 @@
 
 
 void SDFileRead(){
+    
+    //3段階表示 LEDBuffer  [種別]路線名(・次駅)
+    //         LEDBuffer2 [種別]行先・次駅
+    //         LEDBuffer3 [種別(英)]行先(英)・次駅(英)
+
     //SDCard
     //種別
     sprintf(SDFilePath,"/sd/E233/Kind/%d.bin",KindNumber);
-    //SDFilePath = "/sd/E233/Kind/2.bin";
     SDBufferWrite(LEDBuffer,0,0,48,32);
-    
     sprintf(SDFilePath,"/sd/E233/Kind/%d.bin",KindNumber);
-    //SDFilePath = "/sd/E233/Kind/2.bin";
     SDBufferWrite(LEDBuffer2,0,0,48,32);    
-    
     //種別(英語)
     sprintf(SDFilePath,"/sd/E233/KindE/%d.bin",KindNumber);
-    //SDFilePath = "/sd/E233/Kind/2.bin";
-    SDBufferWrite(LEDBuffer3,0,0,48,32);    
-    
+    SDBufferWrite(LEDBuffer3,0,0,48,32); 
+           
     //路線名
-    //SDFilePath = "/sd/E233/Line/37.bin";
     sprintf(SDFilePath,"/sd/E233/Line/%d.bin",LineNumber);
     SDBufferWrite(LEDBuffer,48,0,80,32);
-    
     //行先
-    //SDFilePath = "/sd/E233/For/1.bin";
     sprintf(SDFilePath,"/sd/E233/For/%d.bin",ForNumber);
     SDBufferWrite(LEDBuffer2,48,0,80,16);
-    
     //行先(英語)
-    //SDFilePath = "/sd/E233/For/1.bin";
     sprintf(SDFilePath,"/sd/E233/ForE/%d.bin",ForNumber);
     SDBufferWrite(LEDBuffer3,48,0,80,16);
     
     //次停車駅(路線名表示)
     //路線名表示の次停車駅は路線名表示が上半分に収まるときのみ表示
     if(BufferBlankCheck() == 0){
-        //SDFilePath = "/sd/E233/NextStation/1.bin";
         sprintf(SDFilePath,"/sd/E233/NextStation/%d.bin",NextStaNumber);
         SDBufferWrite(LEDBuffer,48,16,80,16);
     }
-
     //次停車駅
-    //SDFilePath = "/sd/E233/NextStation/1.bin";
     sprintf(SDFilePath,"/sd/E233/NextStation/%d.bin",NextStaNumber);
-    SDBufferWrite(LEDBuffer2,48,16,80,16);
-    
+    SDBufferWrite(LEDBuffer2,48,16,80,16);    
     //次停車駅(英語)
-    //SDFilePath = "/sd/E233/NextStation/1.bin";
     sprintf(SDFilePath,"/sd/E233/NextStationE/%d.bin",NextStaNumber);
     SDBufferWrite(LEDBuffer3,48,16,80,16);   
+        
+    //路線コードが0なら2段階表示に変更
+    if(LineNumber == 0){
+        DisplayMode = 4;
+    }else{
+        DisplayMode = 1;
+    }
+        
+    //次駅コードが0なら次駅なしの2段階表示に変更
+    // 2段階表示 LEDBuffer  [種別]路線名
+    //                       LEDBuffer2 [種別]行先(次駅表示なし) 
+    //路線名がない場合(E233-0など)は固定表示
+
+    if(NextStaNumber == 0){
+        //種別
+        sprintf(SDFilePath,"/sd/E233/Kind/%d.bin",KindNumber);
+        SDBufferWrite(LEDBuffer,0,0,48,32);
+        sprintf(SDFilePath,"/sd/E233/Kind/%d.bin",KindNumber);
+        SDBufferWrite(LEDBuffer2,0,0,48,32);        
+    
+       //路線名
+        sprintf(SDFilePath,"/sd/E233/Line2/%d.bin",LineNumber);
+        SDBufferWrite(LEDBuffer,48,0,80,32);
+        //行先
+        sprintf(SDFilePath,"/sd/E233/For2/%d.bin",ForNumber);
+        SDBufferWrite(LEDBuffer2,48,0,80,32);    
+        
+        //路線コードが0なら行先で固定表示       
+        if(LineNumber == 0){
+            DisplayMode = 3;
+        }else{
+            DisplayMode = 2;
+        }    
+    }
+    
+    //WriteMode = 3 固定表示 LEDBuffer2 行先(次駅表示なし 32x128)
+    //else if(WriteMode == 3){
+    if(WriteMode == 3){
+        //データ作ってないからとりあえず80x32の行先データを表示
+        
+        sprintf(SDFilePath,"/sd/E233/For2/%d.bin",ForNumber);
+        SDBufferWrite(LEDBuffer2,48,0,80,32);          
+        
+        DisplayMode = 3;
+        
+    }
     
     
 }
@@ -620,7 +714,7 @@
                 }
                 n = (n1 * 100) + (n2 * 10) + n3;
                 LineNumber = n;
-                pc.printf("Line:%d,",n);     
+                pc.printf("Line:%d\r\n",n);     
             }
             
             if(SerialBuffer[0] == 'K'){
@@ -689,6 +783,38 @@
                 pc.printf("For:%d\r\n",n);     
             }
             
+            if(SerialBuffer[0] == 'N'){
+                unsigned char Sertemp1 = SerialBuffer[1];
+                unsigned char Sertemp2 = SerialBuffer[2];
+                unsigned char Sertemp3 = SerialBuffer[3];
+                int n1 = 0 ;
+                int n2 = 0 ;
+                int n3 = 0 ;
+                int n = 0;
+                
+            
+                if ( Sertemp1 < '0' || Sertemp1 > '9' ) {
+                    // error
+                } else {
+                    n1 = (int)(Sertemp1 - '0') ;
+                    //pc.printf("%d,",n1); 
+                }      
+                if ( Sertemp2 < '0' || Sertemp2 > '9' ) {
+                    // error
+                } else {
+                    n2 = (int)(Sertemp2 - '0') ;
+                    //pc.printf("%d,",n2); 
+                }         
+                if ( Sertemp3 < '0' || Sertemp3 > '9' ) {
+                    // error
+                } else {
+                    n3 = (int)(Sertemp3 - '0') ;
+                    //pc.printf("%d,",n3); 
+                }
+                n = (n1 * 100) + (n2 * 10) + n3;
+                NextStaNumber = n;
+                pc.printf("NextStation:%d\r\n",n);     
+            }
             
             if(SerialBuffer[0] == 'S' && SerialBuffer[1] == 'e' && SerialBuffer[2] == 't'){
                 pc.printf("Set\r\n");