long readVcc() { long result; // Read 1.1V reference against AVcc ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = 1126400L / result; // Back-calculate AVcc in mV return result; } const int analogIn = A0; int mVperAmp = 90; // from datasheet int RawValue= 0; double Voltage = 0; double avgVoltage = 0; double Amps = 0; void setup() { Serial.begin(9600); } void loop() { Serial.println( readVcc(), DEC ); RawValue = analogRead(analogIn); Voltage = ((RawValue / 1023.0) * readVcc()) / 1000; // Gets you mV avgVoltage = Voltage / 1.025; // magic Amps = ((Voltage - (readVcc() / 2)) / mVperAmp); Serial.print("A0 = " ); // shows pre-scaled value Serial.print(RawValue); Serial.print("\t V = "); // shows the voltage measured Serial.print(avgVoltage,2); // the '3' after voltage allows you to display 3 digits after decimal point Serial.print("\t Amps = "); // shows the voltage measured Serial.println(Amps,2); // the '3' after voltage allows you to display 3 digits after decimal point delay(1000); }