-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathPPM.cpp
95 lines (78 loc) · 1.94 KB
/
PPM.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "PPM.h"
#include "Settings.h"
#include <ResponsiveAnalogRead.h>
#include <Vcc.h>
int ppmR1 = PPM_RESISTOR;
int ppmRa = 25;
float ppmTempFinish = 0;
float ppmTempStart = 0;
double lastEC = 0;
long int lastPPM = 0;
double ppmK = 0;
float PPMconversion = PPM_EC_CONVERSION;
const float VccCorrection = VCC_VOLTAGE_READ/VCC_VOLTAGE_REPORTED;
Vcc vcc(VccCorrection);
ResponsiveAnalogRead analogPpm(PPM_SENSE_PIN, false);
void readPPMValues(double temp){
ppmR1 = (ppmR1 + ppmRa);
Serial.print(ppmK);
if (ppmK <= 0){
calibratePPM(temp);
}
float EC = 0;
float EC25 = 0;
long PPM = 0;
float raw = 0;
float Vin = vcc.Read_Volts();
float Vdrop = 0;
float Rc = 0;
float val = 0;
digitalWrite(PPM_POWER_PIN, HIGH);
analogPpm.update();
raw = analogPpm.getValue();
digitalWrite(PPM_POWER_PIN, LOW);
Vdrop = ((Vin * raw) / 1024.0);
Rc =(Vdrop * ppmR1) / (Vin - Vdrop);
Rc = Rc - ppmRa;
EC = 1000 / (Rc * ppmK);
EC25 = EC / (1 + (PPM_TEMP_COEF * (24 - 25.0)));
PPM = EC25 * PPMconversion * 1000;
// if (abs(lastPPM - PPM) > PPM_REPORT_THRESHOLD && reportTimer > 0){
// send(msgPpm.set(PPM));
// }
lastPPM = PPM;
lastEC = EC25;
}
// Calibrate EC sensor
void calibratePPM(double temp){
ppmR1 = (ppmR1 + ppmRa);
Serial.print("****** Calibrating Probe ******");
float EC = 0;
float EC25 = 0;
long PPM = 0;
float raw = 0;
float Vin = vcc.Read_Volts();
float Vdrop = 0;
float Rc = 0;
float K = 0;
int i=1;
float buffer = 0;
while(i<=10){
Serial.println(10-i);
digitalWrite(PPM_POWER_PIN, HIGH);
delay(10);
analogPpm.update();
raw = analogPpm.getValue();
digitalWrite(PPM_POWER_PIN, LOW);
buffer = buffer + raw;
i++;
delay(500);
};
raw=(buffer/10);
EC = PPM_CALIBRATION * (1 + (PPM_TEMP_COEF * (24 - 25.0))) ;
Vdrop = ((Vin * raw) / 1024.0);
Rc = (Vdrop * ppmR1)/(Vin - Vdrop);
Rc = Rc - ppmRa;
K = 1000 / (Rc * EC);
ppmK = K;
}