//Stand alone measurment arduino sketch - openenergymonitor.org //Author: Trystan Lea // angepasst fuer meine PDU 20100410 http://www.komputer.de/wordpress/?p=8 //Measurment code adapted from code by: Cliff Jao and Xi Guo's PowerBox project //---ENERGY MONITORING CALCULATION VARIABLE DECLERATION------ //--VOLTAGE MEASURMENT VARIABLES--------------------------- //factorD = Voltage measurment scale factor (m - in y=mx+c calibration) double factorD = 288.97; //(c - in y=mx+c calibration) //c currently not used // double Voffset = 0; //Voltage divider offset - Initial value (corrected as program runs) double VDoffset = 2.45; //Used for voltage divider offset calculation. int sum2i=0; double sumVadcV=0.0; //Voltage at analog input double adcVoltV; //Voltage across power adapter. double VsensV; //Used for calculation of mean in root-mean-square calculation. double sumV=0.0; //RMS Voltage double Vrms; //--------------------------------------------------------- //--CURRENT MEASURMENT VARIABLES--------------------------- //factorA = Current measurment scale factor (m - in y=mx+c calibration) double factorA = 10.00; // CT reduction factor / rsens=100R double factorB = 5.9; // CT reduction factor / rsens=180R double factorC = 10.00; // CT reduction factor / rsens=250R //(c - in y=mx+c calibration) //c currently not used //double Ioffset = 0; //-0.08; //Used for voltage divider offset calculation. //int sum1i=0; //double sumVadcI=0.0; //Used for calculation of mean in root-mean-square calculation. double sumI1=0.0; double sumI2=0.0; double sumI3=0.0; double sumI4=0.0; double sumI5=0.0; double sumI6=0.0; double sumI7=0.0; double sumI8=0.0; double sumI9=0.0; double sumI10=0.0; double sumI11=0.0; //RMS Current double Irms1; double Irms2; double Irms3; double Irms4; double Irms5; double Irms6; double Irms7; double Irms8; double Irms9; double Irms10; double Irms11; //--------------------------------------------------------- //--POWER MEASURMENT VARIABLES------------------------------ //Used for calculation of real power (average calculation) double sumP1; double sumP2; double sumP3; double sumP4; double sumP5; double sumP6; double sumP7; double sumP8; double sumP9; double sumP10; double sumP11; //The all important power variables. double apparentPower1, apparentPower2, apparentPower3, apparentPower4, apparentPower5, apparentPower6, apparentPower7, apparentPower8, apparentPower9, apparentPower10, apparentPower11, realPower1, realPower2, realPower3, realPower4, realPower5, realPower6, realPower7, realPower8, realPower9, realPower10, realPower11, powerFactor1, powerFactor2, powerFactor3, powerFactor4, powerFactor5, powerFactor6, powerFactor7, powerFactor8, powerFactor9, powerFactor10, powerFactor11; //----------------------------------------------------------- //--ENERGY MEASURMENT VARIABLES------------------------------ //Calculation of kwh //time taken since last measurment timems = tmillis - ltmillis; unsigned long ltmillis, tmillis, timems; //time when arduino is switched on... is it 0? unsigned long startmillis; //kwhTotal is cumulative kwh today, the other 3 are historical over the last 3 days for comparison. double kwhTotal =0.0, kwhDay1 = 6.3, kwhDay2 =15.6, kwhDay3 =21.7; //values in here so that I have something to compare with when I first switch it on. //----------------------------------------------------------- //--FREQUENCY MEASURMENT VARIABLES--------------------------- //VsensV above is the voltage across power adapter. //lVsensV is the last value of VsensV //used to check for zero-crossing of the voltage waveform double lVsensV; //time in microseconds when the voltage waveform //last crossed zero. unsigned long vLastZeroMsec; //Micro seconds since last zero-crossing unsigned long vPeriod; //Sum of vPeriod's to obtain an average. unsigned long vPeriodSum; //Number of periods summed unsigned long vPeriodCount; //Frequency float freq; //Used to filter out errounous vPeriod readings. //Configured for 50Hz //- If your 60Hz set expPeriod = 16666 unsigned long expPeriod = 20000; unsigned long filterWidth = 2000; //----------------------------------------------------------- //--OTHER MEASURMENT VARIABLES------------------------------- //Constants to convert ADC divisions into mains current values. double ADCvoltsperdiv = 0.0048; //Amount of measurments to take before calculation of useful things //like realpower... int samplenumber = 1000; //Counter of number of samples done so for int i=0; int USBpenWriteDone=1; int printMeasurment=0; //--------------------------------------------------------- int incomingByte; //--------------------------------------------------------- void setup() { // necessary for faster analogread // http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1208715493/11 // defines for setting and clearing register bits #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif // set prescale sbi(ADCSRA,ADPS2) ; sbi(ADCSRA,ADPS1) ; cbi(ADCSRA,ADPS0) ; //----------USB SERIAL LINK SETUP-------------------------- Serial.begin(9600); //--------------------------------------------------------- //--ENERGY MEASURMENT SETUP-------------------------------- //Calculation of kwh tmillis = millis(); startmillis=tmillis; //--------------------------------------------------------- } //The main loop - all procedures and functions in include files //You should have Measurments and SerialLinks in //your bar above. void loop() { //Calculation of realpower,apparentPower,powerFactor,Vrms,Irms,frequency and kwh. takeMeasurments(); }