Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <PID_v1.h>
- //Basic energy monitoring sketch - by Trystan Lea
- //Licenced under GNU General Public Licence more details here
- // openenergymonitor.org
- // modified by Tim Robinson to include PID library
- //Sketch measures current only.
- //and then calculates useful values like
- //apparent power and Irms.
- //Apparent power is calculated from set Vrms.
- double Vrms=240.0;
- //Setup variables
- int numberOfSamples = 1000;
- //Set current input pin
- int In_pv = 1;
- int In_used = 0;
- int analogOutPin = 9;
- double time;
- // values for samples = 2000
- //double Kp = 0.08;
- //double Ki = 0.3;
- //double Kd = 0.000;
- // values for samples = 100
- double Kp = 0.03;
- double Ki = 0.3;
- double Kd = 0.0005;
- //Current calibration coeficient
- double ICAL_used = 0.15007;
- double ICAL_pv = 0.1529;
- //Sample variables
- int lastSampleI_pv,sampleI_pv,lastSampleI_used,sampleI_used ;
- int heater_power;
- //Filter variables
- double lastFilteredI_pv, filteredI_pv;
- double lastFilteredI_used, filteredI_used;
- //Power calculation variables
- double sqI_pv,sumI_pv;
- double sqI_used,sumI_used;
- //Useful value variables
- double apparentPower_pv, Irms_pv;
- double apparentPower_used, Irms_used;
- double export_pwr;
- //Define Variables we'll be connecting to
- double Setpoint, Input, Output;
- //Specify the links and initial tuning parameters
- PID myPID(&Input, &Output, &Setpoint,Kp,Ki,Kd,DIRECT);
- void setup()
- {
- Serial.begin(115200);
- heater_power = 0;
- myPID.SetMode(AUTOMATIC);
- Setpoint = 0;
- }
- void loop()
- {
- for (int n=0; n<numberOfSamples; n++)
- {
- //Used for offset removal
- lastSampleI_pv=sampleI_pv;
- lastSampleI_used=sampleI_used;
- //Read in current samples.
- sampleI_pv = analogRead(In_pv);
- sampleI_used = analogRead(In_used);
- //Used for offset removal
- lastFilteredI_pv = filteredI_pv;
- lastFilteredI_used = filteredI_used;
- //Digital high pass filters to remove 2.5V DC offset.
- filteredI_pv = 0.996*(lastFilteredI_pv+sampleI_pv-lastSampleI_pv);
- filteredI_used = 0.996*(lastFilteredI_used+sampleI_used-lastSampleI_used);
- // debug to remove filter for use with a pot
- // filteredI_pv=sampleI_pv;
- //Root-mean-square method current
- //1) square current values
- sqI_pv = filteredI_pv * filteredI_pv;
- sqI_used = filteredI_used * filteredI_used;
- //2) sum
- sumI_pv += sqI_pv;
- sumI_used += sqI_used;
- }
- //Calculation of the root of the mean of the current squared (rms)
- //Calibration coeficients applied.
- Irms_pv = ICAL_pv*sqrt(sumI_pv / numberOfSamples);
- Irms_used = ICAL_used*sqrt(sumI_used / numberOfSamples);
- //Calculation power values
- apparentPower_pv = Vrms * Irms_pv;
- apparentPower_used = Vrms * Irms_used;
- Input = apparentPower_used;
- Setpoint = apparentPower_pv;
- myPID.Compute();
- heater_power = Output;
- if (heater_power > 255) heater_power=255;
- if (heater_power < 0) heater_power=0;
- analogWrite(analogOutPin, 255-heater_power);
- time=millis();
- //Output to serial
- Serial.print("timestamp: ");
- Serial.print(time/1000,3);
- Serial.print(" PV: ");
- Serial.print(Setpoint,0);
- Serial.print(" Using: ");
- Serial.print(apparentPower_used,0);
- Serial.print(" Delta : ");
- Serial.print(apparentPower_used-Setpoint,0);
- Serial.print(" Heater power: ");
- Serial.println(heater_power,DEC);
- //Reset current accumulator
- sumI_pv = 0;
- sumI_used = 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement