Paso 6: Código de fuente
El código, esquemas y fotos junto con la discusión está disponible en http://tech.groups.yahoo.com/group/arduinohome/files/volt%20amp%20watt%20hour%20meter/ y http://forum.pololu.com/viewtopic.php?f=3&t=5415
#include
/ * Este dibujo describe cómo conectar un portador de sentido actual de ACS715
(http://www.pololu.com/catalog/product/1186) para Arduino,
y corriente que fluye a través del sensor.
*/
LiquidCrystal lcd (7, 8, 9, 10, 11, 12);
/*
VCC a bordo del portador a Arduino + 5v
TIERRA a bordo del portador a GND de Arduino
En Junta de portador a Arduino A0
Inserte las zapatas de alimentación en el circuito positivo de cargas,
flecha de puntos portador cargar, otro terminal se conecta a
fuente de alimentación positiva
Divisor de tensión
9 k Ohm de + a A4
3 k Ohm desde A4 a Gnd
*/
int Vin = 20;
int Vout = 5;
int cociente = Vin / Vout; Calculada a partir de Vin / Vout
int batMonPin = A4; entrada de pin para el divisor de voltaje
int ADCVal = 0; variable para el valor de A/D
Float pinVoltage = 0; variable que contenga el voltaje calculado
batteryVoltage del flotador = 0;
int analogInPin = A0; Clavija de entrada analógica que el portador del tablero hacia fuera está conectado a
int sensorValue = 0; valor leído de la tarjeta de transportista
int outputValue = 0; de salida en miliamperios
ms largo sin signo = 0;
tiempo de flotador = 0.0;
muestra de int = 0;
Float totalCharge = 0.0;
Float averageAmps = 0.0;
Float ampSeconds = 0.0;
flotador de amp-horas = 0.0;
Float wattHours = 0.0;
flotador de amperios = 0.0;
int R1 = 9000; Resistencia de R1 en ohms
int R2 = 3000; Resistencia de R2 en ohms
int cociente = 0; Calculada a partir de Vin / Vout
void setup() {}
inicializar comunicaciones serie a 9600 bps:
Serial.Begin(9600);
LCD.Begin (20, 4);
}
void loop() {}
int sampleADCVal = 0;
int avgADCVal = 0;
int sampleAmpVal = 0;
int avgSAV = 0;
para (int x = 0; x < 10; x ++) {/ / ejecutar bucle x 10
Lectura analógica de valor:
sensorValue = analogRead(analogInPin);
sampleAmpVal = sampleAmpVal + sensorValue; Sume las muestras
ADCVal = analogRead(batMonPin); Lea el voltaje en el divisor
sampleADCVal = sampleADCVal + ADCVal; Sume las muestras
Delay (10); que ADC settle antes de la siguiente muestra
}
avgSAV = sampleAmpVal / 10;
convertir a Mili amperios
outputValue = ((avgSAV (largo) * 5000 / 1024) - 500) * 1000 / 133;
/ * sensor salidas cerca de 100 en el resto.
Análogo leer produce un valor de 0-1023, equiparando a 0v a 5v.
"(sensorValue (largo) * 5000 / 1024)" es el voltaje en el sensor de salida en milivoltios.
Hay un desplazamiento de 500mv para restar.
La unidad produce 133mv por amperio de corriente, así
dividir por 0.133 convertir mv y ma
*/
avgADCVal = sampleADCVal / 10; dividir por 10 (número de muestras) para obtener una lectura constante
pinVoltage = avgBVal *. 00488; Calcular el voltaje en el pin de A/D
/ * Una lectura de 1 para el A/D = 0.0048mV
Si multiplicamos la lectura del A/d por 0.00488 entonces
obtenemos el voltaje en el pin.
También, dependiendo del cableado y
que voltaje se lee, bajo
cargas pesadas muestra pueden
bajo voltaje en la fuente. monitor
en carga o fuente y decidir.
*/
batteryVoltage = pinVoltage * relación; Uso calcula el cociente por el divisor de voltaje
para calcular el voltaje de la batería
amperios = (float) outputValue / 1000;
flotador de vatios = amperios * batteryVoltage;
Serial.Print ("v =");
Serial.Print(batteryVoltage);
Serial.Print ("\t corriente (amperios) =");
Serial.Print(AMPS);
Serial.Print ("\t potencia (vatios) =");
Serial.Print(Watts);
muestra = muestra + 1;
MS = millis();
tiempo = (float) mseg / 1000.0;
totalCharge = totalCharge + amperios;
averageAmps = totalCharge / muestra;
ampSeconds = averageAmps * tiempo;
amp-horas = ampSeconds/3600;
wattHours = batteryVoltage * amp-horas;
Serial.Print ("\t tiempo (horas) =");
Serial.Print(Time/3600);
Serial.Print ("\t amperios hora (ah) =");
Serial.Print(ampHours);
Serial.Print ("\t vatios-hora (wh) =");
Serial.println(wattHours);
lcd.setCursor(0,0);
LCD.Print(batteryVoltage);
LCD.Print ("V");
LCD.Print(AMPS);
LCD.Print ("A");
lcd.setCursor(0,1);
LCD.Print(Watts);
LCD.Print ("W");
LCD.Print(Time/3600);
LCD.Print ("H");
lcd.setCursor(0,2);
LCD.Print(ampHours);
LCD.Print ("Ah");
LCD.Print(wattHours);
LCD.Print ("Wh");
lcd.setCursor(0,3);
LCD.Print (ratio, 5);
LCD.Print("");
LCD.Print(avgBVal);
esperar 10 milisegundos antes del siguiente bucle
para el convertidor de analógico a digital resolver
después de la última lectura:
Delay(10);
}