Nevera de Pollos

Dependencies:   mbed DHT

Committer:
junmorenodi
Date:
Thu Jul 11 14:50:05 2019 +0000
Revision:
0:55cf71308e50
qwerty

Who changed what in which revision?

UserRevisionLine numberNew contents of line
junmorenodi 0:55cf71308e50 1 /* Electronica Digital II
junmorenodi 0:55cf71308e50 2 * Universidad Nacional de Colombia
junmorenodi 0:55cf71308e50 3 * Carlos Andrés Martínez Ríos
junmorenodi 0:55cf71308e50 4 * Nicold Michell Peña
junmorenodi 0:55cf71308e50 5 * Juan Camilo Ramirez
junmorenodi 0:55cf71308e50 6 * Gabriel Martinez
junmorenodi 0:55cf71308e50 7 * Nicolas Moreno
junmorenodi 0:55cf71308e50 8 */
junmorenodi 0:55cf71308e50 9
junmorenodi 0:55cf71308e50 10
junmorenodi 0:55cf71308e50 11 #include "mbed.h"
junmorenodi 0:55cf71308e50 12 #include <stdint.h>
junmorenodi 0:55cf71308e50 13 #include "DHT.h"
junmorenodi 0:55cf71308e50 14 #include <math.h>
junmorenodi 0:55cf71308e50 15
junmorenodi 0:55cf71308e50 16 // ==================================================================
junmorenodi 0:55cf71308e50 17 // Instanciando variables globales
junmorenodi 0:55cf71308e50 18 // ==================================================================
junmorenodi 0:55cf71308e50 19
junmorenodi 0:55cf71308e50 20 typedef struct {
junmorenodi 0:55cf71308e50 21 double setTemp; //temperature to reach.
junmorenodi 0:55cf71308e50 22 float setHum; //humidity to reach.
junmorenodi 0:55cf71308e50 23 float Temp; //temperature
junmorenodi 0:55cf71308e50 24 float LM35Temp; //LM35 Temperature
junmorenodi 0:55cf71308e50 25 float Hum; //humidity
junmorenodi 0:55cf71308e50 26 float Co2; // CO2
junmorenodi 0:55cf71308e50 27 // double state; //State
junmorenodi 0:55cf71308e50 28 } _attribute_ ((packed)) Tsetting;
junmorenodi 0:55cf71308e50 29
junmorenodi 0:55cf71308e50 30 Tsetting status;
junmorenodi 0:55cf71308e50 31
junmorenodi 0:55cf71308e50 32 // ==================================================================
junmorenodi 0:55cf71308e50 33 // Instanciando estructuras e indicadores
junmorenodi 0:55cf71308e50 34 // ==================================================================
junmorenodi 0:55cf71308e50 35
junmorenodi 0:55cf71308e50 36 DHT dht22(A2,DHT22);
junmorenodi 0:55cf71308e50 37
junmorenodi 0:55cf71308e50 38 DigitalOut led1(LED1); //Indicator less 25*
junmorenodi 0:55cf71308e50 39 DigitalOut led2(LED2); //Indicator more 25*
junmorenodi 0:55cf71308e50 40 DigitalOut led3(LED3); //Indicator more 80% hum
junmorenodi 0:55cf71308e50 41 DigitalOut peltier1(D0); //Peltier 1
junmorenodi 0:55cf71308e50 42 DigitalOut peltier2(D1); //Peltier 2
junmorenodi 0:55cf71308e50 43 //01 -> Caliente 10-> Enfrie
junmorenodi 0:55cf71308e50 44 AnalogIn LM35(A3); // LM35
junmorenodi 0:55cf71308e50 45 AnalogIn MQ135(A1); //MQ135
junmorenodi 0:55cf71308e50 46 DigitalOut humidifier(D2); // Humidifier
junmorenodi 0:55cf71308e50 47 DigitalOut humidifierFan(D3); // Humidifier Fan
junmorenodi 0:55cf71308e50 48
junmorenodi 0:55cf71308e50 49 // ==================================================================
junmorenodi 0:55cf71308e50 50 // Instanciando SPIO y SerialPC
junmorenodi 0:55cf71308e50 51 // ==================================================================
junmorenodi 0:55cf71308e50 52
junmorenodi 0:55cf71308e50 53 SPI spi(PB_5, PB_4, PB_3); // mosi, miso, sclk
junmorenodi 0:55cf71308e50 54 DigitalOut arduinoMega(PA_4); //Slave Selecter: Arduino Mega
junmorenodi 0:55cf71308e50 55
junmorenodi 0:55cf71308e50 56 Serial pc(USBTX, USBRX, 9600); // tx, rx, baud
junmorenodi 0:55cf71308e50 57
junmorenodi 0:55cf71308e50 58 // ==================================================================
junmorenodi 0:55cf71308e50 59 // ========================= MAIN =============================
junmorenodi 0:55cf71308e50 60 // ==================================================================
junmorenodi 0:55cf71308e50 61
junmorenodi 0:55cf71308e50 62 int main() {
junmorenodi 0:55cf71308e50 63 // ==================================================================
junmorenodi 0:55cf71308e50 64 // Instanciando variables iniciales
junmorenodi 0:55cf71308e50 65 // ==================================================================
junmorenodi 0:55cf71308e50 66 // status.state = 0;
junmorenodi 0:55cf71308e50 67 led1=0;
junmorenodi 0:55cf71308e50 68 led2=0;
junmorenodi 0:55cf71308e50 69 led3=0;
junmorenodi 0:55cf71308e50 70 peltier1 = 0;
junmorenodi 0:55cf71308e50 71 peltier2 = 0;
junmorenodi 0:55cf71308e50 72 humidifier = 0;
junmorenodi 0:55cf71308e50 73 humidifierFan = 0;
junmorenodi 0:55cf71308e50 74
junmorenodi 0:55cf71308e50 75
junmorenodi 0:55cf71308e50 76 int selEnv = 0;
junmorenodi 0:55cf71308e50 77 int valEnv = 0;
junmorenodi 0:55cf71308e50 78
junmorenodi 0:55cf71308e50 79 int lineCounter = 1;
junmorenodi 0:55cf71308e50 80
junmorenodi 0:55cf71308e50 81 float tempCLM35,arrayLM35[10];
junmorenodi 0:55cf71308e50 82 double avgLM35,tempCo2;
junmorenodi 0:55cf71308e50 83 // float tempFLM35;
junmorenodi 0:55cf71308e50 84 int lm35Counter = 1;
junmorenodi 0:55cf71308e50 85
junmorenodi 0:55cf71308e50 86 // ==================================================================
junmorenodi 0:55cf71308e50 87 // SPIO Config
junmorenodi 0:55cf71308e50 88 // ==================================================================
junmorenodi 0:55cf71308e50 89
junmorenodi 0:55cf71308e50 90 spi.format(8,3); // Setup: bit data, SPImode3
junmorenodi 0:55cf71308e50 91 spi.frequency(1000000); //1MHz
junmorenodi 0:55cf71308e50 92
junmorenodi 0:55cf71308e50 93 // ==================================================================
junmorenodi 0:55cf71308e50 94 // Default State
junmorenodi 0:55cf71308e50 95 // ==================================================================
junmorenodi 0:55cf71308e50 96
junmorenodi 0:55cf71308e50 97 status.setTemp = 25;
junmorenodi 0:55cf71308e50 98 status.setHum = 85;
junmorenodi 0:55cf71308e50 99
junmorenodi 0:55cf71308e50 100
junmorenodi 0:55cf71308e50 101 // Case0:
junmorenodi 0:55cf71308e50 102 // ==================================================================
junmorenodi 0:55cf71308e50 103 // Initialize
junmorenodi 0:55cf71308e50 104 // ==================================================================
junmorenodi 0:55cf71308e50 105
junmorenodi 0:55cf71308e50 106 pc.printf("============= Climate Box V.2. ==================\r\n");
junmorenodi 0:55cf71308e50 107 pc.printf("Press any key to start...\r\n");
junmorenodi 0:55cf71308e50 108 pc.getc(); // wait for keyboard
junmorenodi 0:55cf71308e50 109 // goto Case1;
junmorenodi 0:55cf71308e50 110
junmorenodi 0:55cf71308e50 111 // ==================================================================
junmorenodi 0:55cf71308e50 112 // ========================= LOOP =============================
junmorenodi 0:55cf71308e50 113 // ==================================================================
junmorenodi 0:55cf71308e50 114
junmorenodi 0:55cf71308e50 115 while (1) {
junmorenodi 0:55cf71308e50 116 // status.state = 1;
junmorenodi 0:55cf71308e50 117 // Case1:
junmorenodi 0:55cf71308e50 118
junmorenodi 0:55cf71308e50 119 // =======================================================
junmorenodi 0:55cf71308e50 120 // Control
junmorenodi 0:55cf71308e50 121 // =======================================================
junmorenodi 0:55cf71308e50 122
junmorenodi 0:55cf71308e50 123 int pel1,pel2,hum1,hum2;
junmorenodi 0:55cf71308e50 124
junmorenodi 0:55cf71308e50 125 if (status.LM35Temp<status.setTemp-0.5) {
junmorenodi 0:55cf71308e50 126 peltier1 = 0;
junmorenodi 0:55cf71308e50 127 pel1=0;
junmorenodi 0:55cf71308e50 128 peltier2 = 1;
junmorenodi 0:55cf71308e50 129 pel2=1;
junmorenodi 0:55cf71308e50 130 }
junmorenodi 0:55cf71308e50 131
junmorenodi 0:55cf71308e50 132 if (status.LM35Temp>status.setTemp+0.5) {
junmorenodi 0:55cf71308e50 133 peltier1 = 1;
junmorenodi 0:55cf71308e50 134 pel1=1;
junmorenodi 0:55cf71308e50 135 peltier2 = 0;
junmorenodi 0:55cf71308e50 136 pel2=0;
junmorenodi 0:55cf71308e50 137 }
junmorenodi 0:55cf71308e50 138
junmorenodi 0:55cf71308e50 139 if (status.LM35Temp<status.setTemp+0.5 && status.LM35Temp>status.setTemp-0.5) {
junmorenodi 0:55cf71308e50 140 peltier1 = 0;
junmorenodi 0:55cf71308e50 141 pel1=0;
junmorenodi 0:55cf71308e50 142 peltier2 = 0;
junmorenodi 0:55cf71308e50 143 pel2=0;
junmorenodi 0:55cf71308e50 144 }
junmorenodi 0:55cf71308e50 145
junmorenodi 0:55cf71308e50 146
junmorenodi 0:55cf71308e50 147 if (status.Hum<status.setHum-3) {
junmorenodi 0:55cf71308e50 148 humidifier = 1;
junmorenodi 0:55cf71308e50 149 hum1=1;
junmorenodi 0:55cf71308e50 150 humidifierFan = 0;
junmorenodi 0:55cf71308e50 151 hum2=0;
junmorenodi 0:55cf71308e50 152 }
junmorenodi 0:55cf71308e50 153
junmorenodi 0:55cf71308e50 154 if (status.Hum>status.setHum+3) {
junmorenodi 0:55cf71308e50 155 humidifier = 0;
junmorenodi 0:55cf71308e50 156 hum1=0;
junmorenodi 0:55cf71308e50 157 humidifierFan = 1;
junmorenodi 0:55cf71308e50 158 hum2=1;
junmorenodi 0:55cf71308e50 159 }
junmorenodi 0:55cf71308e50 160
junmorenodi 0:55cf71308e50 161 if (status.Hum<status.setHum+3 && status.Hum>status.setHum-3) {
junmorenodi 0:55cf71308e50 162 humidifier = 0;
junmorenodi 0:55cf71308e50 163 hum1=0;
junmorenodi 0:55cf71308e50 164 humidifierFan = 0;
junmorenodi 0:55cf71308e50 165 hum2=0;
junmorenodi 0:55cf71308e50 166 }
junmorenodi 0:55cf71308e50 167
junmorenodi 0:55cf71308e50 168 // ==================================================================
junmorenodi 0:55cf71308e50 169 // SPIO Comunication
junmorenodi 0:55cf71308e50 170 // ==================================================================
junmorenodi 0:55cf71308e50 171
junmorenodi 0:55cf71308e50 172 if (selEnv==0){
junmorenodi 0:55cf71308e50 173 valEnv=status.Co2/10;
junmorenodi 0:55cf71308e50 174 }
junmorenodi 0:55cf71308e50 175 if (selEnv==1){
junmorenodi 0:55cf71308e50 176 valEnv=100+status.Hum;
junmorenodi 0:55cf71308e50 177 }
junmorenodi 0:55cf71308e50 178 if (selEnv==2){
junmorenodi 0:55cf71308e50 179 valEnv=200+status.LM35Temp;
junmorenodi 0:55cf71308e50 180 }
junmorenodi 0:55cf71308e50 181
junmorenodi 0:55cf71308e50 182
junmorenodi 0:55cf71308e50 183 arduinoMega = 0; // Select device
junmorenodi 0:55cf71308e50 184 float dataFromSlave = spi.write(valEnv);
junmorenodi 0:55cf71308e50 185 arduinoMega = 1; // Deselect device
junmorenodi 0:55cf71308e50 186
junmorenodi 0:55cf71308e50 187 selEnv++;
junmorenodi 0:55cf71308e50 188
junmorenodi 0:55cf71308e50 189 if (selEnv==3){
junmorenodi 0:55cf71308e50 190 selEnv=0;
junmorenodi 0:55cf71308e50 191 }
junmorenodi 0:55cf71308e50 192
junmorenodi 0:55cf71308e50 193 pc.printf("Peltier %d y %d, Humidificador %d y %d\r\n", pel1,pel2,hum1,hum2);
junmorenodi 0:55cf71308e50 194 pc.printf("Arduino returns %.2f\r\n\n", dataFromSlave);
junmorenodi 0:55cf71308e50 195
junmorenodi 0:55cf71308e50 196 // wait_ms(500); // Frecuency of data transfer in ms
junmorenodi 0:55cf71308e50 197
junmorenodi 0:55cf71308e50 198 wait_ms(180);
junmorenodi 0:55cf71308e50 199
junmorenodi 0:55cf71308e50 200 // ==================================================================
junmorenodi 0:55cf71308e50 201 // DHT22
junmorenodi 0:55cf71308e50 202 // ==================================================================
junmorenodi 0:55cf71308e50 203 int err = dht22.readData();
junmorenodi 0:55cf71308e50 204 if (err==0) {
junmorenodi 0:55cf71308e50 205 status.Temp=dht22.ReadTemperature(CELCIUS);
junmorenodi 0:55cf71308e50 206 status.Hum =dht22.ReadHumidity();
junmorenodi 0:55cf71308e50 207 }
junmorenodi 0:55cf71308e50 208
junmorenodi 0:55cf71308e50 209 // ==================================================================
junmorenodi 0:55cf71308e50 210 // LM35
junmorenodi 0:55cf71308e50 211 // ==================================================================
junmorenodi 0:55cf71308e50 212 // LM35:
junmorenodi 0:55cf71308e50 213 avgLM35 = 0;
junmorenodi 0:55cf71308e50 214 for(lm35Counter = 0;lm35Counter<10;lm35Counter++) {
junmorenodi 0:55cf71308e50 215 arrayLM35[lm35Counter]=LM35.read();
junmorenodi 0:55cf71308e50 216 wait(.02);
junmorenodi 0:55cf71308e50 217 }
junmorenodi 0:55cf71308e50 218 for(lm35Counter = 0;lm35Counter<10;lm35Counter++) {
junmorenodi 0:55cf71308e50 219 avgLM35 = avgLM35 + (arrayLM35[lm35Counter]/10);
junmorenodi 0:55cf71308e50 220 }
junmorenodi 0:55cf71308e50 221
junmorenodi 0:55cf71308e50 222
junmorenodi 0:55cf71308e50 223 tempCLM35 = (avgLM35*3.685503686*100);
junmorenodi 0:55cf71308e50 224 // tempFLM35 = (9.0*tempCLM35)/5.0 + 32.0;
junmorenodi 0:55cf71308e50 225
junmorenodi 0:55cf71308e50 226 status.LM35Temp = tempCLM35;
junmorenodi 0:55cf71308e50 227 // wait(.5);
junmorenodi 0:55cf71308e50 228
junmorenodi 0:55cf71308e50 229 // ==================================================================
junmorenodi 0:55cf71308e50 230 // MQ135
junmorenodi 0:55cf71308e50 231 // ==================================================================
junmorenodi 0:55cf71308e50 232
junmorenodi 0:55cf71308e50 233 tempCo2 = MQ135.read();
junmorenodi 0:55cf71308e50 234 tempCo2=tempCo2*4.9/1023;
junmorenodi 0:55cf71308e50 235 tempCo2=(4.9-tempCo2)/tempCo2;
junmorenodi 0:55cf71308e50 236 tempCo2=pow(tempCo2,-0.112);
junmorenodi 0:55cf71308e50 237 status.Co2=2.2*537.2*tempCo2;
junmorenodi 0:55cf71308e50 238
junmorenodi 0:55cf71308e50 239 // ==================================================================
junmorenodi 0:55cf71308e50 240 // Temperatura y humedad en pantalla
junmorenodi 0:55cf71308e50 241 // ==================================================================
junmorenodi 0:55cf71308e50 242
junmorenodi 0:55cf71308e50 243 if (dataFromSlave==11) {
junmorenodi 0:55cf71308e50 244 status.setTemp=status.setTemp+1;
junmorenodi 0:55cf71308e50 245 }
junmorenodi 0:55cf71308e50 246 if (dataFromSlave==12) {
junmorenodi 0:55cf71308e50 247 status.setTemp=status.setTemp-1;
junmorenodi 0:55cf71308e50 248 }
junmorenodi 0:55cf71308e50 249 if (dataFromSlave==21) {
junmorenodi 0:55cf71308e50 250 status.setHum=status.setHum+1;
junmorenodi 0:55cf71308e50 251 }
junmorenodi 0:55cf71308e50 252 if (dataFromSlave==22) {
junmorenodi 0:55cf71308e50 253 status.setHum=status.setHum-1;
junmorenodi 0:55cf71308e50 254 }
junmorenodi 0:55cf71308e50 255
junmorenodi 0:55cf71308e50 256 // ==================================================================
junmorenodi 0:55cf71308e50 257 // Serial Monitor Printer
junmorenodi 0:55cf71308e50 258 // ==================================================================
junmorenodi 0:55cf71308e50 259
junmorenodi 0:55cf71308e50 260 pc.printf("%d DHT Co2 = %.2f C, DHT Hum = %.2f , LM35 Temp = %.2f C \n", lineCounter++, status.Co2, status.Hum, status.LM35Temp);
junmorenodi 0:55cf71308e50 261 pc.printf("SetTemp = %f C, SetHum = %f \n", status.setTemp, status.setHum);
junmorenodi 0:55cf71308e50 262
junmorenodi 0:55cf71308e50 263 // ==================================================================
junmorenodi 0:55cf71308e50 264 // Indicators
junmorenodi 0:55cf71308e50 265 // ==================================================================
junmorenodi 0:55cf71308e50 266
junmorenodi 0:55cf71308e50 267 // Led indicators DHT22
junmorenodi 0:55cf71308e50 268 if (status.Temp < 25){
junmorenodi 0:55cf71308e50 269 led1=1;
junmorenodi 0:55cf71308e50 270 led2=0;
junmorenodi 0:55cf71308e50 271 } else {
junmorenodi 0:55cf71308e50 272 led2=1;
junmorenodi 0:55cf71308e50 273 led1=0;
junmorenodi 0:55cf71308e50 274 }
junmorenodi 0:55cf71308e50 275 if (status.Hum > 80) {
junmorenodi 0:55cf71308e50 276 led3=1;
junmorenodi 0:55cf71308e50 277 } else {
junmorenodi 0:55cf71308e50 278 led3=0;
junmorenodi 0:55cf71308e50 279 }
junmorenodi 0:55cf71308e50 280
junmorenodi 0:55cf71308e50 281 // int input = pc.getc();
junmorenodi 0:55cf71308e50 282
junmorenodi 0:55cf71308e50 283 // if (input == 2) {
junmorenodi 0:55cf71308e50 284 // status.state = 2;
junmorenodi 0:55cf71308e50 285 // goto Case2;
junmorenodi 0:55cf71308e50 286 // }
junmorenodi 0:55cf71308e50 287
junmorenodi 0:55cf71308e50 288 // Case2:
junmorenodi 0:55cf71308e50 289
junmorenodi 0:55cf71308e50 290 // ==================================================================
junmorenodi 0:55cf71308e50 291 // Input State
junmorenodi 0:55cf71308e50 292 // ==================================================================
junmorenodi 0:55cf71308e50 293 // status.state = 3;
junmorenodi 0:55cf71308e50 294 // goto Case3;
junmorenodi 0:55cf71308e50 295
junmorenodi 0:55cf71308e50 296 // Case3:
junmorenodi 0:55cf71308e50 297
junmorenodi 0:55cf71308e50 298 // ==================================================================
junmorenodi 0:55cf71308e50 299 // Control State
junmorenodi 0:55cf71308e50 300 // ==================================================================
junmorenodi 0:55cf71308e50 301 // status.state = 2;
junmorenodi 0:55cf71308e50 302 // goto Case2;
junmorenodi 0:55cf71308e50 303
junmorenodi 0:55cf71308e50 304 // ==========================================================================================================================================
junmorenodi 0:55cf71308e50 305 // ==================================================================
junmorenodi 0:55cf71308e50 306 // Data concatenation
junmorenodi 0:55cf71308e50 307 // ==================================================================
junmorenodi 0:55cf71308e50 308
junmorenodi 0:55cf71308e50 309
junmorenodi 0:55cf71308e50 310 } // While (1)
junmorenodi 0:55cf71308e50 311 } // Main