-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUVCsensor_RMS.ino
129 lines (104 loc) · 3.62 KB
/
UVCsensor_RMS.ino
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
UVC sensor interface.
Tar inn data fra 0-5V UVC sensor (GUVC-T21GH) og regner ut RMS. Sender ut som 0-10V via DAC og Op.Amp.
Og to digitalutganger for grenseverdier.
2020-02-26 - V1.0.2:
Minus offset, skulle det være.
2020-02-26 - V1.0.1:
Fikset bitwise and bug.
Lagt til offset spenning.
2020-09-19 - V1.0
Trond Mjåtveit Hansen
*/
//#define DEBUG
#include <Wire.h>
#define uvcpin A0 //Analogpin UVC sensor er koplet på
#define pot1 A1 //Analogpin potentiometer 1 er koplet på
#define pot2 A2 //Analogpin potentiometer 2 er koplet på
#define limit0 0.5 //Grenseverdi mW/cm2 for utgang 0
#define limit1 2.0 //Grenseverdi mW/cm2 for utgang 1
#define qlimit0 2 //Arduino pinnenummer for utgang 0
#define qlimit1 3 //Arduino pinnenummer for utgang 1
#define DACaddr B1100000 //MCP4716A0T-E DAC i2c addresse
const double voltPerBit = 5.0 / 1023.0; //5 volt er referansespenningen
const double voltPermWcm = 0.71; //UV sensorens volt per mW/cm2
const double voltOffset = 0.01; //Typisk offset spenning ifølge datablad
const unsigned int sensorOffset = 2; //0,01/5/1023 = 2,046 ADC enheter
const unsigned int sampleTime = 100; //Antall millisekunder vi tar gjennomsnittet av.
unsigned long sensorRaw; //ubehandlet signal fra UVC-sensor
unsigned long sensorTotal;
unsigned int sensorNumSamples; //Variabel for faktisk antall avlesninger
unsigned int sensorRMS; //Gjennomsnitt ADC enheter
unsigned int sensorRMSadj; //Offset trukket fra
double voltRMS; //Regnet om til spenning. (Ut fra sensor).
double mwattPerSqrCMtr; //Ferdig behandlet signal fra sensor i milliwatt/cm2
unsigned long lastTime;
void setup() {
#ifdef DEBUG
Serial.begin(9600);
#endif
pinMode(qlimit0, OUTPUT);
pinMode(qlimit1, OUTPUT);
Wire.begin();
}
void loop() {
sensorTotal = 0;
sensorNumSamples = 0;
lastTime = millis();
while (millis() - lastTime < sampleTime) {//Forsiktig med hvor lenge vi tar gjennomsnittet over.
sensorRaw = analogRead(uvcpin); //Det er bare plass til ca. 4100 maksavlesninger i en unsigned long.
//500ms risikerer å gi overflow.
sensorTotal = sensorTotal + (sensorRaw * sensorRaw);
sensorNumSamples = sensorNumSamples + 1;
}
#ifdef DEBUG
Serial.print("Samples: ");
Serial.println(sensorNumSamples);
#endif
sensorRMS = sqrt(sensorTotal / sensorNumSamples);
#ifdef DEBUG
Serial.print("RMS: ");
Serial.println(sensorRMS);
#endif
voltRMS = sensorRMS * voltPerBit;
#ifdef DEBUG
Serial.print("Volt: ");
Serial.println(voltRMS);
#endif
mwattPerSqrCMtr = (voltRMS - voltOffset) / voltPermWcm;
#ifdef DEBUG
Serial.print("Milliwatt per kvadratCM: ");
Serial.println(mwattPerSqrCMtr);
#endif
//Sjekk grenseverdier
if (limit0 < mwattPerSqrCMtr) {
digitalWrite(qlimit0, HIGH);
} else {
digitalWrite(qlimit0, LOW);
}
if (limit1 < mwattPerSqrCMtr) {
digitalWrite(qlimit1, HIGH);
} else {
digitalWrite(qlimit1, LOW);
}
sensorRMSadj = sensorRMS - sensorOffset;
//Send data til DAC
byte hibyte, lobyte;
lobyte = sensorRMSadj << 2;
hibyte = (sensorRMSadj >> 6) & B00111111;
Wire.beginTransmission(DACaddr);
Wire.write(hibyte);
Wire.write(lobyte);
Wire.endTransmission(true);
#ifdef DEBUG
Serial.print("Sensor: ");
Serial.println(sensorRMSadj, BIN);
Serial.print("Highbyte: ");
Serial.println(hibyte, BIN);
Serial.print("Lowbyte: ");
Serial.println(lobyte, BIN);
#endif
#ifdef DEBUG
delay(50);
#endif
}