Measure resistance with INA226
Dependencies: INA226 TextLCD mbed
Fork of INA226TEST by
main.cpp@4:04014356c355, 2016-05-15 (annotated)
- Committer:
- Naoto_111
- Date:
- Sun May 15 01:51:55 2016 +0000
- Revision:
- 4:04014356c355
- Parent:
- 3:1bd37786be90
serialmode???
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
oteki | 2:d3723c3e869b | 1 | /*前バージョンからの変更点 |
Naoto_111 | 4:04014356c355 | 2 | ・シリアル通信モードでもオフセットの初期値を取得するように変更 |
Naoto_111 | 4:04014356c355 | 3 | ・シリアル通信モードで最初に送られるデータが(0.0, 0.0, 0,0)だったのを、 |
Naoto_111 | 4:04014356c355 | 4 | センサから取得した値を送るように変更 |
oteki | 2:d3723c3e869b | 5 | */ |
oteki | 2:d3723c3e869b | 6 | #include "mbed.h" |
oteki | 2:d3723c3e869b | 7 | #include "TextLCD.h" |
oteki | 2:d3723c3e869b | 8 | #include "INA226.hpp" |
oteki | 2:d3723c3e869b | 9 | //#include "limits.h" |
tosihisa | 0:b20f8673a7fa | 10 | |
oteki | 2:d3723c3e869b | 11 | #define VCC 3.3//抵抗R1に供給する電圧[V] |
oteki | 2:d3723c3e869b | 12 | #define R1 10000.0//抵抗R1の値[Ω] |
oteki | 2:d3723c3e869b | 13 | #define GAUGE_STEP 17//テキストディスプレイモード:ゲージの段階数 |
oteki | 2:d3723c3e869b | 14 | #define GAUGE_MAX 100.0//テキストディスプレイモード:ゲージ最大状態の値[Ω] |
oteki | 2:d3723c3e869b | 15 | #define GAUGE_NOTIFY 50.0//テキストディスプレイモード:音を鳴らし始める値[Ω] |
oteki | 2:d3723c3e869b | 16 | #define INTERVAL_SERIAL 0.5//シリアル通信モード:データを収集する間隔[秒] |
oteki | 2:d3723c3e869b | 17 | #define INTERVAL_TEXTLCD 0.1//テキストディスプレイモード:データを収集する間隔[秒] |
oteki | 2:d3723c3e869b | 18 | #define SAMPLES 10//一回の測定で取得するデータの数(これらのデータの平均を使用) |
tosihisa | 0:b20f8673a7fa | 19 | |
oteki | 2:d3723c3e869b | 20 | Serial pc(USBTX,USBRX);//tx,rx :シリアル通信 |
oteki | 2:d3723c3e869b | 21 | TextLCD dsp_t(p24, p23, p22, p19, p21, p20);// rs, e, d4-d7 :テキストディスプレイ |
oteki | 2:d3723c3e869b | 22 | //LocalFileSystem local("local");//内部ストレージ |
oteki | 2:d3723c3e869b | 23 | AnalogIn sensor(p18); |
oteki | 2:d3723c3e869b | 24 | InterruptIn setoffset(p17);//テキストディスプレイモード:オフセット設定 |
oteki | 2:d3723c3e869b | 25 | InterruptIn mode(p16);//テキストディスプレイモード:ゲージ←→数値詳細 切替 |
oteki | 2:d3723c3e869b | 26 | PwmOut speaker(p25); |
oteki | 2:d3723c3e869b | 27 | //Timer tim; |
oteki | 2:d3723c3e869b | 28 | DigitalOut led[] = {LED1, LED2}; |
tosihisa | 0:b20f8673a7fa | 29 | I2C i2c(p28,p27); |
tosihisa | 0:b20f8673a7fa | 30 | INA226 VCmonitor(i2c); |
tosihisa | 0:b20f8673a7fa | 31 | |
oteki | 2:d3723c3e869b | 32 | float resistance, offset; |
oteki | 2:d3723c3e869b | 33 | bool detailmode = false; |
oteki | 2:d3723c3e869b | 34 | volatile bool serialmode = false; |
oteki | 2:d3723c3e869b | 35 | |
oteki | 2:d3723c3e869b | 36 | void gaugeOffset();//ゲージのオフセットを設定 |
oteki | 2:d3723c3e869b | 37 | void changeMode();//ゲージモードと測定値の詳細表示の切り替え |
oteki | 2:d3723c3e869b | 38 | void isrRx();//受信イベント |
tosihisa | 0:b20f8673a7fa | 39 | |
oteki | 2:d3723c3e869b | 40 | unsigned short val; |
oteki | 2:d3723c3e869b | 41 | double V,C; |
oteki | 2:d3723c3e869b | 42 | int count = 1; |
tosihisa | 0:b20f8673a7fa | 43 | |
oteki | 2:d3723c3e869b | 44 | int main() |
oteki | 2:d3723c3e869b | 45 | { |
oteki | 2:d3723c3e869b | 46 | pc.baud(115200); |
oteki | 2:d3723c3e869b | 47 | VCmonitor.rawWrite(0x00,0x4EDF); |
Naoto_111 | 4:04014356c355 | 48 | if(!VCmonitor.isExist()) { |
oteki | 2:d3723c3e869b | 49 | pc.printf("VCmonitor NOT FOUND\r\n"); |
Naoto_111 | 4:04014356c355 | 50 | while(1) {} |
tosihisa | 0:b20f8673a7fa | 51 | } |
oteki | 2:d3723c3e869b | 52 | pc.printf("VCmonitor FOUND\r\n"); |
tosihisa | 0:b20f8673a7fa | 53 | |
tosihisa | 0:b20f8673a7fa | 54 | val = 0; |
Naoto_111 | 4:04014356c355 | 55 | if(VCmonitor.rawRead(0x00,&val) != 0) { |
oteki | 2:d3723c3e869b | 56 | pc.printf("VCmonitor READ ERROR\r\n"); |
Naoto_111 | 4:04014356c355 | 57 | while(1) {} |
tosihisa | 0:b20f8673a7fa | 58 | } |
oteki | 2:d3723c3e869b | 59 | pc.printf("VCmonitor Reg 0x00 : 0x%04x\r\n",val); |
oteki | 2:d3723c3e869b | 60 | |
oteki | 2:d3723c3e869b | 61 | VCmonitor.setCurrentCalibration(0x0800); |
oteki | 2:d3723c3e869b | 62 | /*tim.start(); |
oteki | 2:d3723c3e869b | 63 | led[0] = led[1] = 1; |
oteki | 2:d3723c3e869b | 64 | |
oteki | 2:d3723c3e869b | 65 | while(serialmode == false && tim.read() < SERIAL_WAIT) { |
oteki | 2:d3723c3e869b | 66 | if(pc.readable()) {//通信相手からデータが送られてきた時 |
oteki | 2:d3723c3e869b | 67 | serialmode = true; |
oteki | 2:d3723c3e869b | 68 | break; |
oteki | 2:d3723c3e869b | 69 | } |
oteki | 2:d3723c3e869b | 70 | wait(0.5); |
oteki | 2:d3723c3e869b | 71 | } |
tosihisa | 0:b20f8673a7fa | 72 | |
Naoto_111 | 4:04014356c355 | 73 | led[0] = led[1] = */ |
Naoto_111 | 4:04014356c355 | 74 | resistance = offset = 0; |
Naoto_111 | 4:04014356c355 | 75 | if((VCmonitor.getVoltage(&V) == 0) && (VCmonitor.getCurrent(&C) == 0)) |
Naoto_111 | 4:04014356c355 | 76 | offset = (float) 10*V/C; |
oteki | 2:d3723c3e869b | 77 | //tim.stop(); |
oteki | 2:d3723c3e869b | 78 | //FILE *fp = NULL; |
oteki | 2:d3723c3e869b | 79 | pc.attach(isrRx,Serial::RxIrq);//割り込みハンドラ登録 |
oteki | 2:d3723c3e869b | 80 | BUNKI: |
oteki | 2:d3723c3e869b | 81 | if(serialmode == true) {//シリアル通信モード |
oteki | 2:d3723c3e869b | 82 | led[0] = 0; |
oteki | 2:d3723c3e869b | 83 | led[1] = 1; |
oteki | 2:d3723c3e869b | 84 | //if(fp!=NULL)fclose(fp); |
oteki | 2:d3723c3e869b | 85 | dsp_t.cls(); |
oteki | 2:d3723c3e869b | 86 | dsp_t.printf("Serial mode"); |
Naoto_111 | 4:04014356c355 | 87 | |
Naoto_111 | 4:04014356c355 | 88 | float voltage = 0; |
Naoto_111 | 4:04014356c355 | 89 | for(int i = 0; i < SAMPLES; i++)voltage += sensor.read(); |
Naoto_111 | 4:04014356c355 | 90 | voltage = voltage * 3.3 / SAMPLES; |
Naoto_111 | 4:04014356c355 | 91 | resistance = R1 / (VCC / voltage - 1); |
Naoto_111 | 4:04014356c355 | 92 | pc.printf("%f,%f,%f\n", voltage, resistance, offset); |
Naoto_111 | 4:04014356c355 | 93 | //pc.printf("%f,%f,%f\n", 0.0, 0.0, 0.0); |
Naoto_111 | 4:04014356c355 | 94 | |
Naoto_111 | 4:04014356c355 | 95 | while(1)if(serialmode == false)goto BUNKI; |
oteki | 2:d3723c3e869b | 96 | } else {//テキストディスプレイモード |
Naoto_111 | 4:04014356c355 | 97 | |
oteki | 2:d3723c3e869b | 98 | float t = 1.0/261.626;//「ド」の音(C4)の周期 |
oteki | 2:d3723c3e869b | 99 | float a = (t-(t/2/2))/GAUGE_MAX;//C4の周期と2オクターブ上の音の周期の差を(GAUGE_MAX)分割 |
tosihisa | 0:b20f8673a7fa | 100 | |
oteki | 2:d3723c3e869b | 101 | led[0] = 1; |
oteki | 2:d3723c3e869b | 102 | led[1] = 0; |
Naoto_111 | 4:04014356c355 | 103 | |
oteki | 2:d3723c3e869b | 104 | //offset = R1 / (VCC / (sensor.read() * 3.3)- 1);//オフセット初期値の取得 |
oteki | 2:d3723c3e869b | 105 | speaker = 0.0; |
oteki | 2:d3723c3e869b | 106 | |
oteki | 2:d3723c3e869b | 107 | speaker.period(0.001); |
oteki | 2:d3723c3e869b | 108 | //tim.reset(); |
oteki | 2:d3723c3e869b | 109 | //tim.start(); |
oteki | 2:d3723c3e869b | 110 | setoffset.rise(&gaugeOffset);//割り込みハンドラ登録 |
oteki | 2:d3723c3e869b | 111 | mode.rise(&changeMode);//割り込みハンドラ登録 |
oteki | 2:d3723c3e869b | 112 | |
Naoto_111 | 4:04014356c355 | 113 | /* |
Naoto_111 | 4:04014356c355 | 114 | if((fp = fopen("/local/data.txt", "r")) != NULL) { //data.txtの検出 |
Naoto_111 | 4:04014356c355 | 115 | if(fgetc(fp)!=EOF) { |
Naoto_111 | 4:04014356c355 | 116 | dsp_t.printf("Err:data exists\nPlease move it."); |
Naoto_111 | 4:04014356c355 | 117 | return EXIT_FAILURE; |
Naoto_111 | 4:04014356c355 | 118 | } |
Naoto_111 | 4:04014356c355 | 119 | fclose(fp); |
Naoto_111 | 4:04014356c355 | 120 | } |
Naoto_111 | 4:04014356c355 | 121 | */ |
oteki | 2:d3723c3e869b | 122 | while(1) { |
oteki | 2:d3723c3e869b | 123 | if(serialmode == true)goto BUNKI; |
oteki | 2:d3723c3e869b | 124 | /* |
oteki | 2:d3723c3e869b | 125 | static unsigned long long int time_sum = 0; |
oteki | 2:d3723c3e869b | 126 | int now = tim.read_ms(); |
oteki | 2:d3723c3e869b | 127 | if(now > 1800000) { |
oteki | 2:d3723c3e869b | 128 | time_sum += now; |
oteki | 2:d3723c3e869b | 129 | tim.reset(); |
oteki | 2:d3723c3e869b | 130 | } |
oteki | 2:d3723c3e869b | 131 | if(time_sum > ULLONG_MAX - 10000000) { |
oteki | 2:d3723c3e869b | 132 | printf("Err:time out\nPlease restart now."); |
oteki | 2:d3723c3e869b | 133 | return EXIT_FAILURE; |
oteki | 2:d3723c3e869b | 134 | }*/ |
oteki | 2:d3723c3e869b | 135 | float voltage = 0.0; |
oteki | 2:d3723c3e869b | 136 | for(int i = 0; i < SAMPLES; i++)voltage += sensor.read(); |
oteki | 3:1bd37786be90 | 137 | //voltage = voltage * 3.3 / SAMPLES; |
oteki | 3:1bd37786be90 | 138 | //resistance = R1 / (VCC / voltage - 1); |
oteki | 2:d3723c3e869b | 139 | //if((fp = fopen("/local/data.txt", "a")) == NULL)return EXIT_FAILURE; |
oteki | 2:d3723c3e869b | 140 | //fprintf(fp, "%lld %f %f %f\r\n", now + time_sum, voltage, resistance, offset); |
oteki | 2:d3723c3e869b | 141 | //fclose(fp); |
Naoto_111 | 4:04014356c355 | 142 | if((VCmonitor.getVoltage(&V) == 0) && (VCmonitor.getCurrent(&C) == 0)) { |
oteki | 2:d3723c3e869b | 143 | voltage = V/1000; |
oteki | 2:d3723c3e869b | 144 | resistance = 10*V/C; |
oteki | 2:d3723c3e869b | 145 | } |
oteki | 2:d3723c3e869b | 146 | dsp_t.cls(); |
oteki | 2:d3723c3e869b | 147 | if(detailmode == false) { |
oteki | 2:d3723c3e869b | 148 | for(int i = 0; i < (int)((resistance - offset) / (GAUGE_MAX / GAUGE_STEP)) && i < GAUGE_STEP; i++) |
oteki | 2:d3723c3e869b | 149 | dsp_t.printf("%c", 0xFF);//ゲージ |
oteki | 2:d3723c3e869b | 150 | |
oteki | 2:d3723c3e869b | 151 | dsp_t.locate(0, 1); |
oteki | 2:d3723c3e869b | 152 | |
oteki | 2:d3723c3e869b | 153 | if(resistance>=1000000000)dsp_t.printf("R=%3.0fG%c", resistance/1000000000,0xF4); |
oteki | 2:d3723c3e869b | 154 | else if(resistance>=1000000)dsp_t.printf("R=%3.0fM%c", resistance/1000000,0xF4); |
oteki | 2:d3723c3e869b | 155 | else if(resistance>=1000)dsp_t.printf("R=%3.0fk%c", resistance/1000,0xF4); |
oteki | 2:d3723c3e869b | 156 | else dsp_t.printf("R=%4.0f%c", resistance,0xF4); |
oteki | 2:d3723c3e869b | 157 | |
oteki | 2:d3723c3e869b | 158 | if(offset>=1000000000)dsp_t.printf(" O=%3.0fG%c", offset/1000000000,0xF4); |
oteki | 2:d3723c3e869b | 159 | else if(offset>=1000000)dsp_t.printf(" O=%3.0fM%c", offset/1000000,0xF4); |
oteki | 2:d3723c3e869b | 160 | else if(offset>=1000)dsp_t.printf(" O=%3.0fk%c", offset/1000,0xF4); |
oteki | 2:d3723c3e869b | 161 | else dsp_t.printf(" O=%4.0f%c", offset,0xF4); |
oteki | 2:d3723c3e869b | 162 | } else { |
oteki | 2:d3723c3e869b | 163 | if(resistance>=1000000000)dsp_t.printf("R=%11.7f G%c", resistance/1000000000,0xF4); |
oteki | 2:d3723c3e869b | 164 | else if(resistance>=1000000)dsp_t.printf("R=%11.7f M%c", resistance/1000000,0xF4); |
oteki | 2:d3723c3e869b | 165 | else if(resistance>=1000)dsp_t.printf("R=%11.7f k%c", resistance/1000,0xF4); |
oteki | 2:d3723c3e869b | 166 | else dsp_t.printf("R=%11.7f %c", resistance,0xF4); |
oteki | 2:d3723c3e869b | 167 | |
oteki | 2:d3723c3e869b | 168 | dsp_t.locate(0, 1); |
oteki | 2:d3723c3e869b | 169 | |
oteki | 2:d3723c3e869b | 170 | if(offset>=1000000000)dsp_t.printf("O=%11.7f G%c", offset/1000000000,0xF4); |
oteki | 2:d3723c3e869b | 171 | else if(offset>=1000000)dsp_t.printf("O=%11.7f M%c", offset/1000000,0xF4); |
oteki | 2:d3723c3e869b | 172 | else if(offset>=1000)dsp_t.printf("O=%11.7f k%c", offset/1000,0xF4); |
oteki | 2:d3723c3e869b | 173 | else dsp_t.printf("O=%11.7f %c", offset,0xF4); |
oteki | 2:d3723c3e869b | 174 | } |
oteki | 2:d3723c3e869b | 175 | |
oteki | 2:d3723c3e869b | 176 | speaker = 0.5; |
oteki | 2:d3723c3e869b | 177 | if(resistance - offset >= GAUGE_NOTIFY)speaker.period(t-a*(resistance - offset)); |
oteki | 2:d3723c3e869b | 178 | else speaker = 0.0; |
oteki | 2:d3723c3e869b | 179 | wait(INTERVAL_TEXTLCD); |
oteki | 2:d3723c3e869b | 180 | } |
tosihisa | 0:b20f8673a7fa | 181 | } |
tosihisa | 0:b20f8673a7fa | 182 | } |
oteki | 2:d3723c3e869b | 183 | |
oteki | 2:d3723c3e869b | 184 | void gaugeOffset() |
oteki | 2:d3723c3e869b | 185 | { |
oteki | 2:d3723c3e869b | 186 | speaker.period(0.01); |
oteki | 2:d3723c3e869b | 187 | speaker = 0.5; |
oteki | 2:d3723c3e869b | 188 | if(detailmode == false) { |
oteki | 2:d3723c3e869b | 189 | dsp_t.locate(0, 0); |
oteki | 2:d3723c3e869b | 190 | dsp_t.printf("################"); |
oteki | 2:d3723c3e869b | 191 | } |
oteki | 2:d3723c3e869b | 192 | offset = resistance; |
oteki | 2:d3723c3e869b | 193 | wait(0.5); |
oteki | 2:d3723c3e869b | 194 | dsp_t.cls(); |
oteki | 2:d3723c3e869b | 195 | speaker = 0.0; |
oteki | 2:d3723c3e869b | 196 | //speaker.period(0.001); |
oteki | 2:d3723c3e869b | 197 | } |
oteki | 2:d3723c3e869b | 198 | |
oteki | 2:d3723c3e869b | 199 | void changeMode() |
oteki | 2:d3723c3e869b | 200 | { |
oteki | 2:d3723c3e869b | 201 | detailmode = (detailmode == false) ? true : false; |
oteki | 2:d3723c3e869b | 202 | } |
oteki | 2:d3723c3e869b | 203 | |
oteki | 2:d3723c3e869b | 204 | |
oteki | 2:d3723c3e869b | 205 | void isrRx() |
oteki | 2:d3723c3e869b | 206 | { |
Naoto_111 | 4:04014356c355 | 207 | if(serialmode == false) { |
oteki | 2:d3723c3e869b | 208 | serialmode=true; |
oteki | 2:d3723c3e869b | 209 | return; |
oteki | 2:d3723c3e869b | 210 | } |
oteki | 2:d3723c3e869b | 211 | char ch; |
oteki | 2:d3723c3e869b | 212 | //static float resistance = 0, offset = 0; |
oteki | 2:d3723c3e869b | 213 | ch = pc.getc(); |
oteki | 2:d3723c3e869b | 214 | |
oteki | 2:d3723c3e869b | 215 | switch(ch) { |
oteki | 2:d3723c3e869b | 216 | |
oteki | 2:d3723c3e869b | 217 | case 'c'://continue |
oteki | 2:d3723c3e869b | 218 | float voltage = 0; |
Naoto_111 | 4:04014356c355 | 219 | |
oteki | 3:1bd37786be90 | 220 | for(int i = 0; i < SAMPLES; i++)voltage += sensor.read(); |
oteki | 3:1bd37786be90 | 221 | voltage = voltage * 3.3 / SAMPLES; |
oteki | 3:1bd37786be90 | 222 | resistance = R1 / (VCC / voltage - 1); |
Naoto_111 | 4:04014356c355 | 223 | if((VCmonitor.getVoltage(&V) == 0) && (VCmonitor.getCurrent(&C) == 0)) { |
oteki | 3:1bd37786be90 | 224 | voltage = (float) V/1000; |
oteki | 3:1bd37786be90 | 225 | resistance = (float) 10*V/C; |
Naoto_111 | 4:04014356c355 | 226 | |
oteki | 2:d3723c3e869b | 227 | } |
Naoto_111 | 4:04014356c355 | 228 | //pc.printf("%f,%f,%f\n", 1.1, 200.0, 0.0); |
Naoto_111 | 4:04014356c355 | 229 | pc.printf("%f,%f,%f\n", voltage, resistance, offset); |
oteki | 2:d3723c3e869b | 230 | count++; |
oteki | 2:d3723c3e869b | 231 | break; |
oteki | 2:d3723c3e869b | 232 | |
oteki | 2:d3723c3e869b | 233 | case 'o'://offset |
oteki | 2:d3723c3e869b | 234 | offset = resistance; |
oteki | 2:d3723c3e869b | 235 | break; |
Naoto_111 | 4:04014356c355 | 236 | |
oteki | 2:d3723c3e869b | 237 | case 'q'://quit serial mode |
oteki | 2:d3723c3e869b | 238 | serialmode = false; |
oteki | 2:d3723c3e869b | 239 | return; |
oteki | 2:d3723c3e869b | 240 | } |
oteki | 2:d3723c3e869b | 241 | } |