Dryer timer with dew point control and 4-20mA analogue output signal

Dependencies:   mbed HYT Watchdog TextLCD Millis

Committer:
koosvanderwat
Date:
Sat Jan 23 08:10:58 2021 +0000
Revision:
4:6c83f83dde87
Parent:
3:bbd271c944a0
Update to analogue out

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 0:334327d1a416 1 #include "mbed.h"
simon 0:334327d1a416 2 #include "TextLCD.h"
koosvanderwat 3:bbd271c944a0 3 #include "HYT.h"
koosvanderwat 3:bbd271c944a0 4 #include "Watchdog.h"
koosvanderwat 3:bbd271c944a0 5 #include "millis.h"
simon 0:334327d1a416 6
koosvanderwat 3:bbd271c944a0 7 int PT = 120; // Purge time in seconds
koosvanderwat 3:bbd271c944a0 8 int RT = 60; // Repressurisation time in seconds
koosvanderwat 3:bbd271c944a0 9 float SetPoint = -3; // Dew Point Set Point
koosvanderwat 3:bbd271c944a0 10 int ClimateControl = 0; // Switch On Climate Control
koosvanderwat 3:bbd271c944a0 11 float DewPointSuppresion = 20; // Set Dew Point Suppression
koosvanderwat 3:bbd271c944a0 12
koosvanderwat 3:bbd271c944a0 13 //Watchdog
koosvanderwat 3:bbd271c944a0 14 Watchdog wd;
koosvanderwat 3:bbd271c944a0 15
koosvanderwat 3:bbd271c944a0 16 HYT SENSOR (D0,D1); //Nano (SDA,SCL) (D0,D1) (D4,D5)
koosvanderwat 3:bbd271c944a0 17 TextLCD lcd(D6, D9, D2, D3, D4, D5); // rs, e, d4-d7
koosvanderwat 3:bbd271c944a0 18
koosvanderwat 3:bbd271c944a0 19 Ticker timeKeeping;
koosvanderwat 3:bbd271c944a0 20
koosvanderwat 3:bbd271c944a0 21 DigitalOut my_RHPV(A0);
koosvanderwat 3:bbd271c944a0 22 DigitalOut my_RHMV(A1);
koosvanderwat 3:bbd271c944a0 23 DigitalOut my_RV(A2);
koosvanderwat 3:bbd271c944a0 24 DigitalOut my_LHMV(A6);
koosvanderwat 3:bbd271c944a0 25 DigitalOut my_LHPV(A7);
koosvanderwat 3:bbd271c944a0 26 DigitalOut my_led(D13);
koosvanderwat 3:bbd271c944a0 27 DigitalIn my_Dip2(D11); //Dip 2
koosvanderwat 3:bbd271c944a0 28 DigitalIn my_Dip1(D12); //Dip 1
koosvanderwat 3:bbd271c944a0 29 AnalogOut DP_Out(A3);
koosvanderwat 3:bbd271c944a0 30
koosvanderwat 3:bbd271c944a0 31 float NewSetPoint = 0;
koosvanderwat 3:bbd271c944a0 32 int CheckSensor = 1;
koosvanderwat 3:bbd271c944a0 33 unsigned long previousMillis = 0; // will store last time LED was updated
koosvanderwat 3:bbd271c944a0 34 long OnTime = 1000; // milliseconds of on-time
koosvanderwat 3:bbd271c944a0 35 int secondscounter = 0;
koosvanderwat 3:bbd271c944a0 36 int Counter = 0;
koosvanderwat 3:bbd271c944a0 37 int sensorbroken =0;
koosvanderwat 3:bbd271c944a0 38
koosvanderwat 3:bbd271c944a0 39 int LHCT = PT + RT; // LH cycle time
koosvanderwat 3:bbd271c944a0 40 int LHPT = PT + RT + PT; // LH purge time
koosvanderwat 3:bbd271c944a0 41 int CT = PT + RT + PT + RT; // Cycle Time
koosvanderwat 3:bbd271c944a0 42
koosvanderwat 3:bbd271c944a0 43 float RHValue = 0;
koosvanderwat 3:bbd271c944a0 44 float TempValue = 0;
koosvanderwat 3:bbd271c944a0 45 float A = 0;
koosvanderwat 3:bbd271c944a0 46 float DewPoint = 0;
koosvanderwat 3:bbd271c944a0 47
koosvanderwat 3:bbd271c944a0 48 int main()
koosvanderwat 3:bbd271c944a0 49 {
koosvanderwat 3:bbd271c944a0 50
koosvanderwat 3:bbd271c944a0 51 my_RHMV = 1;//0
koosvanderwat 3:bbd271c944a0 52 my_LHMV = 0;//1
koosvanderwat 3:bbd271c944a0 53 my_RHPV = 0;//1
koosvanderwat 3:bbd271c944a0 54 my_LHPV = 0;//1
koosvanderwat 3:bbd271c944a0 55 my_RHPV = 1;//0
koosvanderwat 3:bbd271c944a0 56 my_LHPV = 0;//1
koosvanderwat 3:bbd271c944a0 57 my_RV = 0;//1
koosvanderwat 3:bbd271c944a0 58
koosvanderwat 3:bbd271c944a0 59 wd.Configure(4.0);
koosvanderwat 3:bbd271c944a0 60
koosvanderwat 3:bbd271c944a0 61 wait_ms(100);
koosvanderwat 3:bbd271c944a0 62
koosvanderwat 3:bbd271c944a0 63 lcd.printf("TegnonEfficiency\n");
koosvanderwat 3:bbd271c944a0 64
koosvanderwat 3:bbd271c944a0 65 lcd.locate(0,1);
koosvanderwat 3:bbd271c944a0 66 if (ClimateControl == 1) {
koosvanderwat 3:bbd271c944a0 67 lcd.printf("Climate Control \n");
koosvanderwat 3:bbd271c944a0 68 } else {
koosvanderwat 3:bbd271c944a0 69 lcd.printf(" DP Control \n");
koosvanderwat 3:bbd271c944a0 70 }
koosvanderwat 3:bbd271c944a0 71
koosvanderwat 3:bbd271c944a0 72 wait_ms(1000);
koosvanderwat 3:bbd271c944a0 73 lcd.cls();
koosvanderwat 3:bbd271c944a0 74 lcd.printf("DP:");
koosvanderwat 3:bbd271c944a0 75 lcd.locate(9,0);
koosvanderwat 3:bbd271c944a0 76 lcd.printf("S:");
koosvanderwat 3:bbd271c944a0 77 lcd.locate(0,1);
koosvanderwat 3:bbd271c944a0 78 lcd.printf("RH:");
koosvanderwat 3:bbd271c944a0 79 lcd.locate(9,1);
koosvanderwat 3:bbd271c944a0 80 lcd.printf("T:");
koosvanderwat 3:bbd271c944a0 81
koosvanderwat 3:bbd271c944a0 82 millisStart();
koosvanderwat 3:bbd271c944a0 83
koosvanderwat 3:bbd271c944a0 84 while(1) {
koosvanderwat 3:bbd271c944a0 85 unsigned long currentMillis = millis(); // Get current time
koosvanderwat 3:bbd271c944a0 86
koosvanderwat 3:bbd271c944a0 87 if(ClimateControl == 0) {
koosvanderwat 3:bbd271c944a0 88 if(my_Dip2 ==0) {
koosvanderwat 3:bbd271c944a0 89 if(my_Dip1 ==0) {
koosvanderwat 3:bbd271c944a0 90 SetPoint = -3;
koosvanderwat 3:bbd271c944a0 91 }
koosvanderwat 3:bbd271c944a0 92 if(my_Dip1 ==1) {
koosvanderwat 3:bbd271c944a0 93 SetPoint = -20;
koosvanderwat 3:bbd271c944a0 94 }
koosvanderwat 3:bbd271c944a0 95 }
koosvanderwat 3:bbd271c944a0 96 if(my_Dip2 ==1) {
koosvanderwat 3:bbd271c944a0 97 if(my_Dip1 ==0) {
koosvanderwat 3:bbd271c944a0 98 SetPoint = -40;
koosvanderwat 3:bbd271c944a0 99 }
koosvanderwat 3:bbd271c944a0 100 if(my_Dip1 ==1) {
koosvanderwat 3:bbd271c944a0 101 SetPoint = -50;
koosvanderwat 3:bbd271c944a0 102 }
koosvanderwat 3:bbd271c944a0 103 }
koosvanderwat 3:bbd271c944a0 104 }
koosvanderwat 3:bbd271c944a0 105
koosvanderwat 3:bbd271c944a0 106 if ((currentMillis - previousMillis) >= OnTime) {
koosvanderwat 3:bbd271c944a0 107 previousMillis = currentMillis;
koosvanderwat 3:bbd271c944a0 108 wd.Service();
koosvanderwat 3:bbd271c944a0 109 my_led = !my_led;
koosvanderwat 3:bbd271c944a0 110
koosvanderwat 3:bbd271c944a0 111 secondscounter = secondscounter + 1;
koosvanderwat 3:bbd271c944a0 112 Counter = Counter + 1;
simon 0:334327d1a416 113
koosvanderwat 3:bbd271c944a0 114 if(Counter == 10) {
koosvanderwat 3:bbd271c944a0 115 lcd.cls();
koosvanderwat 3:bbd271c944a0 116 lcd.printf("DP:");
koosvanderwat 3:bbd271c944a0 117 lcd.locate(9,0);
koosvanderwat 3:bbd271c944a0 118 lcd.printf("S:");
koosvanderwat 3:bbd271c944a0 119 lcd.locate(0,1);
koosvanderwat 3:bbd271c944a0 120 lcd.printf("RH:");
koosvanderwat 3:bbd271c944a0 121 lcd.locate(9,1);
koosvanderwat 3:bbd271c944a0 122 lcd.printf("T:");
koosvanderwat 3:bbd271c944a0 123 Counter = 0;
koosvanderwat 3:bbd271c944a0 124 }
koosvanderwat 3:bbd271c944a0 125
koosvanderwat 3:bbd271c944a0 126 SENSOR.MRCommand();
koosvanderwat 3:bbd271c944a0 127 wait_ms(100);
koosvanderwat 4:6c83f83dde87 128 //SENSOR.DFCommand();
koosvanderwat 4:6c83f83dde87 129
koosvanderwat 4:6c83f83dde87 130 CheckSensor = SENSOR.DFCommand();
koosvanderwat 3:bbd271c944a0 131 RHValue = (SENSOR.humidity);
koosvanderwat 3:bbd271c944a0 132 TempValue = (SENSOR.temperature);
koosvanderwat 3:bbd271c944a0 133
koosvanderwat 4:6c83f83dde87 134 sensorbroken = 0;
koosvanderwat 4:6c83f83dde87 135
koosvanderwat 4:6c83f83dde87 136 if(CheckSensor != 0){
koosvanderwat 4:6c83f83dde87 137 sensorbroken = 1;
koosvanderwat 4:6c83f83dde87 138 }
koosvanderwat 4:6c83f83dde87 139
koosvanderwat 4:6c83f83dde87 140 //if(RHValue < 0.01) {
koosvanderwat 4:6c83f83dde87 141 // sensorbroken = 1;
koosvanderwat 4:6c83f83dde87 142 //}
koosvanderwat 3:bbd271c944a0 143
koosvanderwat 3:bbd271c944a0 144 if(TempValue < -20) {
koosvanderwat 3:bbd271c944a0 145 sensorbroken = 1;
koosvanderwat 3:bbd271c944a0 146 }
koosvanderwat 3:bbd271c944a0 147
koosvanderwat 3:bbd271c944a0 148 if(sensorbroken == 0) {
koosvanderwat 4:6c83f83dde87 149 RHValue = (SENSOR.humidity);
koosvanderwat 4:6c83f83dde87 150 TempValue = (SENSOR.temperature);
koosvanderwat 4:6c83f83dde87 151
koosvanderwat 4:6c83f83dde87 152 if (RHValue != 0){
koosvanderwat 4:6c83f83dde87 153
koosvanderwat 3:bbd271c944a0 154 A = log( RHValue * 0.01 * pow(10, 7.5*TempValue/(237.2+TempValue) ) );
koosvanderwat 3:bbd271c944a0 155 DewPoint = (23720 * A/(17.269-A))/100;
koosvanderwat 4:6c83f83dde87 156 }
koosvanderwat 4:6c83f83dde87 157
koosvanderwat 4:6c83f83dde87 158 if (RHValue == 0){
koosvanderwat 4:6c83f83dde87 159 DewPoint = -50;
koosvanderwat 4:6c83f83dde87 160 }
koosvanderwat 4:6c83f83dde87 161
koosvanderwat 4:6c83f83dde87 162 if(DewPoint > 20){
koosvanderwat 4:6c83f83dde87 163 DewPoint = 20;
koosvanderwat 4:6c83f83dde87 164 }
koosvanderwat 4:6c83f83dde87 165
koosvanderwat 4:6c83f83dde87 166 if(DewPoint < -50){
koosvanderwat 4:6c83f83dde87 167 DewPoint = -50;
koosvanderwat 4:6c83f83dde87 168 }
koosvanderwat 4:6c83f83dde87 169
koosvanderwat 3:bbd271c944a0 170
koosvanderwat 3:bbd271c944a0 171 if (ClimateControl == 1) {
koosvanderwat 3:bbd271c944a0 172 NewSetPoint = TempValue - DewPointSuppresion;
koosvanderwat 3:bbd271c944a0 173
koosvanderwat 3:bbd271c944a0 174 if ( NewSetPoint < SetPoint) {
koosvanderwat 3:bbd271c944a0 175 NewSetPoint = SetPoint;
koosvanderwat 3:bbd271c944a0 176 }
koosvanderwat 3:bbd271c944a0 177
koosvanderwat 3:bbd271c944a0 178 } else {
koosvanderwat 3:bbd271c944a0 179 NewSetPoint = SetPoint;
koosvanderwat 3:bbd271c944a0 180 }
koosvanderwat 3:bbd271c944a0 181 lcd.locate(3,0);
koosvanderwat 3:bbd271c944a0 182 lcd.printf(" ");
koosvanderwat 3:bbd271c944a0 183 lcd.locate(3,0);
koosvanderwat 3:bbd271c944a0 184 lcd.printf("%3.1f%", DewPoint);
koosvanderwat 3:bbd271c944a0 185 lcd.locate(11,0);
koosvanderwat 3:bbd271c944a0 186 lcd.printf(" ");
koosvanderwat 3:bbd271c944a0 187 lcd.locate(11,0);
koosvanderwat 3:bbd271c944a0 188 lcd.printf("%3.1f%", NewSetPoint);
koosvanderwat 3:bbd271c944a0 189 lcd.locate(3,1);
koosvanderwat 3:bbd271c944a0 190 lcd.printf(" ");
koosvanderwat 3:bbd271c944a0 191 lcd.locate(3,1);
koosvanderwat 3:bbd271c944a0 192 lcd.printf("%3.1f%", RHValue);
koosvanderwat 3:bbd271c944a0 193 lcd.locate(11,1);
koosvanderwat 3:bbd271c944a0 194 lcd.printf(" ");
koosvanderwat 3:bbd271c944a0 195 lcd.locate(11,1);
koosvanderwat 3:bbd271c944a0 196 lcd.printf("%.1f%", TempValue);
koosvanderwat 3:bbd271c944a0 197
koosvanderwat 4:6c83f83dde87 198 DP_Out = 0.0104*DewPoint + 0.702; // For dewpoint -50 to 20 with output signal 0.6V to 3V
koosvanderwat 4:6c83f83dde87 199 //DP_Out = 0.0143*DewPoint + 0.714;
koosvanderwat 4:6c83f83dde87 200
koosvanderwat 3:bbd271c944a0 201
koosvanderwat 3:bbd271c944a0 202 if ((DewPoint < NewSetPoint) && (secondscounter == LHCT)) {
koosvanderwat 3:bbd271c944a0 203 secondscounter = secondscounter - 1;
koosvanderwat 3:bbd271c944a0 204 }
koosvanderwat 3:bbd271c944a0 205
koosvanderwat 3:bbd271c944a0 206 if ((DewPoint < NewSetPoint) && (secondscounter == CT)) {
koosvanderwat 3:bbd271c944a0 207 secondscounter = secondscounter - 1;
koosvanderwat 3:bbd271c944a0 208 }
koosvanderwat 3:bbd271c944a0 209
koosvanderwat 3:bbd271c944a0 210 } else {
koosvanderwat 3:bbd271c944a0 211 lcd.locate(0,0);
koosvanderwat 3:bbd271c944a0 212 lcd.printf(" Standard ");
koosvanderwat 3:bbd271c944a0 213 lcd.locate(0,1);
koosvanderwat 3:bbd271c944a0 214 lcd.printf(" Cycle ");
koosvanderwat 3:bbd271c944a0 215 DP_Out = 0.1;
koosvanderwat 3:bbd271c944a0 216 }
koosvanderwat 3:bbd271c944a0 217 }
koosvanderwat 3:bbd271c944a0 218
koosvanderwat 3:bbd271c944a0 219 if (secondscounter < PT) {
koosvanderwat 3:bbd271c944a0 220 my_RHMV = 1;//0
koosvanderwat 3:bbd271c944a0 221 my_LHMV = 0;//1
koosvanderwat 3:bbd271c944a0 222 my_RHPV = 1;//0
koosvanderwat 3:bbd271c944a0 223 my_LHPV = 0;//1
koosvanderwat 3:bbd271c944a0 224 my_RV = 0;//1
koosvanderwat 3:bbd271c944a0 225 }
koosvanderwat 3:bbd271c944a0 226 if (secondscounter >= PT && secondscounter < LHCT) {
koosvanderwat 3:bbd271c944a0 227 my_RHMV = 1;//0
koosvanderwat 3:bbd271c944a0 228 my_LHMV = 0;//1
koosvanderwat 3:bbd271c944a0 229 my_RHPV = 0;//1
koosvanderwat 3:bbd271c944a0 230 my_LHPV = 0;//1
koosvanderwat 3:bbd271c944a0 231 my_RV = 1;//0
koosvanderwat 3:bbd271c944a0 232
koosvanderwat 3:bbd271c944a0 233 }
koosvanderwat 3:bbd271c944a0 234
koosvanderwat 3:bbd271c944a0 235 if ((secondscounter > LHCT) && (secondscounter < LHPT)) {
koosvanderwat 3:bbd271c944a0 236 my_RHMV = 0;//1
koosvanderwat 3:bbd271c944a0 237 my_LHMV = 1;//0
koosvanderwat 3:bbd271c944a0 238 my_RHPV = 0;//1
koosvanderwat 3:bbd271c944a0 239 my_LHPV = 1;//0
koosvanderwat 3:bbd271c944a0 240 my_RV = 0;//1
koosvanderwat 3:bbd271c944a0 241
koosvanderwat 3:bbd271c944a0 242 }
koosvanderwat 3:bbd271c944a0 243 if (secondscounter >= LHPT && (secondscounter < CT)) {
koosvanderwat 3:bbd271c944a0 244 my_RHMV = 0;//1
koosvanderwat 3:bbd271c944a0 245 my_LHMV = 1;//0
koosvanderwat 3:bbd271c944a0 246 my_RHPV = 0;//1
koosvanderwat 3:bbd271c944a0 247 my_LHPV = 0;//1
koosvanderwat 3:bbd271c944a0 248 my_RV = 1;//0
koosvanderwat 3:bbd271c944a0 249
koosvanderwat 3:bbd271c944a0 250 }
koosvanderwat 3:bbd271c944a0 251
koosvanderwat 3:bbd271c944a0 252 if (secondscounter == (CT + 1)) {
koosvanderwat 3:bbd271c944a0 253 secondscounter = 0;
koosvanderwat 3:bbd271c944a0 254 }
koosvanderwat 3:bbd271c944a0 255 } // While(1)
koosvanderwat 3:bbd271c944a0 256 } //Void Main