Takeuchi Kouichi
/
20150607_kiban_VImeter
VIメータのプログラムですI2C LCDとINA226を装備しています。
main.cpp@0:27e9d6071e9b, 2016-05-09 (annotated)
- Committer:
- takeuchi
- Date:
- Mon May 09 08:38:27 2016 +0000
- Revision:
- 0:27e9d6071e9b
VI?????????????I2C?INA????I2C?LCD?????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
takeuchi | 0:27e9d6071e9b | 1 | // VI Meter Kiban |
takeuchi | 0:27e9d6071e9b | 2 | |
takeuchi | 0:27e9d6071e9b | 3 | |
takeuchi | 0:27e9d6071e9b | 4 | #include "mbed.h" |
takeuchi | 0:27e9d6071e9b | 5 | #include "I2cLCD.h" |
takeuchi | 0:27e9d6071e9b | 6 | |
takeuchi | 0:27e9d6071e9b | 7 | I2cLCD lcd(dp5,dp27,dp26); //sda scl reset |
takeuchi | 0:27e9d6071e9b | 8 | I2C Ina226(dp5,dp27);//SDA SCL |
takeuchi | 0:27e9d6071e9b | 9 | DigitalOut led_yellow(dp16); |
takeuchi | 0:27e9d6071e9b | 10 | DigitalOut led_green(dp15); |
takeuchi | 0:27e9d6071e9b | 11 | |
takeuchi | 0:27e9d6071e9b | 12 | unsigned int waddr=0x80,raddr=0x81; |
takeuchi | 0:27e9d6071e9b | 13 | char cmd[3],val[3]; |
takeuchi | 0:27e9d6071e9b | 14 | double vc,ic,ihosei; |
takeuchi | 0:27e9d6071e9b | 15 | |
takeuchi | 0:27e9d6071e9b | 16 | #define ON 1 |
takeuchi | 0:27e9d6071e9b | 17 | #define OFF 0 |
takeuchi | 0:27e9d6071e9b | 18 | #define XON 0 |
takeuchi | 0:27e9d6071e9b | 19 | #define XOFF 1 |
takeuchi | 0:27e9d6071e9b | 20 | |
takeuchi | 0:27e9d6071e9b | 21 | #define batt1_ON lcd.seticon( I2cLCD::Battery_1 ) |
takeuchi | 0:27e9d6071e9b | 22 | #define batt2_ON lcd.seticon( I2cLCD::Battery_2 ) |
takeuchi | 0:27e9d6071e9b | 23 | #define batt3_ON lcd.seticon( I2cLCD::Battery_3 ) |
takeuchi | 0:27e9d6071e9b | 24 | #define batt4_ON lcd.seticon( I2cLCD::Battery_4 ) |
takeuchi | 0:27e9d6071e9b | 25 | |
takeuchi | 0:27e9d6071e9b | 26 | #define batt1_OFF lcd.clearicon( I2cLCD::Battery_1 ) |
takeuchi | 0:27e9d6071e9b | 27 | #define batt2_OFF lcd.clearicon( I2cLCD::Battery_2 ) |
takeuchi | 0:27e9d6071e9b | 28 | #define batt3_OFF lcd.clearicon( I2cLCD::Battery_3 ) |
takeuchi | 0:27e9d6071e9b | 29 | #define batt4_OFF lcd.clearicon( I2cLCD::Battery_4 ) |
takeuchi | 0:27e9d6071e9b | 30 | |
takeuchi | 0:27e9d6071e9b | 31 | #define arrow_down_on lcd.seticon( I2cLCD::ArrowDown ); |
takeuchi | 0:27e9d6071e9b | 32 | #define arrow_up_on lcd.seticon( I2cLCD::ArrowUp ); |
takeuchi | 0:27e9d6071e9b | 33 | #define arrow_down_off lcd.clearicon( I2cLCD::ArrowDown ); |
takeuchi | 0:27e9d6071e9b | 34 | #define arrow_up_off lcd.clearicon( I2cLCD::ArrowUp ); |
takeuchi | 0:27e9d6071e9b | 35 | |
takeuchi | 0:27e9d6071e9b | 36 | /* |
takeuchi | 0:27e9d6071e9b | 37 | void batt_mark(){ |
takeuchi | 0:27e9d6071e9b | 38 | if(vc < 4.5 ){ |
takeuchi | 0:27e9d6071e9b | 39 | batt1_ON; |
takeuchi | 0:27e9d6071e9b | 40 | batt2_OFF; |
takeuchi | 0:27e9d6071e9b | 41 | batt3_OFF; |
takeuchi | 0:27e9d6071e9b | 42 | batt4_OFF; |
takeuchi | 0:27e9d6071e9b | 43 | } |
takeuchi | 0:27e9d6071e9b | 44 | else if(vc < 4.8){ |
takeuchi | 0:27e9d6071e9b | 45 | batt1_ON; |
takeuchi | 0:27e9d6071e9b | 46 | batt2_ON; |
takeuchi | 0:27e9d6071e9b | 47 | batt3_OFF; |
takeuchi | 0:27e9d6071e9b | 48 | batt4_OFF; |
takeuchi | 0:27e9d6071e9b | 49 | } |
takeuchi | 0:27e9d6071e9b | 50 | else if(vc < 5.0){ |
takeuchi | 0:27e9d6071e9b | 51 | batt1_ON; |
takeuchi | 0:27e9d6071e9b | 52 | batt2_ON; |
takeuchi | 0:27e9d6071e9b | 53 | batt3_ON; |
takeuchi | 0:27e9d6071e9b | 54 | batt4_OFF; |
takeuchi | 0:27e9d6071e9b | 55 | } |
takeuchi | 0:27e9d6071e9b | 56 | else{ |
takeuchi | 0:27e9d6071e9b | 57 | batt1_ON; |
takeuchi | 0:27e9d6071e9b | 58 | batt2_ON; |
takeuchi | 0:27e9d6071e9b | 59 | batt3_ON; |
takeuchi | 0:27e9d6071e9b | 60 | batt4_ON; |
takeuchi | 0:27e9d6071e9b | 61 | } |
takeuchi | 0:27e9d6071e9b | 62 | } |
takeuchi | 0:27e9d6071e9b | 63 | */ |
takeuchi | 0:27e9d6071e9b | 64 | |
takeuchi | 0:27e9d6071e9b | 65 | void led_flash(){ |
takeuchi | 0:27e9d6071e9b | 66 | int i; |
takeuchi | 0:27e9d6071e9b | 67 | for(i=0;i<3;i++){ |
takeuchi | 0:27e9d6071e9b | 68 | led_green=ON; |
takeuchi | 0:27e9d6071e9b | 69 | led_yellow=ON; |
takeuchi | 0:27e9d6071e9b | 70 | wait(0.1); |
takeuchi | 0:27e9d6071e9b | 71 | led_green=OFF; |
takeuchi | 0:27e9d6071e9b | 72 | led_yellow=OFF; |
takeuchi | 0:27e9d6071e9b | 73 | wait(0.1); |
takeuchi | 0:27e9d6071e9b | 74 | } |
takeuchi | 0:27e9d6071e9b | 75 | } |
takeuchi | 0:27e9d6071e9b | 76 | |
takeuchi | 0:27e9d6071e9b | 77 | int main() { |
takeuchi | 0:27e9d6071e9b | 78 | |
takeuchi | 0:27e9d6071e9b | 79 | led_flash(); |
takeuchi | 0:27e9d6071e9b | 80 | lcd.cls(); |
takeuchi | 0:27e9d6071e9b | 81 | lcd.locate(0,0); |
takeuchi | 0:27e9d6071e9b | 82 | lcd.printf("* VI Meter 1.1 *"); |
takeuchi | 0:27e9d6071e9b | 83 | |
takeuchi | 0:27e9d6071e9b | 84 | cmd[0]=0x05;// calibration registar |
takeuchi | 0:27e9d6071e9b | 85 | cmd[1]=0x0a;// shunt reg=2m ohm |
takeuchi | 0:27e9d6071e9b | 86 | cmd[2]=0x00; |
takeuchi | 0:27e9d6071e9b | 87 | Ina226.write(waddr,cmd,3); |
takeuchi | 0:27e9d6071e9b | 88 | wait(0.1); |
takeuchi | 0:27e9d6071e9b | 89 | |
takeuchi | 0:27e9d6071e9b | 90 | cmd[0]=0x00;// config reg. |
takeuchi | 0:27e9d6071e9b | 91 | cmd[1]=0x45;// average set & number=16 |
takeuchi | 0:27e9d6071e9b | 92 | cmd[2]=0x27; |
takeuchi | 0:27e9d6071e9b | 93 | Ina226.write(waddr,cmd,3); |
takeuchi | 0:27e9d6071e9b | 94 | wait(0.1); |
takeuchi | 0:27e9d6071e9b | 95 | |
takeuchi | 0:27e9d6071e9b | 96 | cmd[0]=0x04;// current read |
takeuchi | 0:27e9d6071e9b | 97 | Ina226.write(waddr,cmd,1); |
takeuchi | 0:27e9d6071e9b | 98 | Ina226.read(raddr,val,2); |
takeuchi | 0:27e9d6071e9b | 99 | ic=(short)(val[0]<<8 | val[1]); |
takeuchi | 0:27e9d6071e9b | 100 | if(-3.0 <ic && ic < 3.0 ){ |
takeuchi | 0:27e9d6071e9b | 101 | ihosei=0.0-ic; |
takeuchi | 0:27e9d6071e9b | 102 | } |
takeuchi | 0:27e9d6071e9b | 103 | wait(0.1); |
takeuchi | 0:27e9d6071e9b | 104 | |
takeuchi | 0:27e9d6071e9b | 105 | while(1){ |
takeuchi | 0:27e9d6071e9b | 106 | |
takeuchi | 0:27e9d6071e9b | 107 | cmd[0]=0x04;// current read |
takeuchi | 0:27e9d6071e9b | 108 | Ina226.write(waddr,cmd,1); |
takeuchi | 0:27e9d6071e9b | 109 | Ina226.read(raddr,val,2); |
takeuchi | 0:27e9d6071e9b | 110 | ic=(short)(val[0]<<8 | val[1])+ihosei; |
takeuchi | 0:27e9d6071e9b | 111 | if(ic < 0){ //discharge |
takeuchi | 0:27e9d6071e9b | 112 | arrow_down_on; |
takeuchi | 0:27e9d6071e9b | 113 | arrow_up_off; |
takeuchi | 0:27e9d6071e9b | 114 | led_green=OFF; |
takeuchi | 0:27e9d6071e9b | 115 | led_yellow=ON; |
takeuchi | 0:27e9d6071e9b | 116 | } |
takeuchi | 0:27e9d6071e9b | 117 | else{ //charge |
takeuchi | 0:27e9d6071e9b | 118 | arrow_up_on; |
takeuchi | 0:27e9d6071e9b | 119 | arrow_down_off; |
takeuchi | 0:27e9d6071e9b | 120 | led_green=ON; |
takeuchi | 0:27e9d6071e9b | 121 | led_yellow=OFF; |
takeuchi | 0:27e9d6071e9b | 122 | } |
takeuchi | 0:27e9d6071e9b | 123 | |
takeuchi | 0:27e9d6071e9b | 124 | wait(0.1); |
takeuchi | 0:27e9d6071e9b | 125 | |
takeuchi | 0:27e9d6071e9b | 126 | cmd[0]=0x02;// voltage read |
takeuchi | 0:27e9d6071e9b | 127 | Ina226.write(waddr,cmd,1); |
takeuchi | 0:27e9d6071e9b | 128 | Ina226.read(raddr,val,2); |
takeuchi | 0:27e9d6071e9b | 129 | vc=(val[0]<<8 | val[1])*1.25/1000; |
takeuchi | 0:27e9d6071e9b | 130 | /* |
takeuchi | 0:27e9d6071e9b | 131 | cmd[0]=0x03;// power |
takeuchi | 0:27e9d6071e9b | 132 | Ina226.write(waddr,cmd,1); |
takeuchi | 0:27e9d6071e9b | 133 | Ina226.read(raddr,val,2); |
takeuchi | 0:27e9d6071e9b | 134 | pw=(val[0]<<8 | val[1])/25; |
takeuchi | 0:27e9d6071e9b | 135 | |
takeuchi | 0:27e9d6071e9b | 136 | |
takeuchi | 0:27e9d6071e9b | 137 | pw=out_v*ic/1000;// power |
takeuchi | 0:27e9d6071e9b | 138 | if(out_v >= 12.0){ |
takeuchi | 0:27e9d6071e9b | 139 | out_v=12.0; |
takeuchi | 0:27e9d6071e9b | 140 | } |
takeuchi | 0:27e9d6071e9b | 141 | if(pduty <= 0.03){ |
takeuchi | 0:27e9d6071e9b | 142 | out_v=0; |
takeuchi | 0:27e9d6071e9b | 143 | } |
takeuchi | 0:27e9d6071e9b | 144 | */ |
takeuchi | 0:27e9d6071e9b | 145 | |
takeuchi | 0:27e9d6071e9b | 146 | lcd.locate(0,1); |
takeuchi | 0:27e9d6071e9b | 147 | lcd.printf("%4.1fV,%4.0fmA",vc,ic); |
takeuchi | 0:27e9d6071e9b | 148 | |
takeuchi | 0:27e9d6071e9b | 149 | led_green=ON; |
takeuchi | 0:27e9d6071e9b | 150 | wait(1.0); |
takeuchi | 0:27e9d6071e9b | 151 | led_green=OFF; |
takeuchi | 0:27e9d6071e9b | 152 | wait(1.0); |
takeuchi | 0:27e9d6071e9b | 153 | |
takeuchi | 0:27e9d6071e9b | 154 | // batt_mark(); |
takeuchi | 0:27e9d6071e9b | 155 | |
takeuchi | 0:27e9d6071e9b | 156 | }//while |
takeuchi | 0:27e9d6071e9b | 157 | }//main |
takeuchi | 0:27e9d6071e9b | 158 |