![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Monitor20210726_ver1 add_im920
Dependencies: mbed SB1602E TextLCD MSCFILESytem FatFileSystemCpp
main.cpp@3:fc42787d68a6, 2021-07-26 (annotated)
- Committer:
- MPPT51
- Date:
- Mon Jul 26 05:53:49 2021 +0000
- Revision:
- 3:fc42787d68a6
- Parent:
- 2:14b832fdd69f
210726_commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MPPT51 | 3:fc42787d68a6 | 1 | |
MPPT51 | 3:fc42787d68a6 | 2 | //20210722モニタリングシステム kikkawa //積算発電積算消費 |
MPPT51 | 3:fc42787d68a6 | 3 | |
MPPT51 | 3:fc42787d68a6 | 4 | #include "mbed.h" // 必須 |
MPPT51 | 3:fc42787d68a6 | 5 | #include "stdio.h" // ファイル操作 |
MPPT51 | 3:fc42787d68a6 | 6 | #include "SB1602E.h" // デカ文字LCD |
MPPT51 | 3:fc42787d68a6 | 7 | #include "TextLCD.h" // 4*20LCD |
MPPT51 | 3:fc42787d68a6 | 8 | #include "MSCFileSystem.h" // USBメモリ |
MPPT51 | 3:fc42787d68a6 | 9 | #include <string> // 文字列操作 |
MPPT51 | 1:93775378e5d9 | 10 | |
MPPT51 | 3:fc42787d68a6 | 11 | /* タイマの設定 */ |
MPPT51 | 3:fc42787d68a6 | 12 | Timer tm1; // タイマー時間の初期化(処理時間計測に使用) |
MPPT51 | 3:fc42787d68a6 | 13 | Timer time0t5s; // main関数での処理に使用 |
MPPT51 | 3:fc42787d68a6 | 14 | Timer time0t2s; // main関数での処理に使用 |
MPPT51 | 3:fc42787d68a6 | 15 | |
MPPT51 | 3:fc42787d68a6 | 16 | //Ticker tick; // 繰り返しタイマ割り込みの初期化 |
MPPT51 | 3:fc42787d68a6 | 17 | TextLCD lcd1(p15,p16,p17,p18,p19,p20); // 4行LCDのポート設定(RS,E,DB4,DB5,DB6,DB7) |
MPPT51 | 3:fc42787d68a6 | 18 | SB1602E lcd2(p28,p27); // デカ文字LCDのポート設定(SDA,SCL) |
MPPT51 | 3:fc42787d68a6 | 19 | Serial pc(USBTX,USBRX); // USBシリアルポートの設定 |
MPPT51 | 3:fc42787d68a6 | 20 | Serial im920(p13, p14); // p13(tx),p14(rx)をIM920とのシリアル通信ポートに設定 |
MPPT51 | 3:fc42787d68a6 | 21 | CAN can(p30, p29); // CANのポート設定 |
MPPT51 | 0:78ab42fa3942 | 22 | |
MPPT51 | 3:fc42787d68a6 | 23 | DigitalOut led1(LED1); // LPC1768ボード上1番目のLEDの設定 |
MPPT51 | 3:fc42787d68a6 | 24 | DigitalOut led2(LED2); // LPC1768ボード上2番目のLEDの設定 |
MPPT51 | 3:fc42787d68a6 | 25 | DigitalOut led3(LED3); // LPC1768ボード上3番目のLEDの設定 |
MPPT51 | 3:fc42787d68a6 | 26 | DigitalOut led4(LED4); // LPC1768ボード上4番目のLEDの設定 |
MPPT51 | 3:fc42787d68a6 | 27 | |
MPPT51 | 3:fc42787d68a6 | 28 | /* 変数の宣言 */ |
MPPT51 | 3:fc42787d68a6 | 29 | bool LED = 1; // 1のときLPC1768ボード上のLED(1~4)の点灯・点滅処理を実行. 0のとき点灯・点滅させない |
MPPT51 | 3:fc42787d68a6 | 30 | int MPPTerror=0; // MPPT1のエラー信号を格納する変数 |
MPPT51 | 3:fc42787d68a6 | 31 | int MPPTerror_2=0; // MPPT2のエラー信号を格納する変数 |
MPPT51 | 3:fc42787d68a6 | 32 | int direc=0; // 進行方向(direction)を格納する変数 |
MPPT51 | 3:fc42787d68a6 | 33 | float Vmot=0, Cmot=0, Pmot=0; // 消費電圧、電流、電力を格納する変数 |
MPPT51 | 3:fc42787d68a6 | 34 | float Vsol=0, Csol=0, Psol=0; // 発電電圧・電流・電力を格納する変数 |
MPPT51 | 3:fc42787d68a6 | 35 | float Vbat=0, Cbat=0, Pbat=0; // バッテリ電圧・電流・電力を格納する変数 |
MPPT51 | 3:fc42787d68a6 | 36 | float VcelMax=0,VcelAve=0,VcelMin=0; // セル最大・平均・最小電圧を格納する変数 |
MPPT51 | 3:fc42787d68a6 | 37 | float speed=0; // 走行速度を格納する変数 |
MPPT51 | 3:fc42787d68a6 | 38 | signed char duty=0; // スロットル開度を格納する変数 |
MPPT51 | 3:fc42787d68a6 | 39 | |
MPPT51 | 3:fc42787d68a6 | 40 | int cntTera = 0; |
MPPT51 | 3:fc42787d68a6 | 41 | |
MPPT51 | 3:fc42787d68a6 | 42 | /* ユーザ定義関数の宣言 */ |
MPPT51 | 3:fc42787d68a6 | 43 | void init(void); //初期化を行う関数を宣言 |
MPPT51 | 3:fc42787d68a6 | 44 | void printTera(void); // Teraterm表示を行う関数を宣言 |
MPPT51 | 3:fc42787d68a6 | 45 | |
MPPT51 | 3:fc42787d68a6 | 46 | |
MPPT51 | 3:fc42787d68a6 | 47 | /* IM920(テレメトリ)の設定 */ |
MPPT51 | 3:fc42787d68a6 | 48 | int cntIM920 = 0; |
MPPT51 | 3:fc42787d68a6 | 49 | void printIM920(void); // PC(teraterm), IM920(テレメトリシステム), LCDへのprintf処理を行う関数 |
MPPT51 | 0:78ab42fa3942 | 50 | |
MPPT51 | 3:fc42787d68a6 | 51 | /* LCDの設定 */ |
MPPT51 | 3:fc42787d68a6 | 52 | int cntLCD=0; |
MPPT51 | 3:fc42787d68a6 | 53 | void printLCD(void); // LCDにデータ表示する関数 |
MPPT51 | 3:fc42787d68a6 | 54 | |
MPPT51 | 3:fc42787d68a6 | 55 | /* CAN通信の設定 */ |
MPPT51 | 3:fc42787d68a6 | 56 | char cntCAN = 0; // CAN受信でカウントアップする変数 |
MPPT51 | 3:fc42787d68a6 | 57 | void readCAN(void); |
MPPT51 | 3:fc42787d68a6 | 58 | CANMessage bufCANmot(0x10); // CAN受信用バッファの初期化(バッファ(buf): データを一時的に格納するためのメモリー領域) |
MPPT51 | 3:fc42787d68a6 | 59 | CANMessage bufCANsol(0x20); // CAN受信用バッファの初期化(バッファ(buf): データを一時的に格納するためのメモリー領域) |
MPPT51 | 3:fc42787d68a6 | 60 | CANMessage bufCANbat(0x30); // CAN受信用バッファの初期化(バッファ(buf): データを一時的に格納するためのメモリー領域) |
MPPT51 | 3:fc42787d68a6 | 61 | |
MPPT51 | 3:fc42787d68a6 | 62 | |
MPPT51 | 3:fc42787d68a6 | 63 | /* USBメモリ(MSC:マスストレージクラス)の設定 */ |
MPPT51 | 3:fc42787d68a6 | 64 | MSCFileSystem msc("usb"); // Mount flash drive under the name "usb" |
MPPT51 | 3:fc42787d68a6 | 65 | char *str1 = "/usb/log"; // 保存先("usb")とファイル名の一部(log)を指定 |
MPPT51 | 3:fc42787d68a6 | 66 | char *str2 = ".csv"; // ファイルの拡張子を指定 |
MPPT51 | 3:fc42787d68a6 | 67 | char fileName[30]; // ファイル名を格納する配列 |
MPPT51 | 3:fc42787d68a6 | 68 | char oxMSC; // 接続有無("o"か"x")を格納する変数(1文字用) |
MPPT51 | 3:fc42787d68a6 | 69 | int cntMSC=0; // 処理を行うごとにカウントアップする変数 |
MPPT51 | 3:fc42787d68a6 | 70 | void initMSC(void); // MSC(USB Mass Storage Class)の初期設定関数 |
MPPT51 | 3:fc42787d68a6 | 71 | void saveMSC(void); // MSCへデータを書き込む関数 |
MPPT51 | 3:fc42787d68a6 | 72 | FILE *fp2; // ファイル構造体の定義 |
MPPT51 | 3:fc42787d68a6 | 73 | |
MPPT51 | 3:fc42787d68a6 | 74 | void initMSC(){ // USBメモリの初期設定関数 |
MPPT51 | 3:fc42787d68a6 | 75 | FILE *fp1; // ファイル構造体を定義 |
MPPT51 | 3:fc42787d68a6 | 76 | int fileNumber = 0; // csvファイル命名に使用する変数を宣言 |
MPPT51 | 3:fc42787d68a6 | 77 | |
MPPT51 | 3:fc42787d68a6 | 78 | fp1 = fopen( "/usb/fileNumber.txt", "r" ); // USBメモリ内の"fileNumber.txt"を読み取りモードで開く |
MPPT51 | 3:fc42787d68a6 | 79 | if( fp1 == NULL ){ // アクセスできなかったとき, ...error( "Could not open main0\n\r" );を入れても良い |
MPPT51 | 3:fc42787d68a6 | 80 | pc.printf("USB init error\n\r" ); // teratermに"USB ini error"を表示 |
MPPT51 | 3:fc42787d68a6 | 81 | oxMSC = 'x'; // MSCが接続されていないため"x"を格納(1文字なのでシングルクォーテーション) |
MPPT51 | 1:93775378e5d9 | 82 | } |
MPPT51 | 3:fc42787d68a6 | 83 | else { // アクセスできたとき ...sbhost_lpc17xx.cppでの処理につながる |
MPPT51 | 3:fc42787d68a6 | 84 | oxMSC = 'o'; // 1文字だからシングルクォーテーションで囲む |
MPPT51 | 3:fc42787d68a6 | 85 | fscanf( fp1,"%d",&fileNumber ); // "fileNumber.txt"の数字を読み取り,変数"fileNumber"に格納する |
MPPT51 | 3:fc42787d68a6 | 86 | fclose( fp1 ); // "fileNumber.txt"を閉じる |
MPPT51 | 3:fc42787d68a6 | 87 | |
MPPT51 | 3:fc42787d68a6 | 88 | fp1 = fopen( "/usb/fileNumber.txt", "w" ); // "fileNumber.txt"を書き込みモードで開く //exit(1);でBlueLightsOfDeath |
MPPT51 | 3:fc42787d68a6 | 89 | fprintf( fp1,"%d\n", fileNumber+1 ); // 読み込んだ数値に+1してfileNumber.txtに書き込み |
MPPT51 | 3:fc42787d68a6 | 90 | fclose(fp1); |
MPPT51 | 3:fc42787d68a6 | 91 | |
MPPT51 | 3:fc42787d68a6 | 92 | sprintf(fileName,"%s%d%s\n", str1, fileNumber, str2); // 文字列の結合(データログ用ファイル名の作成) |
MPPT51 | 3:fc42787d68a6 | 93 | pc.printf( "\n\rUSB fileName: %s\n\r", fileName ); // 作成したファイル名をteratermに表示 |
MPPT51 | 3:fc42787d68a6 | 94 | |
MPPT51 | 3:fc42787d68a6 | 95 | fp2 = fopen( fileName, "w" ); // ファイルの新規作成後書き込み, ファイルがある場合上書き |
MPPT51 | 3:fc42787d68a6 | 96 | if(fp2 != NULL){ // NULLじゃないとき(ファイルを開けた時) |
MPPT51 | 3:fc42787d68a6 | 97 | fprintf( fp2,"Speed(km/h),dutyCycle,Vmot(V),Cmot(A),Pmot(W),Vsol(V),Csol(A),Psol(W),Vbat(V),Cbat(A),Pbat(W),VcelMax(V),VcelAve(V),VcelMin(V)\n" ); //ファイル書き込み |
MPPT51 | 3:fc42787d68a6 | 98 | fclose(fp2); // csvファイル1行目にデータ項目を入力してファイルを閉じる |
MPPT51 | 3:fc42787d68a6 | 99 | } |
MPPT51 | 0:78ab42fa3942 | 100 | } |
MPPT51 | 0:78ab42fa3942 | 101 | } |
MPPT51 | 3:fc42787d68a6 | 102 | |
MPPT51 | 3:fc42787d68a6 | 103 | void saveMSC(){ // 処理時間50ms以上(MBED Timerで計測,データ量による) |
MPPT51 | 3:fc42787d68a6 | 104 | ++cntMSC; // MSCカウンタをインクリメント |
MPPT51 | 3:fc42787d68a6 | 105 | if( cntMSC >= 255){ cntMSC = 0; } // 255になったらリセット |
MPPT51 | 3:fc42787d68a6 | 106 | if( LED ){ led3 = !led3; } // led3を点滅させる処理. !はNOTの意味 |
MPPT51 | 3:fc42787d68a6 | 107 | if( oxMSC == 'o' ){ |
MPPT51 | 3:fc42787d68a6 | 108 | fp2 = fopen( fileName, "a"); // ファイルを上書きモードで開く(ファイルがなければ新規作成) |
MPPT51 | 3:fc42787d68a6 | 109 | if ( fp2 == NULL ){ // ファイルを開けなかったとき, |
MPPT51 | 3:fc42787d68a6 | 110 | oxMSC = 'x'; // MSCが接続されていないため"x"を格納(1文字なのでシングルクォーテーション) |
MPPT51 | 3:fc42787d68a6 | 111 | //pc.printf("2%cxxxxxxxxxxxxxxxxxxxxxxxx\n", oxMSC); |
MPPT51 | 3:fc42787d68a6 | 112 | }else { // USBメモリ内のファイルを開くことができたとき, |
MPPT51 | 3:fc42787d68a6 | 113 | fprintf( fp2,"%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", |
MPPT51 | 3:fc42787d68a6 | 114 | speed, duty, Vmot, Cmot, Pmot, Vsol, Csol, Psol, Vbat, Cbat, Pbat, VcelMax, VcelAve, VcelMin ); |
MPPT51 | 3:fc42787d68a6 | 115 | fclose(fp2); // データを書き込んだ後,ファイルを閉じる |
MPPT51 | 3:fc42787d68a6 | 116 | pc.printf("MSC: %d\n", cntMSC); // |
MPPT51 | 3:fc42787d68a6 | 117 | } |
MPPT51 | 3:fc42787d68a6 | 118 | } |
MPPT51 | 3:fc42787d68a6 | 119 | } |
MPPT51 | 3:fc42787d68a6 | 120 | |
MPPT51 | 3:fc42787d68a6 | 121 | void readCAN(){ // CANデータを受信したときに実行される関数(特定ID選択:https://os.mbed.com/questions/74230/about-ID-selectable-CAN-receive/, filter関数でも) |
MPPT51 | 3:fc42787d68a6 | 122 | ++cntCAN; // CANカウンタをインクリメント |
MPPT51 | 3:fc42787d68a6 | 123 | if( cntCAN >= 255 ){ cntCAN = 0; } // 255を超えたらリセット |
MPPT51 | 3:fc42787d68a6 | 124 | if( LED ){ led2 = !led2; } // led2を点滅させる処理. !はNOTの意味 |
MPPT51 | 3:fc42787d68a6 | 125 | |
MPPT51 | 3:fc42787d68a6 | 126 | if( can.read( bufCANmot ) ){ // モタコンからデータが来たとき, |
MPPT51 | 3:fc42787d68a6 | 127 | Vmot = ( (float)( (bufCANmot.data[0]*100) + bufCANmot.data[1]) ) / 10; // 15 43を1500 43にして足すと「1543」となり、÷10すると154.3 [V] |
MPPT51 | 3:fc42787d68a6 | 128 | Cmot = ( (float)( ((signed char)bufCANmot.data[2]*100) + (signed char)bufCANmot.data[3] ) ) / 100; |
MPPT51 | 3:fc42787d68a6 | 129 | // 5 54を500 54にして足すと5「554」となり、÷100すると5.54 [A] |
MPPT51 | 3:fc42787d68a6 | 130 | Pmot = Vmot * Cmot; |
MPPT51 | 3:fc42787d68a6 | 131 | speed = ( (float)( (bufCANmot.data[4]*100) + bufCANmot.data[5]) ) / 10; //「856」を85.6[km/h]にするため,÷10する |
MPPT51 | 3:fc42787d68a6 | 132 | duty = (signed char)bufCANmot.data[6]; // アクセル開度は0~100表示のため,そのまま |
MPPT51 | 3:fc42787d68a6 | 133 | direc = (int)bufCANmot.data[7]; |
MPPT51 | 3:fc42787d68a6 | 134 | } |
MPPT51 | 3:fc42787d68a6 | 135 | if( can.read( bufCANsol ) ){ // MPPTからデータがきたとき, |
MPPT51 | 3:fc42787d68a6 | 136 | Vsol = ( (float)( (bufCANsol.data[0]*100) + bufCANsol.data[1]) ) / 10; |
MPPT51 | 3:fc42787d68a6 | 137 | Csol = ( (float)( (signed int)((signed char)bufCANsol.data[2]*100) + (signed char)bufCANsol.data[3] ) + ((signed char)bufCANsol.data[6]*100) + (signed char)bufCANsol.data[7] ) / 100; |
MPPT51 | 3:fc42787d68a6 | 138 | MPPTerror = bufCANsol.data[4]; |
MPPT51 | 3:fc42787d68a6 | 139 | MPPTerror_2 = bufCANsol.data[5]; |
MPPT51 | 3:fc42787d68a6 | 140 | Psol = Vsol * Csol; |
MPPT51 | 3:fc42787d68a6 | 141 | } |
MPPT51 | 3:fc42787d68a6 | 142 | if( can.read( bufCANbat ) ){ // BMSからデータが来たとき, |
MPPT51 | 3:fc42787d68a6 | 143 | Vbat = ( (float)( (bufCANbat.data[0]*100) + bufCANbat.data[1]) ) / 10; |
MPPT51 | 3:fc42787d68a6 | 144 | Cbat = ( (float)( (signed int)((signed char)bufCANbat.data[2]*100) + (signed char)bufCANbat.data[3] ) ) / 100; |
MPPT51 | 3:fc42787d68a6 | 145 | Pbat = Vbat * Cbat; |
MPPT51 | 3:fc42787d68a6 | 146 | VcelMin = ( (float)( (bufCANbat.data[4]*100) + bufCANbat.data[5] ) ) / 100; |
MPPT51 | 3:fc42787d68a6 | 147 | VcelMax = ( (float)( (bufCANbat.data[6]*100) + bufCANbat.data[7] ) ) / 100; |
MPPT51 | 3:fc42787d68a6 | 148 | VcelAve = Vbat / 27; // バッテリ電圧をセルの直列数(20200807現在、27直列)で割って平均電圧を算出する |
MPPT51 | 3:fc42787d68a6 | 149 | } |
MPPT51 | 1:93775378e5d9 | 150 | } |
MPPT51 | 3:fc42787d68a6 | 151 | |
MPPT51 | 3:fc42787d68a6 | 152 | void printLCD(){ // LCDにデータを表示する関数 |
MPPT51 | 3:fc42787d68a6 | 153 | ++cntLCD; // IM920カウンタをインクリメント |
MPPT51 | 3:fc42787d68a6 | 154 | if( cntLCD >= 255){ cntLCD = 0; } // 255以上でリセット |
MPPT51 | 3:fc42787d68a6 | 155 | |
MPPT51 | 3:fc42787d68a6 | 156 | lcd1.locate(0, 0); // 4行LCDの1行目1番目に表示位置を指定し, |
MPPT51 | 3:fc42787d68a6 | 157 | lcd1.printf("%5.3fv %5.3fv %5.3fv", VcelMax, VcelAve, VcelMin); // バッテリセルの最大・平均・最小の電圧を表示 |
MPPT51 | 3:fc42787d68a6 | 158 | lcd1.locate(0, 1); // 4行LCDの2行目1番目に表示位置を指定し, |
MPPT51 | 3:fc42787d68a6 | 159 | lcd1.printf("B:%5.1fv%5.1fA%5.0fw", Vbat, Cbat, Pbat); // バッテリ電圧・電流・電力を表示 |
MPPT51 | 3:fc42787d68a6 | 160 | lcd1.locate(0, 2); // 4行LCDの3行目1番目に表示位置を指定し, |
MPPT51 | 3:fc42787d68a6 | 161 | lcd1.printf("M:%5.1fv%5.1fA d:%d", Vmot, Cmot, direc); // モータ電圧・電流, 進行方向を表示 |
MPPT51 | 3:fc42787d68a6 | 162 | lcd1.locate(0, 3); // 4行LCDの4行目1番目に表示位置を指定し, |
MPPT51 | 3:fc42787d68a6 | 163 | if( MPPTerror || MPPTerror_2 ){ // MPPTからエラー信号を受け取っていたとき, |
MPPT51 | 3:fc42787d68a6 | 164 | if( MPPTerror ){ // MPPT1がエラーなら |
MPPT51 | 3:fc42787d68a6 | 165 | lcd1.printf("S:X%3.1fv%5.1fA", Vsol, Csol); // 先頭に"X"を入れて発電電圧・電流を表示 |
MPPT51 | 3:fc42787d68a6 | 166 | }else{ // MPPT2がエラーなら |
MPPT51 | 3:fc42787d68a6 | 167 | lcd1.printf("S:XX%3.1fv%5.1fA", Vsol, Csol); // 先頭に"XX"を入れて発電電圧・電流を表示 |
MPPT51 | 3:fc42787d68a6 | 168 | } |
MPPT51 | 3:fc42787d68a6 | 169 | }else{ // MPPTからエラー信号を受け取っていないとき |
MPPT51 | 3:fc42787d68a6 | 170 | lcd1.printf("S:%5.1fv%5.1fA", Vsol, Csol); // 発電電力・電流を表示 |
MPPT51 | 3:fc42787d68a6 | 171 | } |
MPPT51 | 3:fc42787d68a6 | 172 | lcd1.locate(15, 3); // 4行LCDの4行目16番目に表示位置を指定し, |
MPPT51 | 3:fc42787d68a6 | 173 | lcd1.printf("USB:%c", oxMSC); // USBの接続状態を表示("o"か"x") |
MPPT51 | 3:fc42787d68a6 | 174 | lcd2.printf( 0, "%5.1fkm/h %5.1fv\r", speed, Vmot ); // デカ文字LCDの1行目1番目に表示(速度,システム電圧) |
MPPT51 | 3:fc42787d68a6 | 175 | lcd2.printf( 1, "%5.0fw %4.0fw %3d\r", Pmot, Psol, duty ); // デカ文字LCDの1行目2番目に表示(消費電力,発電電力,スロットル開度) |
MPPT51 | 3:fc42787d68a6 | 176 | pc.printf("LCD:%d\n",cntLCD); // 無線送信処理を行ったことをPC(teraterm)へ知らせる |
MPPT51 | 0:78ab42fa3942 | 177 | } |
MPPT51 | 3:fc42787d68a6 | 178 | |
MPPT51 | 3:fc42787d68a6 | 179 | void printIM920(){ // 処理時間16ms~(MBED Timerで計測) |
MPPT51 | 3:fc42787d68a6 | 180 | ++cntIM920; // IM920カウンタをインクリメント |
MPPT51 | 3:fc42787d68a6 | 181 | if( cntIM920 >= 255 ){ cntIM920 = 0; } // 255以上でリセット |
MPPT51 | 3:fc42787d68a6 | 182 | im920.printf("TXDA%.1f,%.3f,%.3f,%.3f,%.1f,%.1f,%.1f,%.1f,%d,%d\r", |
MPPT51 | 3:fc42787d68a6 | 183 | Vmot, VcelMax, VcelAve, VcelMin, Cbat, Cmot, Csol, speed, duty, cntIM920); |
MPPT51 | 3:fc42787d68a6 | 184 | // TXDAに続く文字が無線送信される. データ間を","で区切る. 最後に"\r"必須 |
MPPT51 | 3:fc42787d68a6 | 185 | pc.printf("IM920:%d\n",cntIM920); // 無線送信処理を行ったことをPC(teraterm)へ知らせる |
MPPT51 | 3:fc42787d68a6 | 186 | } |
MPPT51 | 3:fc42787d68a6 | 187 | |
MPPT51 | 3:fc42787d68a6 | 188 | void printTera(){ |
MPPT51 | 3:fc42787d68a6 | 189 | ++cntTera; // Teratermカウンタをインクリメント |
MPPT51 | 3:fc42787d68a6 | 190 | if( cntTera >= 255){ cntTera = 0; } // 255以上でリセット |
MPPT51 | 3:fc42787d68a6 | 191 | //pc.printf("Tera:%d\n",cntTera); // 無線送信処理を行ったことをPC(teraterm)へ知らせる |
MPPT51 | 3:fc42787d68a6 | 192 | pc.printf("SP:%.1f DT:%d Vm:%.1f Im:%.2f Pm:%.1f Vs:%.1f Is: %.2f Ps:%.1f\n\r", speed, duty, Vmot, Cmot, Pmot, Vsol, Csol, Psol ); |
MPPT51 | 3:fc42787d68a6 | 193 | pc.printf("Vb:%.1f Cb:%.2f Pb:%.1f max:%.3f avg:%.3f min:%.3f\n\r", Vbat, Cbat, Pbat, VcelMax, VcelAve, VcelMin ); |
MPPT51 | 3:fc42787d68a6 | 194 | } |
MPPT51 | 3:fc42787d68a6 | 195 | |
MPPT51 | 3:fc42787d68a6 | 196 | void init(){ // 初期化(初期設定)を行う関数 |
MPPT51 | 3:fc42787d68a6 | 197 | pc.baud(115200); // pcとのシリアル通信ボーレートを115200bpsに設定(数字が大きい方が通信速度高い) |
MPPT51 | 3:fc42787d68a6 | 198 | pc.printf("main() start\n"); |
MPPT51 | 3:fc42787d68a6 | 199 | |
MPPT51 | 3:fc42787d68a6 | 200 | im920.baud(19200); // IM920とのシリアル通信ボーレートを19200bpsに設定(19200はIM920の初期値) |
MPPT51 | 3:fc42787d68a6 | 201 | initMSC(); // USBマスストレージクラス(USBメモリ)を初期化する関数を実行 |
MPPT51 | 3:fc42787d68a6 | 202 | } |
MPPT51 | 3:fc42787d68a6 | 203 | |
MPPT51 | 0:78ab42fa3942 | 204 | int main() { |
MPPT51 | 3:fc42787d68a6 | 205 | init(); // 初期化関数を実行 |
MPPT51 | 3:fc42787d68a6 | 206 | |
MPPT51 | 3:fc42787d68a6 | 207 | MPPTerror_2 = 1; |
MPPT51 | 3:fc42787d68a6 | 208 | Vmot=113.4; |
MPPT51 | 3:fc42787d68a6 | 209 | Cmot=5.5; |
MPPT51 | 3:fc42787d68a6 | 210 | Pbat=129.3; |
MPPT51 | 0:78ab42fa3942 | 211 | |
MPPT51 | 3:fc42787d68a6 | 212 | tm1.start(); |
MPPT51 | 3:fc42787d68a6 | 213 | time0t5s.start(); //https://os.mbed.com/media/uploads/yueee_yt/text_h24csee.pdf(p.21) |
MPPT51 | 3:fc42787d68a6 | 214 | time0t2s.start(); //https://os.mbed.com/media/uploads/yueee_yt/text_h24csee.pdf(p.21) |
MPPT51 | 3:fc42787d68a6 | 215 | |
MPPT51 | 0:78ab42fa3942 | 216 | while(1) { |
MPPT51 | 3:fc42787d68a6 | 217 | if( time0t5s.read() < 0.5 ){ |
MPPT51 | 3:fc42787d68a6 | 218 | if( time0t2s.read() >= 0.2 ){ |
MPPT51 | 3:fc42787d68a6 | 219 | time0t2s.reset(); // time0t2sをリスタートさせる |
MPPT51 | 3:fc42787d68a6 | 220 | readCAN(); // CANデータを読み込む関数を実行 |
MPPT51 | 3:fc42787d68a6 | 221 | printLCD(); // LCDの表示を更新する関数を実行 |
MPPT51 | 3:fc42787d68a6 | 222 | printTera(); // Teratermに表示する関数を実行 |
MPPT51 | 1:93775378e5d9 | 223 | } |
MPPT51 | 3:fc42787d68a6 | 224 | } |
MPPT51 | 3:fc42787d68a6 | 225 | if( time0t5s.read() >= 0.5 ){ // 0.5秒毎に実行する処理 |
MPPT51 | 3:fc42787d68a6 | 226 | time0t5s.reset(); // time0t5sをリスタートさせる |
MPPT51 | 3:fc42787d68a6 | 227 | if( LED ){ led4 = !led4; } // led4を点滅させる(!はNOT) |
MPPT51 | 3:fc42787d68a6 | 228 | pc.printf("TheTime: %d(us)\n", tm1.read_us()); // 処理時間確認用プログラム(1/2) |
MPPT51 | 3:fc42787d68a6 | 229 | tm1.reset(); // 処理時間確認用プログラム(2/2) |
MPPT51 | 3:fc42787d68a6 | 230 | saveMSC(); // MSCにデータを保存する関数を実行 |
MPPT51 | 3:fc42787d68a6 | 231 | printIM920(); // IM920に無線送信させる関数を実行 |
MPPT51 | 2:14b832fdd69f | 232 | } |
MPPT51 | 3:fc42787d68a6 | 233 | |
MPPT51 | 0:78ab42fa3942 | 234 | } |
MPPT51 | 0:78ab42fa3942 | 235 | } |