Étape 6: Source Code
Tous les code, schémas et photos ainsi que de la discussion est disponible à http://tech.groups.yahoo.com/group/arduinohome/files/volt%20amp%20watt%20hour%20meter/ et http://forum.pololu.com/viewtopic.php?f=3&t=5415
#include
/ * Cette esquisse explique comment connecter un porteur de sens actuel de ACS715
(http://www.pololu.com/catalog/product/1186) à l’Arduino,
et lire le courant qui circule dans le capteur.
*/
Innovente lcd (7, 8, 9, 10, 11, 12) ;
/*
Vcc sur carrier board pour Arduino + 5v
GND sur carrier board pour Arduino GND
Sur Conseil du transporteur pour Arduino A0
Monter dans le circuit de câble positif charges, alimentation
flèche sur points Conseil transporteur de charger, autre cosse se connecte à
alimentation d’énergie positive
Diviseur de tension
9 k ohms de + pour A4
3 k ohms de A4 à Gnd
*/
int NIV = 20 ;
int Vout = 5 ;
rapport / int = Vin / Vout ; Calculée à partir de Vin / Vout
int batMonPin = A4 ; broche d’entrée pour le diviseur de tension
int ADCVal = 0 ; variable de la valeur A/D
float pinVoltage = 0 ; variable destinée à contenir la tension calculée
float batteryVoltage = 0 ;
int analogInPin = A0 ; Broche d’entrée analogique connecté à la carte porteuse
int sensorValue = 0 ; valeur lue de la carrier board
int outputValue = 0 ; sortie en milliampères
unsigned long msec = 0 ;
flotteur de temps = 0.0 ;
échantillon d’int = 0 ;
float totalCharge = 0.0 ;
float averageAmps = 0.0 ;
float ampSeconds = 0.0 ;
flotteur Ah = 0.0 ;
flotteur wattheures = 0.0 ;
flotteur ampères = 0.0 ;
int R1 = 9000 ; Résistance de R1 en ohms
int R2 = 3000 ; Résistance de R2 en ohms
rapport / int = 0 ; Calculée à partir de Vin / Vout
void setup() {}
initialiser une communication série à 9600 bits/s :
Serial.Begin(9600) ;
LCD.Begin (20, 4) ;
}
void loop() {}
int sampleADCVal = 0 ;
int avgADCVal = 0 ;
int sampleAmpVal = 0 ;
int avgSAV = 0 ;
pour (int x = 0; x < 10; x ++) {/ / run dans la boucle x 10
lire l’analogue en valeur :
sensorValue = analogRead(analogInPin) ;
sampleAmpVal = sampleAmpVal + sensorValue ; additionner les échantillons
ADCVal = analogRead(batMonPin) ; Lisez la tension sur le diviseur
sampleADCVal = sampleADCVal + ADCVal ; additionner les échantillons
retard (10) ; Laissez les ADC à régler avant l’échantillon suivant
}
avgSAV = sampleAmpVal / 10 ;
convertir en milli ampères
outputValue = ((avgSAV (long) * 5000 / 1024) - 500) * 1000 / 133 ;
/ * capteur sorties environ 100 au repos.
Analog lire produit une valeur de 0-1023, équivalant à 0v à 5v.
« ((long) sensorValue * 5000 / 1024) "est sortie de la tension sur le capteur en millivolts.
Il y a un décalage de 500mv à soustraire.
L’unité produit 133mv par ampère de courant, ce
diviser par 0,133 convertir mv à ma
*/
avgADCVal = sampleADCVal / 10 ; diviser par 10 (nombre d’échantillons) pour obtenir une lecture stable
pinVoltage = avgBVal *. 00488 ; Calculer la tension sur la broche A/D
/ * Une lecture de 1 pour le A/D = 0.0048mV
Si nous multiplions la lecture A/D par 0.00488 puis
nous obtenons la tension sur la broche.
En outre, selon le câblage et
où tension est lu, moins
charges lourdes tension affichée peut être
Eh bien sous tension au tableau de distribution. moniteur
à charger ou à fournir et à décider.
*/
batteryVoltage = pinVoltage * ratio ; Utiliser le ratio calculé pour le diviseur de tension
pour calculer la tension de la batterie
ampères = (float) outputValue / 1000 ;
flotteur watts = ampères * batteryVoltage ;
Serial.Print (« Volts = ") ;
Serial.Print(batteryVoltage) ;
Serial.Print ("\t courant (ampères) =") ;
Serial.Print(AMPS) ;
Serial.Print ("\t puissance (Watts) =") ;
Serial.Print(watts) ;
échantillon = échantillon + 1 ;
MS = millis() ;
temps = (float) ms / 1000.0 ;
totalCharge = totalCharge + ampères ;
averageAmps = totalCharge / échantillon ;
ampSeconds = averageAmps * temps ;
Ah = ampSeconds/3600 ;
Wattheures = batteryVoltage * Ah ;
Serial.Print ("\t temps (heures) =") ;
Serial.Print(Time/3600) ;
Serial.Print ("\t ampères-heures (ah) =") ;
Serial.Print(ampHours) ;
Serial.Print ("\t wattheures (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 (rapport, 5) ;
LCD.Print("") ;
LCD.Print(avgBVal) ;
attendre 10 millisecondes avant la prochaine boucle
pour le convertisseur analogique-numérique à régler
après la dernière lecture :
Delay(10) ;
}