VIメータのプログラムですI2C LCDとINA226を装備しています。

Dependencies:   mbed

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?

UserRevisionLine numberNew 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