SHOW:
|
|
- or go back to the newest paste.
| 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 | } |