// Power switch - On/Off, Sleep at Bat <3V. FET or Gate for BT power // Low Bat/ Chg complete buzzer. --> Phone display?? // Low device power Buzzer #include #include #include MCP3424 MCP(0x68); // Declaration of MCP3424 pin addr1 et addr0 are connected to +5V unsigned long previousMillis = 0; const int buzzOut = 6; // Int LED & Buzzer connected. const int interval = 205; // 200mS interval calibration char data = 0; int Mode = 0; int buzzFlag = 0; int Tick = 0; int Tick1 = 0; float Voltage = 0; // mV float Current = 0; // mA float Power = 0; // VxA, WH double cum_mAH = 0; // Cumulative current, mAH float mAH = 0; float lap_mAH = 0; float startLap_mAH = 0; float lastLap_mAH = 0; float cum_Power = 0; int Sec = 0; int Min = 0; int Hour = 0; int Sec1 = 0; int Min1 = 0; int Hour1 = 0; void setup(void){ digitalWrite(buzzOut, LOW); pinMode(buzzOut, OUTPUT); Serial.begin(9600); } // End of setup void tickCounter(void){ unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval){ Tick = Tick+1; // 200mS counter Tick1 = Tick1+1; previousMillis = currentMillis; } } void beep_beep(void){ if(buzzFlag == 0){ for(int i = 0; i < 3; i++){ digitalWrite(buzzOut, HIGH); delay (100); digitalWrite(buzzOut, LOW); delay(100); } buzzFlag = 1; } } void measure(void){ if(Tick == 1){ // Every 200mS Tick = 0; MCP.Configuration(1,14,0,1); // MCP3424 is configured to channel i with 18 bits resolution, continous mode and gain defined to 8 MCP.NewConversion(); Voltage = abs(MCP.Measure()*0.03001); // Voltage Calibration MCP.Configuration(2,14,0,8); // MCP3424 is configured to channel i with 18 bits resolution, continous mode and gain defined to 8 MCP.NewConversion(); Current = (MCP.Measure()/10.3); // Current calinbration cum_mAH = cum_mAH + abs(Current); mAH = cum_mAH/18000; Power = Voltage/1000 * abs(Current)/1000; cum_Power = cum_Power + Power; if (Voltage <32500){ // 13X2.5V = 32.5V, Over discharge warning beep_beep(); } } if(Tick1 >= 5){ Tick1 = 0, Sec = Sec+1; if(Sec >= 60) Sec = 0, Min = Min + 1; if(Min >= 60) Min = 0, Hour = Hour + 1; } if(Serial.available() > 0){ data = Serial.read(); //Read the incoming data and store it into variable data if(data == '1'){ // Checks whether value of data is equal to 1 if(Mode == 0){ Mode = 3; lap_mAH = 0; startLap_mAH = 0; lastLap_mAH = 0; Sec1 = 0; Min1 = 0; Hour1 = 0; } else if(Mode == 1){ Sec1 = Sec1+1; if(Sec1 >= 60) Sec1 = 0, Min1 = Min1 + 1; if(Min1 >= 60) Min1 = 0, Hour1 = Hour1 + 1; lap_mAH = mAH + lastLap_mAH - startLap_mAH; } else if(Mode == 2){ startLap_mAH = mAH - lap_mAH; lastLap_mAH = lap_mAH; } Serial.print(mAH, 1); Serial.print(", "); Serial.print(Voltage/1000); Serial.print(", "); Serial.print(Current/1000); Serial.print(", "); Serial.print(Hour); Serial.print(":"); if(Min<10){ Serial.print("0"); Serial.print(Min), Serial.print(":"); } else Serial.print(Min), Serial.print(":"); if(Sec<10){ Serial.print("0"); Serial.print(Sec); } else Serial.print(Sec); Serial.print(", "); Serial.print(lap_mAH, 1); Serial.print(", "); Serial.print(Hour1); Serial.print(":"); if(Min1<10){ Serial.print("0"); Serial.print(Min1), Serial.print(":"); } else Serial.print(Min1), Serial.print(":"); if(Sec1<10){ Serial.print("0"); Serial.println(Sec1); } else Serial.println(Sec1); } else if(data == 'S'){ Mode = 1; startLap_mAH = mAH; } else if(data == 'P'){ Mode = 2; } else if(data == 'R'){ Mode = 0; } } } void loop(void){ // Start of loop tickCounter(); measure(); } // End of loop