Advertisement
KRITSADA

Battery Measure Lead Acid Voltage

Feb 24th, 2021
1,033
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Ratios between voltage dividers
  2. // R# = (R1+R2)/R2
  3. float R1 = 3.128;
  4. float R2 = 6.255;
  5. float R3 = 9.383;
  6. float R4 = 12.511;
  7. float R5 = 15.638;
  8. float R6 = 18.766;
  9. float R7 = 21.894;
  10. float R8 = 25.021;
  11.  
  12. // % Variables
  13. int P8 = 0;
  14. int P7 = 0;
  15. int P6 = 0;
  16. int P5 = 0;
  17. int P4 = 0;
  18. int P3 = 0;
  19. int P2 = 0;
  20. int P1 = 0;
  21.  
  22. long readVcc() {
  23.   // Read 1.1V reference against AVcc
  24.   // set the reference to Vcc and the measurement to the internal 1.1V reference
  25. #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  26.   ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  27. #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
  28.   ADMUX = _BV(MUX5) | _BV(MUX0) ;
  29. #else
  30.   ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  31. #endif
  32.  
  33.   delay(2); // Wait for Vref to settle
  34.   ADCSRA |= _BV(ADSC); // Start conversion
  35.   while (bit_is_set(ADCSRA, ADSC)); // measuring
  36.  
  37.   uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH
  38.   uint8_t high = ADCH; // unlocks both
  39.  
  40.   long result = (high << 8) | low;
  41.  
  42.   result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  43.   return result; // Vcc in millivolts
  44. }
  45.  
  46. void setup() {
  47.   // initialize serial port
  48.   Serial.begin(9600);
  49. }
  50.  
  51. void loop() {
  52.  
  53.  
  54.   //Battery Voltage
  55.   float B1Voltage = 0;
  56.   float B2Voltage = 0;
  57.   float B3Voltage = 0;
  58.   float B4Voltage = 0;
  59.   float B5Voltage = 0;
  60.   float B6Voltage = 0;
  61.   float B7Voltage = 0;
  62.   float B8Voltage = 0;
  63.  
  64.  
  65.   //converted signal in 5v domain
  66.   float RealBat1V = 0;
  67.   float RealBat2V = 0;
  68.   float RealBat3V = 0;
  69.   float RealBat4V = 0;
  70.   float RealBat5V = 0;
  71.   float RealBat6V = 0;
  72.   float RealBat7V = 0;
  73.   float RealBat8V = 0;
  74.  
  75.  
  76.   //Analog channel raw value
  77.   float VolBat1 = 0;
  78.   float VolBat2 = 0;
  79.   float VolBat3 = 0;
  80.   float VolBat4 = 0;
  81.   float VolBat5 = 0;
  82.   float VolBat6 = 0;
  83.   float VolBat7 = 0;
  84.   float VolBat8 = 0;
  85.  
  86.   float vccValue = readVcc() / 1000.0; //Arduino refence voltage
  87.  
  88.  
  89.   // Reading battery voltages
  90.   VolBat8 = analogRead(A8);
  91.   VolBat7 = analogRead(A7);
  92.   VolBat6 = analogRead(A6);
  93.   VolBat5 = analogRead(A5);
  94.   VolBat4 = analogRead(A4);
  95.   VolBat3 = analogRead(A3);
  96.   VolBat2 = analogRead(A2);
  97.   VolBat1 = analogRead(A1);
  98.  
  99.  
  100.   //Converting raw value in 5v domian
  101.   RealBat1V = VolBat1 * vccValue / 1024.0;
  102.   RealBat2V = VolBat2 * vccValue / 1024.0;
  103.   RealBat3V = VolBat3 * vccValue / 1024.0;
  104.   RealBat4V = VolBat4 * vccValue / 1024.0;
  105.   RealBat5V = VolBat5 * vccValue / 1024.0;
  106.   RealBat6V = VolBat6 * vccValue / 1024.0;
  107.   RealBat7V = VolBat7 * vccValue / 1024.0;
  108.   RealBat8V = VolBat8 * vccValue / 1024.0;
  109.  
  110.  
  111.   //Calculating actual voltages
  112.   B8Voltage = RealBat4V * R8;
  113.   B7Voltage = RealBat3V * R7 - B8Voltage;
  114.   B6Voltage = RealBat2V * R6 - B8Voltage - B7Voltage;
  115.   B5Voltage = RealBat1V * R5 - B8Voltage - B7Voltage - B6Voltage;
  116.   B4Voltage = RealBat4V * R4 - B8Voltage - B7Voltage - B6Voltage - B5Voltage;
  117.   B3Voltage = RealBat3V * R3 - B8Voltage - B7Voltage - B6Voltage - B5Voltage - B4Voltage;
  118.   B2Voltage = RealBat2V * R2 - B8Voltage - B7Voltage - B6Voltage - B5Voltage - B4Voltage - B3Voltage;
  119.   B1Voltage = RealBat1V * R1 - B8Voltage - B7Voltage - B6Voltage - B5Voltage - B4Voltage - B3Voltage - B2Voltage;
  120.  
  121.  
  122.   //Convert to %
  123.   // map(value, fromLow, fromHigh, toLow, toHigh)
  124.   P8 = map(B8Voltage, 0, 12, 0, 100);
  125.   P7 = map(B7Voltage, 0, 12, 0, 100);
  126.   P6 = map(B6Voltage, 0, 12, 0, 100);
  127.   P5 = map(B5Voltage, 0, 12, 0, 100);
  128.   P4 = map(B4Voltage, 0, 12, 0, 100);
  129.   P3 = map(B3Voltage, 0, 12, 0, 100);
  130.   P2 = map(B2Voltage, 0, 12, 0, 100);
  131.   P1 = map(B1Voltage, 0, 12, 0, 100);
  132.  
  133.  
  134.   //Print voltages on serial monitor
  135.   Serial.print("Battery-1 Voltage=");
  136.   Serial.println(B1Voltage);
  137.   Serial.print("Battery-2 Voltage=");
  138.   Serial.println(B2Voltage);
  139.   Serial.print("Battery-3 Voltage=");
  140.   Serial.println(B3Voltage);
  141.   Serial.print("Battery-4 Voltage=");
  142.   Serial.println(B4Voltage);
  143.   Serial.print("Battery-5 Voltage=");
  144.   Serial.println(B5Voltage);
  145.   Serial.print("Battery-6 Voltage=");
  146.   Serial.println(B6Voltage);
  147.   Serial.print("Battery-7 Voltage=");
  148.   Serial.println(B7Voltage);
  149.   Serial.print("Battery-8 Voltage=");
  150.   Serial.println(B8Voltage);
  151.  
  152.   delay(2000); //2 Seconds delay and then start again
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement