![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
20210420_monitor
Dependencies: mbed SB1602E TextLCD MSCFILESytem FatFileSystemCpp
main.cpp@1:93775378e5d9, 2020-08-27 (annotated)
- Committer:
- MPPT51
- Date:
- Thu Aug 27 08:14:30 2020 +0000
- Revision:
- 1:93775378e5d9
- Parent:
- 0:78ab42fa3942
- Child:
- 2:14b832fdd69f
ENGLISH ONLY
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MPPT51 | 1:93775378e5d9 | 1 | //20200807モニタリングシステム kikkawa |
MPPT51 | 1:93775378e5d9 | 2 | //CAN, dekaLCD, 4*20LCD |
MPPT51 | 1:93775378e5d9 | 3 | #include "stdio.h" |
MPPT51 | 0:78ab42fa3942 | 4 | #include "mbed.h" |
MPPT51 | 1:93775378e5d9 | 5 | #include "SB1602E.h" //デカ文字LCD |
MPPT51 | 1:93775378e5d9 | 6 | #include "TextLCD.h" //4*20LCD |
MPPT51 | 1:93775378e5d9 | 7 | #include "MSCFileSystem.h" //USBメモリ |
MPPT51 | 1:93775378e5d9 | 8 | #include <string> |
MPPT51 | 1:93775378e5d9 | 9 | |
MPPT51 | 1:93775378e5d9 | 10 | TextLCD lcd1(p15, p16, p17, p18, p19, p20); // RS, E, DB4, DB5, DB6, DB7 //4*20LCDのピン設定 |
MPPT51 | 1:93775378e5d9 | 11 | SB1602E lcd2( p28, p27 ); // SDA, SCL //デカ文字LCDのピン設定 |
MPPT51 | 1:93775378e5d9 | 12 | Serial pc(USBTX, USBRX); // USBシリアルポートのインスタンス |
MPPT51 | 1:93775378e5d9 | 13 | |
MPPT51 | 0:78ab42fa3942 | 14 | Ticker ticker; //タイマ割り込み設定 |
MPPT51 | 0:78ab42fa3942 | 15 | DigitalOut led1(LED1); |
MPPT51 | 0:78ab42fa3942 | 16 | DigitalOut led2(LED2); |
MPPT51 | 1:93775378e5d9 | 17 | DigitalOut led3(LED3); |
MPPT51 | 1:93775378e5d9 | 18 | DigitalOut led4(LED4); |
MPPT51 | 1:93775378e5d9 | 19 | CAN can1(p30, p29); //CANのピン設定 |
MPPT51 | 0:78ab42fa3942 | 20 | |
MPPT51 | 1:93775378e5d9 | 21 | //printf用 |
MPPT51 | 1:93775378e5d9 | 22 | char cnt_printf = 0; |
MPPT51 | 1:93775378e5d9 | 23 | Timer timer1; //いろんなprintf表示用のタイマー |
MPPT51 | 1:93775378e5d9 | 24 | Timer timer2; //処理時確認用タイマー |
MPPT51 | 1:93775378e5d9 | 25 | /*テレメトリシステム(XBee)の設定*/ |
MPPT51 | 1:93775378e5d9 | 26 | Serial xbee(p13,p14); //XBeeとシリアル通信するピンの設定 |
MPPT51 | 1:93775378e5d9 | 27 | /*LCDの設定*/ |
MPPT51 | 1:93775378e5d9 | 28 | void LCD_write(void); //USBへデータを書き込む関数 |
MPPT51 | 1:93775378e5d9 | 29 | float Vmotor = 0.0, Cmotor = 0.0, Pmotor = 0.0; //モタコンからの電圧、電流、電力を代入する変数 |
MPPT51 | 0:78ab42fa3942 | 30 | float speed = 0.0; //モタコンから送られてきた速度データを入れる変数 |
MPPT51 | 1:93775378e5d9 | 31 | signed char dutylatio = 0; //モタコンから送られてきたアクセル開度データを入れる変数 |
MPPT51 | 1:93775378e5d9 | 32 | float Vsolar = 0.0, Csolar = 0.0, Psolar = 0.0; //MPPTからの電圧、電流、電力を代入する変数 |
MPPT51 | 1:93775378e5d9 | 33 | float Vbatt = 0.0, Vbatt_max = 0.0, Vbatt_avg = 0.0, Vbatt_min = 0.0, Cbatt = 0.0; //BMSからの電圧、電流を入れる変数 |
MPPT51 | 1:93775378e5d9 | 34 | float Pbatt = 0.0; |
MPPT51 | 1:93775378e5d9 | 35 | /*CANの設定*/ |
MPPT51 | 1:93775378e5d9 | 36 | bool CANrecieveOK = 0; //CAN受信完了時,セットする(mainでのprintfのため入れているが、無くても問題ない) |
MPPT51 | 1:93775378e5d9 | 37 | CANMessage msgCAN; //CANで受信したデータがmsgCANに入る |
MPPT51 | 1:93775378e5d9 | 38 | /*USBメモリの設定*/ |
MPPT51 | 1:93775378e5d9 | 39 | MSCFileSystem msc("usb"); // Mount flash drive under the name "msc" |
MPPT51 | 1:93775378e5d9 | 40 | void MSC_init(void); //USBの初期設定関数 |
MPPT51 | 1:93775378e5d9 | 41 | void write_MSC(void); //USBへデータを書き込む関数 |
MPPT51 | 1:93775378e5d9 | 42 | FILE *fp; |
MPPT51 | 1:93775378e5d9 | 43 | FILE *fp1; |
MPPT51 | 1:93775378e5d9 | 44 | char running = 0; //running==1(走行中)のとき、USBメモリにデータを保存する |
MPPT51 | 1:93775378e5d9 | 45 | short fileNumber; //既存データが消えないように。保存ファイルを任意に切り替えられるように |
MPPT51 | 1:93775378e5d9 | 46 | int r = 5; |
MPPT51 | 1:93775378e5d9 | 47 | char nunu[5] = {0,0,0,0,0}; |
MPPT51 | 1:93775378e5d9 | 48 | char cary[30] = {}; |
MPPT51 | 1:93775378e5d9 | 49 | bool usbCheck = 0; //USBメモリが接続されているかいないか判定する変数 |
MPPT51 | 1:93775378e5d9 | 50 | bool USBcheck = 0; |
MPPT51 | 0:78ab42fa3942 | 51 | |
MPPT51 | 1:93775378e5d9 | 52 | void MSC_init(){ //USBメモリの初期設定関数 |
MPPT51 | 1:93775378e5d9 | 53 | pc.printf("\n\r" ); |
MPPT51 | 1:93775378e5d9 | 54 | pc.printf("USBstart\n\r" ); |
MPPT51 | 1:93775378e5d9 | 55 | fp = fopen( "/usb/fileNumber.txt", "r" ); //ファイル名を変更するための番号txtファイルを読み込む |
MPPT51 | 1:93775378e5d9 | 56 | if( fp == NULL ){ //error( "Could not open main0\n\r" ); //error()の関数を使うと動作止まるので使わない。。 |
MPPT51 | 1:93775378e5d9 | 57 | pc.printf("USB init error\n\r" ); |
MPPT51 | 1:93775378e5d9 | 58 | //LCDにUSB:×を表示させる処理 |
MPPT51 | 1:93775378e5d9 | 59 | lcd1.locate(15, 3); //4*20LCDの4行目に表示 //lcd1.locate(横方向, 縦方向) |
MPPT51 | 1:93775378e5d9 | 60 | lcd1.printf("USB:x"); |
MPPT51 | 1:93775378e5d9 | 61 | } |
MPPT51 | 1:93775378e5d9 | 62 | else { //usbhost_lpc17xx.cppでの処理につながる |
MPPT51 | 1:93775378e5d9 | 63 | usbCheck = 1; |
MPPT51 | 1:93775378e5d9 | 64 | //LCDにUSB:×を表示させる処理 |
MPPT51 | 1:93775378e5d9 | 65 | lcd1.locate(15, 3); //4*20LCDの4行目に表示 //lcd1.locate(横方向, 縦方向) |
MPPT51 | 1:93775378e5d9 | 66 | lcd1.printf("USB:o"); |
MPPT51 | 1:93775378e5d9 | 67 | //USBに保存してるファイル番号管理txtから数字を読み取る |
MPPT51 | 1:93775378e5d9 | 68 | fscanf( fp, "%d",&fileNumber ); |
MPPT51 | 1:93775378e5d9 | 69 | fclose(fp); |
MPPT51 | 1:93775378e5d9 | 70 | pc.printf("fileNumber: %d\n\r",fileNumber ); |
MPPT51 | 1:93775378e5d9 | 71 | fp = fopen( "/usb/fileNumber.txt", "w" ); //ファイルを開く //exit(1);でプログラムを終了できる(BlueLightsOfDeath) |
MPPT51 | 1:93775378e5d9 | 72 | ++fileNumber; //flieNumber.txtで読み取った番号に+1して、ファイル名が被らないようにする(上書きされないように) |
MPPT51 | 1:93775378e5d9 | 73 | sprintf(nunu, "%5d", fileNumber); //文字列(string)「nunu 」に数値(char)「fileNumber 」を入れる //"%5d"みたいに5(数値)を入れると5桁分確保できる //charをstringに変換する |
MPPT51 | 1:93775378e5d9 | 74 | pc.printf( "FileNumber==> %s\n\r", nunu ); // |
MPPT51 | 1:93775378e5d9 | 75 | fprintf( fp,"%d\n", fileNumber ); //変えた番号をfileNumber.txtに書き込み |
MPPT51 | 1:93775378e5d9 | 76 | fclose(fp); |
MPPT51 | 1:93775378e5d9 | 77 | std::string str_1 = "/usb/Monitor"; //char* c_str = filename.c_str(); |
MPPT51 | 1:93775378e5d9 | 78 | str_1 += nunu[0]; str_1 += nunu[1]; str_1 += nunu[2]; str_1 += nunu[3]; str_1 += nunu[4]; |
MPPT51 | 1:93775378e5d9 | 79 | str_1 += ".csv"; |
MPPT51 | 1:93775378e5d9 | 80 | str_1.copy( cary, 30 ); |
MPPT51 | 1:93775378e5d9 | 81 | pc.printf( "USB==> %s\n\r", cary ); |
MPPT51 | 1:93775378e5d9 | 82 | fp1 = fopen( cary, "w" ); //データログ用のファイルを開く |
MPPT51 | 1:93775378e5d9 | 83 | if(fp1 == NULL){;} |
MPPT51 | 1:93775378e5d9 | 84 | fprintf( fp1,"Speed(km/h),dutyCycle,Vmotor(V),Cmotor(A),Pmotor(W),Vsolar(V),Csolar(A),Psolar(W),Vbatt(V),Cbatt(A),Pbatt(W),Vbatt_max(V),Vbatt_avg(V),Vbatt_min(V)\n" ); //ファイル書き込み |
MPPT51 | 1:93775378e5d9 | 85 | fclose(fp1); //ファイルを閉じる |
MPPT51 | 1:93775378e5d9 | 86 | } |
MPPT51 | 1:93775378e5d9 | 87 | } |
MPPT51 | 1:93775378e5d9 | 88 | void Handler_can1Recieve(){ |
MPPT51 | 1:93775378e5d9 | 89 | if( can1.read( msgCAN ) ){ //msgCANに送られたデータが入る |
MPPT51 | 1:93775378e5d9 | 90 | if( msgCAN.id == 0x10 ){ //送られてきたデータのIDが0x10であればデータ処理する モタコンID: 0x10 |
MPPT51 | 1:93775378e5d9 | 91 | Vmotor = ( (float)( (msgCAN.data[0]*100) + msgCAN.data[1]) ) / 10; //15 43を1500 43にして足すと「1543」となり、÷10すると154.3 [V] |
MPPT51 | 1:93775378e5d9 | 92 | Cmotor = ( (float)( ((signed char)msgCAN.data[2]*100) + (signed char)msgCAN.data[3] ) ) / 100; //5 54を500 54にして足すと5「554」となり、÷100すると5.54 [A] |
MPPT51 | 1:93775378e5d9 | 93 | Pmotor = Vmotor * Cmotor; |
MPPT51 | 1:93775378e5d9 | 94 | speed = ( (float)( (msgCAN.data[4]*100) + msgCAN.data[5]) ) / 10; //「856」を85.6[km/h]にするため,÷10する |
MPPT51 | 1:93775378e5d9 | 95 | dutylatio = (signed char)msgCAN.data[6]; //アクセル開度は0~100表示のため,そのまま |
MPPT51 | 0:78ab42fa3942 | 96 | } |
MPPT51 | 1:93775378e5d9 | 97 | else if( msgCAN.id == 0x20 ){ //送られてきたデータのIDが0x20であればデータ処理する MPPTID: 0x20 |
MPPT51 | 1:93775378e5d9 | 98 | Vsolar = ( (float)( (msgCAN.data[0]*100) + msgCAN.data[1]) ) / 10; |
MPPT51 | 1:93775378e5d9 | 99 | Csolar = ( (float)( (signed int)((signed char)msgCAN.data[2]*100) + (signed char)msgCAN.data[3] ) ) / 100; |
MPPT51 | 1:93775378e5d9 | 100 | Psolar = Vsolar * Csolar; |
MPPT51 | 0:78ab42fa3942 | 101 | } |
MPPT51 | 1:93775378e5d9 | 102 | else if( msgCAN.id == 0x30 ){ //送られてきたデータのIDが0x10であればデータ処理する BMSID: 0x30 |
MPPT51 | 1:93775378e5d9 | 103 | Vbatt = ( (float)( (msgCAN.data[0]*100) + msgCAN.data[1]) ) / 10; |
MPPT51 | 1:93775378e5d9 | 104 | Cbatt = ( (float)( (signed int)((signed char)msgCAN.data[2]*100) + (signed char)msgCAN.data[3] ) ) / 100; |
MPPT51 | 1:93775378e5d9 | 105 | Pbatt = Vbatt * Cbatt; |
MPPT51 | 1:93775378e5d9 | 106 | Vbatt_min = ( (float)( (msgCAN.data[4]*100) + msgCAN.data[5] ) ) / 100; |
MPPT51 | 1:93775378e5d9 | 107 | Vbatt_max = ( (float)( (msgCAN.data[6]*100) + msgCAN.data[7] ) ) / 100; |
MPPT51 | 1:93775378e5d9 | 108 | Vbatt_avg = Vbatt / 27; //バッテリ電圧をセルの直列数(20200807現在、27直列)で割って平均電圧を算出する |
MPPT51 | 0:78ab42fa3942 | 109 | } |
MPPT51 | 0:78ab42fa3942 | 110 | led2 = !led2; |
MPPT51 | 0:78ab42fa3942 | 111 | CANrecieveOK = 1; |
MPPT51 | 0:78ab42fa3942 | 112 | } |
MPPT51 | 0:78ab42fa3942 | 113 | } |
MPPT51 | 1:93775378e5d9 | 114 | void LCD_write(){ //LCDにデータを表示させる関数 |
MPPT51 | 1:93775378e5d9 | 115 | //4行LCDへの表示 //lcd1.locate(横方向, 縦方向) |
MPPT51 | 1:93775378e5d9 | 116 | lcd1.locate(0, 0); //4*20LCDの一番上の行に表示 |
MPPT51 | 1:93775378e5d9 | 117 | lcd1.printf("%5.3fv %5.3fv %5.3fv", Vbatt_max, Vbatt_avg, Vbatt_min); //バッテリ セルの最大電圧平均電圧最小電圧を表示 |
MPPT51 | 1:93775378e5d9 | 118 | lcd1.locate(0, 1); //4*20LCDの2行目に表示 |
MPPT51 | 1:93775378e5d9 | 119 | lcd1.printf("B:%5.1fv%5.1fA%5.0fw", Vbatt, Cbatt, Pbatt); //-10.0Aとかでも表示の桁が変わらないように%5.1fにしている |
MPPT51 | 1:93775378e5d9 | 120 | lcd1.locate(0, 2); //4*20LCDの3行目に表示 |
MPPT51 | 1:93775378e5d9 | 121 | lcd1.printf("M:%5.1fA", Cmotor); |
MPPT51 | 1:93775378e5d9 | 122 | lcd1.locate(0, 3); //4*20LCDの4行目に表示 |
MPPT51 | 1:93775378e5d9 | 123 | lcd1.printf("S:%5.1fA", Csolar); |
MPPT51 | 1:93775378e5d9 | 124 | //デカ文字LCDへの表示 |
MPPT51 | 1:93775378e5d9 | 125 | lcd2.printf( 0, "%5.1fkm/h %5.1fv\r", speed, Vmotor ); // 速度、IPM入力電圧(システム電圧)の表示 |
MPPT51 | 1:93775378e5d9 | 126 | lcd2.printf( 1, "%5.0fw %4.0fw %3d\r", Pmotor, Psolar, dutylatio ); //消費電力、発電電力、バッテリ電圧の表示 |
MPPT51 | 1:93775378e5d9 | 127 | } |
MPPT51 | 1:93775378e5d9 | 128 | void Handler_can1Error(){ //CANバスエラーが発生した際に実行する関数 |
MPPT51 | 1:93775378e5d9 | 129 | // lcd1.locate(0, 3); //4*20LCDの一番下の行の左端にエラーと表示する |
MPPT51 | 1:93775378e5d9 | 130 | // lcd1.printf("CAN_Error\n\r"); |
MPPT51 | 0:78ab42fa3942 | 131 | } |
MPPT51 | 0:78ab42fa3942 | 132 | int main() { |
MPPT51 | 1:93775378e5d9 | 133 | timer1.start(); //printf用タイマースタート |
MPPT51 | 1:93775378e5d9 | 134 | timer2.start(); //printf用タイマースタート |
MPPT51 | 1:93775378e5d9 | 135 | pc.baud(115200); //9600bpsで150ms 115200bpsで13msくらい処理速度が違う(処理時間は送るデータ量にもよる) |
MPPT51 | 1:93775378e5d9 | 136 | xbee.baud(115200); |
MPPT51 | 1:93775378e5d9 | 137 | xbee.printf("XBee => OK\n\r"); |
MPPT51 | 1:93775378e5d9 | 138 | can1.attach(&Handler_can1Recieve, CAN::RxIrq); //CAN受信割り込みの設定 |
MPPT51 | 1:93775378e5d9 | 139 | can1.attach(&Handler_can1Error, CAN::BeIrq ); //バスエラー時の割り込み設定 |
MPPT51 | 1:93775378e5d9 | 140 | MSC_init(); //USBメモリ初期化 |
MPPT51 | 0:78ab42fa3942 | 141 | |
MPPT51 | 0:78ab42fa3942 | 142 | while(1) { |
MPPT51 | 1:93775378e5d9 | 143 | //PCへのシリアル通信処理(teratermなどへ表示) |
MPPT51 | 1:93775378e5d9 | 144 | if( timer1.read_ms() >= 50 && !cnt_printf ){ //0.1秒ごとにprintf処理をする |
MPPT51 | 1:93775378e5d9 | 145 | //xbee.printf(" timer1: %d timer2: %d", timer1.read_ms(), timer2.read_ms()); |
MPPT51 | 1:93775378e5d9 | 146 | xbee.printf("timer1: %d", timer1.read_ms() ); |
MPPT51 | 1:93775378e5d9 | 147 | //printf("SPD:%5.1f DC:%3d Vmot:%5.1f Cmot:%6.2f Pmot:%6.1f Vsol:%5.1f Csol:%6.2f Psol:%5.1f Vbat:%5.1f Cbat:%6.2f Pbat:%6.1f Vmax:%5.3f Vavg:%5.3f Vmin:%5.3f\n\r", speed, dutylatio, Vmotor, Cmotor, Pmotor, Vsolar, Csolar, Psolar, Vbatt, Cbatt, Pbatt, Vbatt_max, Vbatt_avg, Vbatt_min ); |
MPPT51 | 1:93775378e5d9 | 148 | pc.printf("%5.1f km/h Duty:%3d Motor:%5.1f(V),%6.2f(A),%6.1f(W) solar:%5.1f(V),%6.2f(A),%5.1f(W)", speed, dutylatio, Vmotor, Cmotor, Pmotor, Vsolar, Csolar, Psolar ); |
MPPT51 | 1:93775378e5d9 | 149 | pc.printf(" bat:%5.1f(V),%6.2f(A),%6.1f(W),max:%5.3f,avg:%5.3f,min:%5.3f\n\r", Vbatt, Cbatt, Pbatt, Vbatt_max, Vbatt_avg, Vbatt_min ); |
MPPT51 | 1:93775378e5d9 | 150 | xbee.printf(" timer1: %d", timer1.read_ms() ); |
MPPT51 | 1:93775378e5d9 | 151 | //xbee.printf(" timer1: %d timer2: %d\n\r", timer1.read_ms(), timer2.read_ms()); |
MPPT51 | 1:93775378e5d9 | 152 | //LCDへの書き込み処理 |
MPPT51 | 1:93775378e5d9 | 153 | LCD_write(); |
MPPT51 | 1:93775378e5d9 | 154 | cnt_printf = 1; |
MPPT51 | 1:93775378e5d9 | 155 | } |
MPPT51 | 1:93775378e5d9 | 156 | if( timer1.read_ms() >= 100 && cnt_printf ){ //0.1秒ごとにprintf処理をする |
MPPT51 | 1:93775378e5d9 | 157 | xbee.printf(" timer1: %d", timer1.read_ms() ); |
MPPT51 | 1:93775378e5d9 | 158 | //USBが刺さっているかいないか確認し、データを書き込む処理 |
MPPT51 | 1:93775378e5d9 | 159 | if( usbCheck ){ //初期設定時(プログラムスタート時)、USBが刺さっていればusbCheck==1(true) |
MPPT51 | 1:93775378e5d9 | 160 | fp1 = fopen( cary, "a"); //ファイルを開く, aは上書きの命令(ファイルが存在しなければ新規作成する) |
MPPT51 | 1:93775378e5d9 | 161 | if ( fp1 == NULL ){ //ファイルを開けなかった場合 |
MPPT51 | 1:93775378e5d9 | 162 | usbCheck = 0; //USBが刺さってない(USBが抜けた)と判定する |
MPPT51 | 1:93775378e5d9 | 163 | lcd1.locate(15, 3); //4*20LCDの4行目に表示 //lcd1.locate(横方向, 縦方向) |
MPPT51 | 1:93775378e5d9 | 164 | lcd1.printf("USB:x"); //LCDに、USBは未接続(X)と表示する |
MPPT51 | 1:93775378e5d9 | 165 | } |
MPPT51 | 1:93775378e5d9 | 166 | else { //開けたらする処理 |
MPPT51 | 1:93775378e5d9 | 167 | //メモリへの書き込み |
MPPT51 | 1:93775378e5d9 | 168 | fprintf( fp1,"%5.1f,%3d,%5.1f,%5.1f,%6.1f,%5.1f,%5.1f,%6.1f,%5.1f,%5.1f,%6.1f,%5.3f,%5.3f,%5.3f\n", speed, dutylatio, Vmotor, Cmotor, Pmotor, Vsolar, Csolar, Psolar, Vbatt, Cbatt, Pbatt, Vbatt_max, Vbatt_avg, Vbatt_min ); |
MPPT51 | 1:93775378e5d9 | 169 | fclose(fp1); //ファイルを閉じる |
MPPT51 | 1:93775378e5d9 | 170 | } |
MPPT51 | 1:93775378e5d9 | 171 | } |
MPPT51 | 1:93775378e5d9 | 172 | xbee.printf(" timer1: %d\n\r", timer1.read_ms() ); |
MPPT51 | 1:93775378e5d9 | 173 | cnt_printf = 0; |
MPPT51 | 1:93775378e5d9 | 174 | timer1.reset(); |
MPPT51 | 1:93775378e5d9 | 175 | } |
MPPT51 | 1:93775378e5d9 | 176 | /*if( !running ){ data file change } |
MPPT51 | 1:93775378e5d9 | 177 | else if( running ){ write_MSC(); //USBメモリへ書き込む関数}*/ |
MPPT51 | 1:93775378e5d9 | 178 | //CANrecieveOK = 0; |
MPPT51 | 0:78ab42fa3942 | 179 | } |
MPPT51 | 0:78ab42fa3942 | 180 | } |