Stap 6: Broncode
Alle de code, schema's en foto's samen met discussie is verkrijgbaar bij http://tech.groups.yahoo.com/group/arduinohome/files/volt%20amp%20watt%20hour%20meter/ en http://forum.pololu.com/viewtopic.php?f=3&t=5415
#include
/ * Deze schets wordt beschreven hoe u verbinding maken met een ACS715 huidige zin drager
(http://www.pololu.com/catalog/product/1186) aan de Arduino,
en lees stroom die via de sensor.
*/
LiquidCrystal lcd (7, 8, 9, 10, 11, 12);
/*
VCC op dragerraad Arduino + 5v
GND op dragerraad met Arduino GND
Op dragerraad aan Arduino A0
De macht lugs invoegen het ladingen positieve lood circuit,
pijl op carrier board punten om te laden, andere lug verbindt met
positieve voeding
Voltage Divider
9 k Ohm uit + tot A4
3 k Ohm vanaf A4 met Gnd
*/
int Vin = 20;
int Vout = 5;
int verhouding = Vin / Vout; Berekend op basis van Vin / Vout
int batMonPin = A4; invoer pin voor de spanning divider
int ADCVal = 0; variabele voor de A/D-waarde
zweven pinVoltage = 0; variabele voor de berekende spanning
zweven batteryVoltage = 0;
int analogInPin = A0; Analoge invoer pin die de dragerraad uit is verbonden met
int sensorValue = 0; waarde van de de dragerraad van de leest
int outputValue = 0; uitvoer in milliampère
niet-ondertekende lange msec = 0;
zweven tijd = 0,0;
int-steekproef = 0;
zweven totalCharge = 0,0;
zweven averageAmps = 0,0;
zweven ampSeconds = 0,0;
zweven ampHours = 0,0;
zweven wattHours = 0,0;
zweven ampère = 0,0;
int R1 = 9000; Weerstand van R1 in ohm
int R2 = 3000; Weerstand van R2 in ohm
int verhouding = 0; Berekend op basis van Vin / Vout
VOID Setup {}
seriële communicatie 9600 bps te initialiseren:
Serial.begin(9600);
LCD.begin (20, 4);
}
void loop {}
int sampleADCVal = 0;
int avgADCVal = 0;
int sampleAmpVal = 0;
int avgSAV = 0;
voor (int x = 0 x < 10; x ++) {/ / doorlopen lus 10 x
Lees de analoge waarde:
sensorValue = analogRead(analogInPin);
sampleAmpVal = sampleAmpVal + sensorValue; monsters bij elkaar optellen
ADCVal = analogRead(batMonPin); Lees de spanning op de scheidingslijn
sampleADCVal = sampleADCVal + ADCVal; monsters bij elkaar optellen
vertraging (10); ADC regelen voordat de volgende monster laat
}
avgSAV = sampleAmpVal / 10;
omzetten in milli-ampère
outputValue = (((lange) avgSAV * 5000 / 1024) - 500) * 1000 / 133;
/ * sensor output ongeveer 100 in rust.
Analoge Lees produceert een waarde van 0-1023, hetgeen neerkomt op 0v naar 5v.
"((lange) sensorValue * 5000 / 1024)" is de spanning op de sensor de uitvoer in millivolts.
Er is een verschuiving van de 500mv aftrekken.
De unit produceert 133mv per amp stroom, dus
verdelen door 0.133 mv omzetten in ma
*/
avgADCVal = sampleADCVal / 10; delen door 10 (aantal monsters) om een gestage lezing
pinVoltage = avgBVal *. 00488; Bereken de spanning op de A/D-pin
/ * Een lezing van 1 voor de A/D = 0.0048mV
Als we de A/D-lezing te met 0.00488 dan vermenigvuldigen
We krijgen de spanning op de pin.
Ook, afhankelijk van de bedrading en
Wanneer spanning wordt gelezen, onder
zware lasten spanning weergegeven kan worden
goed onder spanning bij levering. monitor
bij laden of te leveren en te beslissen.
*/
batteryVoltage = pinVoltage * verhouding; Gebruik de verhouding berekend voor de spanning divider
voor het berekenen van de accuspanning
Ampère = (float) outputValue / 1000;
zweven watt = ampère * batteryVoltage;
Serial.Print ("volt =");
Serial.Print(batteryVoltage);
Serial.Print ("\t stroom (Ampere) =");
Serial.Print(amps);
Serial.Print ("\t vermogen (watt) =");
Serial.Print(Watts);
voorbeeld = monster + 1;
msec = millis();
tijd = (float) msec / 1000.0;
totalCharge = totalCharge + versterkers;
averageAmps = totalCharge / monster;
ampSeconds = averageAmps * tijd;
ampHours = ampSeconds/3600;
wattHours = batteryVoltage * ampHours;
Serial.Print ("\t tijd (uren) =");
Serial.Print(time/3600);
Serial.Print ("\t Amp Hours (ah) =");
Serial.Print(ampHours);
Serial.Print ("\t Watt-uur (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 (verhouding, 5);
LCD.Print("");
LCD.Print(avgBVal);
wacht 10 milliseconden voordat de next-lus
voor de analoog / digitaal-converter te regelen
na de laatste lezing:
delay(10);
}