//Main unit arduino sketch - openenergymonitor.org //Author: Trystan Lea // angepasst fuer meine PDU 20100410 http://www.komputer.de/wordpress/?p=8 // multiple current sensors void takeMeasurments() { i=0; int x=0; //We will make 6000 instantaneous measurments to get what we want //while(i < samplenumber) while(x < 1) { //--CURRENT MEASURMENT----------------------------- double VsensV1 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI1 = (analogRead(1) * ADCvoltsperdiv)-VDoffset; // Factor for real Voltage, remove offset //double VsensV1 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI1=sumI1+(VsensI1*VsensI1); //Root-mean-square method current sumP1=sumP1+(VsensV1*VsensI1); //real power calculation; double VsensV2 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI2 = (analogRead(2) * ADCvoltsperdiv)-VDoffset; //double VsensV2 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI2=sumI2+(VsensI2*VsensI2); sumP2=sumP2+(VsensV2*VsensI2); double VsensV3 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI3 = (analogRead(3) * ADCvoltsperdiv)-VDoffset; //double VsensV3 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI3=sumI3+(VsensI3*VsensI3); sumP3=sumP3+(VsensV3*VsensI3); double VsensV4 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI4 = (analogRead(4) * ADCvoltsperdiv)-VDoffset; //double VsensV4 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI4=sumI4+(VsensI4*VsensI4); sumP4=sumP4+(VsensV4*VsensI4); double VsensV5 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI5 = (analogRead(5) * ADCvoltsperdiv)-VDoffset; //double VsensV5 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI5=sumI5+(VsensI5*VsensI5); sumP5=sumP5+(VsensV5*VsensI5); double VsensV6 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI6 = (analogRead(6) * ADCvoltsperdiv)-VDoffset; //double VsensV6 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI6=sumI6+(VsensI6*VsensI6); sumP6=sumP6+(VsensV6*VsensI6); double VsensV7 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI7 = (analogRead(7) * ADCvoltsperdiv)-VDoffset; //double VsensV7 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI7=sumI7+(VsensI7*VsensI7); sumP7=sumP7+(VsensV7*VsensI7); double VsensV8 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI8 = (analogRead(8) * ADCvoltsperdiv)-VDoffset; //double VsensV8 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI8=sumI8+(VsensI8*VsensI8); sumP8=sumP8+(VsensV8*VsensI8); double VsensV9 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI9 = (analogRead(9) * ADCvoltsperdiv)-VDoffset; //double VsensV9 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI9=sumI9+(VsensI9*VsensI9); sumP9=sumP9+(VsensV9*VsensI9); double VsensV10 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI10 = (analogRead(10) * ADCvoltsperdiv)-VDoffset; //double VsensV10 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI10=sumI10+(VsensI10*VsensI10); sumP10=sumP10+(VsensV10*VsensI10); double VsensV11 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; double VsensI11 = (analogRead(11) * ADCvoltsperdiv)-VDoffset; //double VsensV11 = (analogRead(0) * ADCvoltsperdiv)-VDoffset; sumI11=sumI11+(VsensI11*VsensI11); sumP11=sumP11+(VsensV11*VsensI11); //--VOLTAGE MEASURMENT----------------------------- //Get the analog value for Voltage adcVoltV = analogRead(0) * ADCvoltsperdiv; //Remove voltage divider offset VsensV = adcVoltV-VDoffset; //Calculates Voltage divider offset. sum2i++; sumVadcV = sumVadcV + adcVoltV; if (sum2i>=4000) {VDoffset = sumVadcV/sum2i; sum2i = 0.0; sumVadcV=0.0;} //Root-mean-square method voltage // square voltage values sumV=sumV+(VsensV*VsensV); // VsensV,sumV //--FREQUENCY MEASURMENT--------------------------- //Is this really needed? if (i==1) vLastZeroMsec = micros(); //Check for zero crossing if (lVsensV < 0 && VsensV >= 0 && i>1) { //period of voltage waveform vPeriod = micros() - vLastZeroMsec; //Filteres out any erronous period measurments //Increases accuracy considerably if (vPeriod > (expPeriod-filterWidth) && vPeriod<(expPeriod+filterWidth)) { vPeriodSum += vPeriod; vPeriodCount++; } vLastZeroMsec = micros(); } lVsensV=VsensV; //--------------------------------------------------------- //Summing counter i++; // hier serial read // samplenumber = i if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); if (incomingByte == 49 ) { // say what you got: samplenumber = i; x = 10; // exit while loop } } } //Calculation of the root of the mean of the current squared (rms) Irms1 = factorA*sqrt(sumI1/samplenumber); Irms2 = factorB*sqrt(sumI2/samplenumber); Irms3 = factorB*sqrt(sumI3/samplenumber); Irms4 = factorB*sqrt(sumI4/samplenumber); Irms5 = factorB*sqrt(sumI5/samplenumber); Irms6 = factorC*sqrt(sumI6/samplenumber); Irms7 = factorC*sqrt(sumI7/samplenumber); Irms8 = factorC*sqrt(sumI8/samplenumber); Irms9 = factorC*sqrt(sumI9/samplenumber); Irms10 = factorC*sqrt(sumI10/samplenumber); Irms11 = factorC*sqrt(sumI11/samplenumber); //Reset the sum sumI1=0.0; sumI2=0.0; sumI3=0.0; sumI4=0.0; sumI5=0.0; sumI6=0.0; sumI7=0.0; sumI8=0.0; sumI9=0.0; sumI10=0.0; sumI11=0.0; //------------------------------------------------ //Calculation of the root of the mean of the voltage squared (rms) Vrms = factorD*sqrt(sumV/samplenumber); //Reset the sum sumV=0.0; //------------------------------------------------ //POWER CALCULATIONS----------------------------- realPower1 = factorA*factorD*(sumP1/samplenumber); realPower2 = factorB*factorD*(sumP2/samplenumber); realPower3 = factorB*factorD*(sumP3/samplenumber); realPower4 = factorB*factorD*(sumP4/samplenumber); realPower5 = factorB*factorD*(sumP5/samplenumber); realPower6 = factorC*factorD*(sumP6/samplenumber); realPower7 = factorC*factorD*(sumP7/samplenumber); realPower8 = factorC*factorD*(sumP8/samplenumber); realPower9 = factorC*factorD*(sumP9/samplenumber); realPower10 = factorC*factorD*(sumP10/samplenumber); realPower11 = factorC*factorD*(sumP11/samplenumber); //Reset the sum sumP1=0.0; sumP2=0.0; sumP3=0.0; sumP4=0.0; sumP5=0.0; sumP6=0.0; sumP7=0.0; sumP8=0.0; sumP9=0.0; sumP10=0.0; sumP11=0.0; apparentPower1 = Irms1 * Vrms; apparentPower2 = Irms2 * Vrms; apparentPower3 = Irms3 * Vrms; apparentPower4 = Irms4 * Vrms; apparentPower5 = Irms5 * Vrms; apparentPower6 = Irms6 * Vrms; apparentPower7 = Irms7 * Vrms; apparentPower8 = Irms8 * Vrms; apparentPower9 = Irms9 * Vrms; apparentPower10 = Irms10 * Vrms; apparentPower11 = Irms11 * Vrms; powerFactor1 = realPower1 / apparentPower1; powerFactor2 = realPower2 / apparentPower2; powerFactor3 = realPower3 / apparentPower3; powerFactor4 = realPower4 / apparentPower4; powerFactor5 = realPower5 / apparentPower5; powerFactor6 = realPower6 / apparentPower6; powerFactor7 = realPower7 / apparentPower7; powerFactor8 = realPower8 / apparentPower8; powerFactor9 = realPower9 / apparentPower9; powerFactor10 = realPower10 / apparentPower10; powerFactor11 = realPower11 / apparentPower11; //------------------------------------------------ //FREQUENCY CALCULATION-------------------------- freq = (1000000.0 * vPeriodCount) / vPeriodSum; vPeriodSum=0; vPeriodCount=0; //------------------------------------------------ //--ENERGY MEASURMENT CALCULATION---------------- ////Calculate amount of time since last realpower measurment. //ltmillis = tmillis; //tmillis = millis(); //timems = tmillis - ltmillis; ////Calculate todays number of kwh consumed. ////kwhTotal = kwhTotal + ((realPower/1000.0) * 1.0/3600.0 * (timems/1000.0)); ////Reset kwh every 24hours //if ((tmillis-startmillis)>86400000) //{ ////Set past kwh values for quick comparison on display. //kwhDay3 = kwhDay2; //kwhDay2 = kwhDay1; //kwhDay1 = kwhTotal; ////Reset for the new day. //kwhTotal = 0.0; //startmillis=tmillis; //} //------------------------------------------------ // hier print serial sendDataToUSB(); }