Aliexpressなどで販売されている64x32のフルカラードットマトリクスLED2枚とNucleo F401REを利用して、 E233系の駅停車時、路線名表示ありのLED側面行先表示を再現するプログラムです。 3秒間隔、3段階切替で、路線名、種別、行先、次停車駅を個別に指定することが可能です。
Dependencies: SDFileSystem mbed
Diff: main.cpp
- Revision:
- 24:7232abdf7884
- Parent:
- 23:6fb1181345a7
- Child:
- 25:8b1da0f21d32
--- 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