JOEL CONTRERAS
/
CO2_sensor_launch3jul
GAS Joel
main.cpp@0:1593910d3520, 2018-06-28 (annotated)
- Committer:
- JCON
- Date:
- Thu Jun 28 20:24:07 2018 +0000
- Revision:
- 0:1593910d3520
GAS
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JCON | 0:1593910d3520 | 1 | #include "mbed.h" //Se declara la librería mbed. |
JCON | 0:1593910d3520 | 2 | #include "rtos.h" |
JCON | 0:1593910d3520 | 3 | #include <string> |
JCON | 0:1593910d3520 | 4 | |
JCON | 0:1593910d3520 | 5 | DigitalOut led1(LED1); |
JCON | 0:1593910d3520 | 6 | DigitalOut led2(LED2); |
JCON | 0:1593910d3520 | 7 | DigitalOut led3(LED3); |
JCON | 0:1593910d3520 | 8 | DigitalOut led4(LED4); |
JCON | 0:1593910d3520 | 9 | Serial pc(USBTX, USBRX, 9600); // tx, rx Conunicación Serial con la PC |
JCON | 0:1593910d3520 | 10 | DigitalIn CTS(p7, PullUp); // Pin Digital de entrada "CTS" en modo Pull-Up, para encontrarse normalmente a VCC cuando no haya un pulso. |
JCON | 0:1593910d3520 | 11 | DigitalOut RTS(p8, 1); // Pin Digital de Salida "RTS"; Predefinido para valer 1 en su estado inactivo dentro del código. |
JCON | 0:1593910d3520 | 12 | Serial device(p9, p10, 9600); // tx, rx Comunicación Serial con el Módulo STX3 |
JCON | 0:1593910d3520 | 13 | int flag=1; // Declaración de la Bandera. |
JCON | 0:1593910d3520 | 14 | int incomingByte=0; |
JCON | 0:1593910d3520 | 15 | Thread thread; |
JCON | 0:1593910d3520 | 16 | AnalogIn ain(p20); |
JCON | 0:1593910d3520 | 17 | void waitCTS(); |
JCON | 0:1593910d3520 | 18 | |
JCON | 0:1593910d3520 | 19 | uint16_t ModRTU_CRC(char * buf, int len) |
JCON | 0:1593910d3520 | 20 | { |
JCON | 0:1593910d3520 | 21 | unsigned char i; |
JCON | 0:1593910d3520 | 22 | unsigned short data; |
JCON | 0:1593910d3520 | 23 | uint16_t crc = 0xFFFF; |
JCON | 0:1593910d3520 | 24 | |
JCON | 0:1593910d3520 | 25 | do{ |
JCON | 0:1593910d3520 | 26 | data = (unsigned int)0x00FF & *buf++; |
JCON | 0:1593910d3520 | 27 | crc = crc ^ data; |
JCON | 0:1593910d3520 | 28 | |
JCON | 0:1593910d3520 | 29 | for(i = 8; i > 0; i--) |
JCON | 0:1593910d3520 | 30 | { |
JCON | 0:1593910d3520 | 31 | if(crc & 0x0001) |
JCON | 0:1593910d3520 | 32 | crc = (crc >> 1) ^ 0x8408; |
JCON | 0:1593910d3520 | 33 | else |
JCON | 0:1593910d3520 | 34 | crc >>=1; |
JCON | 0:1593910d3520 | 35 | } |
JCON | 0:1593910d3520 | 36 | |
JCON | 0:1593910d3520 | 37 | }while (--len); |
JCON | 0:1593910d3520 | 38 | |
JCON | 0:1593910d3520 | 39 | crc = ~crc; |
JCON | 0:1593910d3520 | 40 | |
JCON | 0:1593910d3520 | 41 | // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes) |
JCON | 0:1593910d3520 | 42 | return (crc); |
JCON | 0:1593910d3520 | 43 | } |
JCON | 0:1593910d3520 | 44 | |
JCON | 0:1593910d3520 | 45 | |
JCON | 0:1593910d3520 | 46 | void respuesta(){ |
JCON | 0:1593910d3520 | 47 | while(1){ |
JCON | 0:1593910d3520 | 48 | if(device.readable()) { // Se esperan datos provenientes del TX del módulo STX3 |
JCON | 0:1593910d3520 | 49 | incomingByte=device.getc(); |
JCON | 0:1593910d3520 | 50 | //pc.putc(num); |
JCON | 0:1593910d3520 | 51 | pc.printf("%X",incomingByte); |
JCON | 0:1593910d3520 | 52 | pc.printf(" "); |
JCON | 0:1593910d3520 | 53 | // pc.putc(device.getc()); // Se muestra en pantalla la respuesta recibida por el módulo STX3 como una reacción al mensaje en HEX enviado |
JCON | 0:1593910d3520 | 54 | } |
JCON | 0:1593910d3520 | 55 | } |
JCON | 0:1593910d3520 | 56 | } |
JCON | 0:1593910d3520 | 57 | |
JCON | 0:1593910d3520 | 58 | void stx3() |
JCON | 0:1593910d3520 | 59 | { |
JCON | 0:1593910d3520 | 60 | Thread::wait(200); // Se da un tiempo para que el analizador se estabilice |
JCON | 0:1593910d3520 | 61 | incomingByte=0; |
JCON | 0:1593910d3520 | 62 | pc.printf("El valor de CTS es %d\n\r",CTS.read()); // Se lee el valor de la variable CTS, la cual debe ser 1 |
JCON | 0:1593910d3520 | 63 | pc.printf("El valor de RTS es %d\n\r",RTS.read()); // Se lee el valor de la variable RTS, la cual debe ser 1 |
JCON | 0:1593910d3520 | 64 | RTS=0; // Se manda un pulso en bajo en RTS, para inicial el proceso de transmisión |
JCON | 0:1593910d3520 | 65 | while(flag==1){ // Flag inicialmente vale 1, así que el ciclo while cambiará hasta que esa condición no se cumpla |
JCON | 0:1593910d3520 | 66 | flag=CTS.read(); // Cuando entra el ciclo, se iguala flag a CTS, el cual cuando cambie a 0 provocará que termine el while (máx 125 ms) |
JCON | 0:1593910d3520 | 67 | pc.printf("El valor de flag es %d\n\r", flag); // Se imprime el valor de flag, para identificar cuando termina el ciclo while |
JCON | 0:1593910d3520 | 68 | } |
JCON | 0:1593910d3520 | 69 | } |
JCON | 0:1593910d3520 | 70 | |
JCON | 0:1593910d3520 | 71 | int main() { |
JCON | 0:1593910d3520 | 72 | thread.start(respuesta); |
JCON | 0:1593910d3520 | 73 | |
JCON | 0:1593910d3520 | 74 | while(1) { |
JCON | 0:1593910d3520 | 75 | |
JCON | 0:1593910d3520 | 76 | float voltage = 3300*ain.read(); |
JCON | 0:1593910d3520 | 77 | |
JCON | 0:1593910d3520 | 78 | if(voltage == 0) |
JCON | 0:1593910d3520 | 79 | { |
JCON | 0:1593910d3520 | 80 | printf("Fault"); |
JCON | 0:1593910d3520 | 81 | } |
JCON | 0:1593910d3520 | 82 | else if(voltage < 400) |
JCON | 0:1593910d3520 | 83 | { |
JCON | 0:1593910d3520 | 84 | printf("preheating"); |
JCON | 0:1593910d3520 | 85 | } |
JCON | 0:1593910d3520 | 86 | |
JCON | 0:1593910d3520 | 87 | else |
JCON | 0:1593910d3520 | 88 | { |
JCON | 0:1593910d3520 | 89 | int voltage_diference=voltage-400; |
JCON | 0:1593910d3520 | 90 | int c=voltage_diference*50.0/16.0; |
JCON | 0:1593910d3520 | 91 | |
JCON | 0:1593910d3520 | 92 | printf("voltage es: %f mV \n", voltage); |
JCON | 0:1593910d3520 | 93 | |
JCON | 0:1593910d3520 | 94 | printf("concentracion de C02 en ppm es: %X \n", c); |
JCON | 0:1593910d3520 | 95 | |
JCON | 0:1593910d3520 | 96 | stx3(); |
JCON | 0:1593910d3520 | 97 | int number = 5; |
JCON | 0:1593910d3520 | 98 | printf("%d\n",number); |
JCON | 0:1593910d3520 | 99 | char header[3] = {0xAA,0x07,0x00}; //Define header information |
JCON | 0:1593910d3520 | 100 | char vec[number]; |
JCON | 0:1593910d3520 | 101 | uint8_t c1=c; |
JCON | 0:1593910d3520 | 102 | uint8_t c2=c>>8; |
JCON | 0:1593910d3520 | 103 | |
JCON | 0:1593910d3520 | 104 | |
JCON | 0:1593910d3520 | 105 | |
JCON | 0:1593910d3520 | 106 | for(int k = 0; k < 3; k++) |
JCON | 0:1593910d3520 | 107 | vec[k] = header[k]; |
JCON | 0:1593910d3520 | 108 | |
JCON | 0:1593910d3520 | 109 | vec[3] =c2; |
JCON | 0:1593910d3520 | 110 | vec[4] =c1; |
JCON | 0:1593910d3520 | 111 | |
JCON | 0:1593910d3520 | 112 | |
JCON | 0:1593910d3520 | 113 | |
JCON | 0:1593910d3520 | 114 | |
JCON | 0:1593910d3520 | 115 | pc.printf("Command(HEX):\t\t"); |
JCON | 0:1593910d3520 | 116 | //Print b characters in HEX |
JCON | 0:1593910d3520 | 117 | for(int k = 0; k < number; k++) |
JCON | 0:1593910d3520 | 118 | pc.printf("%X ",vec[k]); |
JCON | 0:1593910d3520 | 119 | |
JCON | 0:1593910d3520 | 120 | char *t = (char *)vec; //a |
JCON | 0:1593910d3520 | 121 | char crc1 = ModRTU_CRC(t,t[1]-2)&0xFF; |
JCON | 0:1593910d3520 | 122 | char crc2 = ModRTU_CRC(t,t[1]-2)>>8; |
JCON | 0:1593910d3520 | 123 | |
JCON | 0:1593910d3520 | 124 | pc.printf("%X ",crc1); //%X print char in HEX format |
JCON | 0:1593910d3520 | 125 | pc.printf("%X ",crc2); //%X print char in HEX format |
JCON | 0:1593910d3520 | 126 | |
JCON | 0:1593910d3520 | 127 | for(int k = 0; k < number; k++) |
JCON | 0:1593910d3520 | 128 | device.putc(vec[k]); |
JCON | 0:1593910d3520 | 129 | device.putc(crc1); |
JCON | 0:1593910d3520 | 130 | device.putc(crc2); |
JCON | 0:1593910d3520 | 131 | |
JCON | 0:1593910d3520 | 132 | Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones |
JCON | 0:1593910d3520 | 133 | //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión |
JCON | 0:1593910d3520 | 134 | RTS=1; |
JCON | 0:1593910d3520 | 135 | Thread::wait(150); |
JCON | 0:1593910d3520 | 136 | pc.printf("\n\rCTS: %d\n\r",CTS.read()); |
JCON | 0:1593910d3520 | 137 | flag=1; |
JCON | 0:1593910d3520 | 138 | |
JCON | 0:1593910d3520 | 139 | |
JCON | 0:1593910d3520 | 140 | |
JCON | 0:1593910d3520 | 141 | } |
JCON | 0:1593910d3520 | 142 | wait(1); |
JCON | 0:1593910d3520 | 143 | |
JCON | 0:1593910d3520 | 144 | switch (pc.getc()) |
JCON | 0:1593910d3520 | 145 | { |
JCON | 0:1593910d3520 | 146 | case '1': |
JCON | 0:1593910d3520 | 147 | { |
JCON | 0:1593910d3520 | 148 | led1=!led1; |
JCON | 0:1593910d3520 | 149 | pc.printf("\n\rQuery ESN AA 05 01 50 D5\n\r"); |
JCON | 0:1593910d3520 | 150 | stx3(); |
JCON | 0:1593910d3520 | 151 | Thread::wait(10); // Query ESN |
JCON | 0:1593910d3520 | 152 | device.putc(0XAA); |
JCON | 0:1593910d3520 | 153 | device.putc(0X05); |
JCON | 0:1593910d3520 | 154 | device.putc(0X01); |
JCON | 0:1593910d3520 | 155 | device.putc(0X50); |
JCON | 0:1593910d3520 | 156 | device.putc(0XD5); |
JCON | 0:1593910d3520 | 157 | Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones |
JCON | 0:1593910d3520 | 158 | //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión |
JCON | 0:1593910d3520 | 159 | RTS=1; |
JCON | 0:1593910d3520 | 160 | Thread::wait(150); |
JCON | 0:1593910d3520 | 161 | pc.printf("\n\rCTS: %d\n\r",CTS.read()); |
JCON | 0:1593910d3520 | 162 | flag=1; |
JCON | 0:1593910d3520 | 163 | } |
JCON | 0:1593910d3520 | 164 | break; |
JCON | 0:1593910d3520 | 165 | |
JCON | 0:1593910d3520 | 166 | case '2': |
JCON | 0:1593910d3520 | 167 | { |
JCON | 0:1593910d3520 | 168 | led4=!led4; |
JCON | 0:1593910d3520 | 169 | pc.printf("\n\rQuery SETUP AA 05 07 66 B0\n\r"); |
JCON | 0:1593910d3520 | 170 | stx3(); |
JCON | 0:1593910d3520 | 171 | Thread::wait(10); // Query SETUP |
JCON | 0:1593910d3520 | 172 | device.putc(0XAA); |
JCON | 0:1593910d3520 | 173 | device.putc(0X05); |
JCON | 0:1593910d3520 | 174 | device.putc(0X07); |
JCON | 0:1593910d3520 | 175 | device.putc(0X66); |
JCON | 0:1593910d3520 | 176 | device.putc(0XB0); |
JCON | 0:1593910d3520 | 177 | Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones |
JCON | 0:1593910d3520 | 178 | //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión |
JCON | 0:1593910d3520 | 179 | RTS=1; |
JCON | 0:1593910d3520 | 180 | Thread::wait(150); |
JCON | 0:1593910d3520 | 181 | pc.printf("\n\rCTS: %d\n\r",CTS.read()); |
JCON | 0:1593910d3520 | 182 | flag=1; |
JCON | 0:1593910d3520 | 183 | } |
JCON | 0:1593910d3520 | 184 | break; |
JCON | 0:1593910d3520 | 185 | |
JCON | 0:1593910d3520 | 186 | case '3': |
JCON | 0:1593910d3520 | 187 | { |
JCON | 0:1593910d3520 | 188 | led3=!led3; |
JCON | 0:1593910d3520 | 189 | pc.printf("\n\rSETUP AA 0E 06 00 00 00 00 00 03 01 03 00 8F 19 \n\r"); |
JCON | 0:1593910d3520 | 190 | stx3(); |
JCON | 0:1593910d3520 | 191 | Thread::wait(10); // SETUP |
JCON | 0:1593910d3520 | 192 | device.putc(0XAA); |
JCON | 0:1593910d3520 | 193 | device.putc(0X0E); |
JCON | 0:1593910d3520 | 194 | device.putc(0X06); |
JCON | 0:1593910d3520 | 195 | device.putc(0X00); |
JCON | 0:1593910d3520 | 196 | device.putc(0X00); |
JCON | 0:1593910d3520 | 197 | device.putc(0X00); |
JCON | 0:1593910d3520 | 198 | device.putc(0X00); |
JCON | 0:1593910d3520 | 199 | device.putc(0X00); |
JCON | 0:1593910d3520 | 200 | device.putc(0X03); |
JCON | 0:1593910d3520 | 201 | device.putc(0X01); |
JCON | 0:1593910d3520 | 202 | device.putc(0X03); |
JCON | 0:1593910d3520 | 203 | device.putc(0X00); |
JCON | 0:1593910d3520 | 204 | device.putc(0X8F); |
JCON | 0:1593910d3520 | 205 | device.putc(0X19); |
JCON | 0:1593910d3520 | 206 | Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones |
JCON | 0:1593910d3520 | 207 | //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión |
JCON | 0:1593910d3520 | 208 | RTS=1; |
JCON | 0:1593910d3520 | 209 | Thread::wait(150); |
JCON | 0:1593910d3520 | 210 | pc.printf("\n\rCTS: %d\n\r",CTS.read()); |
JCON | 0:1593910d3520 | 211 | flag=1; |
JCON | 0:1593910d3520 | 212 | } |
JCON | 0:1593910d3520 | 213 | break; |
JCON | 0:1593910d3520 | 214 | |
JCON | 0:1593910d3520 | 215 | case '4': |
JCON | 0:1593910d3520 | 216 | { |
JCON | 0:1593910d3520 | 217 | led4=!led4; |
JCON | 0:1593910d3520 | 218 | pc.printf("\n\r Send Data AA 07 00 FF FF 82 CE \n\r"); |
JCON | 0:1593910d3520 | 219 | stx3(); |
JCON | 0:1593910d3520 | 220 | Thread::wait(10); // Query SETUP |
JCON | 0:1593910d3520 | 221 | device.putc(0XAA); |
JCON | 0:1593910d3520 | 222 | device.putc(0X07); |
JCON | 0:1593910d3520 | 223 | device.putc(0X00); |
JCON | 0:1593910d3520 | 224 | device.putc(0XFF); |
JCON | 0:1593910d3520 | 225 | device.putc(0XFF); |
JCON | 0:1593910d3520 | 226 | device.putc(0X82); |
JCON | 0:1593910d3520 | 227 | device.putc(0XCE); |
JCON | 0:1593910d3520 | 228 | Thread::wait(10); // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones |
JCON | 0:1593910d3520 | 229 | //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión |
JCON | 0:1593910d3520 | 230 | RTS=1; |
JCON | 0:1593910d3520 | 231 | Thread::wait(150); |
JCON | 0:1593910d3520 | 232 | pc.printf("\n\rCTS: %d\n\r",CTS.read()); |
JCON | 0:1593910d3520 | 233 | flag=1; |
JCON | 0:1593910d3520 | 234 | } |
JCON | 0:1593910d3520 | 235 | break; |
JCON | 0:1593910d3520 | 236 | |
JCON | 0:1593910d3520 | 237 | } |
JCON | 0:1593910d3520 | 238 | } |
JCON | 0:1593910d3520 | 239 | } |
JCON | 0:1593910d3520 | 240 | |
JCON | 0:1593910d3520 | 241 | void waitCTS() |
JCON | 0:1593910d3520 | 242 | { |
JCON | 0:1593910d3520 | 243 | Thread::wait(200); // Se da un tiempo para que el analizador se estabilice |
JCON | 0:1593910d3520 | 244 | incomingByte=0; |
JCON | 0:1593910d3520 | 245 | //pc.printf("El valor de CTS es %d\n\r",CTS.read()); // Se lee el valor de la variable CTS, la cual debe ser 1 |
JCON | 0:1593910d3520 | 246 | //pc.printf("El valor de RTS es %d\n\r",RTS.read()); // Se lee el valor de la variable RTS, la cual debe ser 1 |
JCON | 0:1593910d3520 | 247 | RTS=0; // Se manda un pulso en bajo en RTS, para inicial el proceso de transmisión |
JCON | 0:1593910d3520 | 248 | |
JCON | 0:1593910d3520 | 249 | while(flag==1) |
JCON | 0:1593910d3520 | 250 | {// Flag inicialmente vale 1, así que el ciclo while cambiará hasta que esa condición no se cumpla |
JCON | 0:1593910d3520 | 251 | flag=CTS.read(); // Cuando entra el ciclo, se iguala flag a CTS, el cual cuando cambie a 0 provocará que termine el while (máx 125 ms) |
JCON | 0:1593910d3520 | 252 | //pc.printf("El valor de flag es %d\n\r", flag); // Se imprime el valor de flag, para identificar cuando termina el ciclo while |
JCON | 0:1593910d3520 | 253 | } |
JCON | 0:1593910d3520 | 254 | } |
JCON | 0:1593910d3520 | 255 | |
JCON | 0:1593910d3520 | 256 | void sendData() |
JCON | 0:1593910d3520 | 257 | { |
JCON | 0:1593910d3520 | 258 | led4=!led4; |
JCON | 0:1593910d3520 | 259 | waitCTS(); |
JCON | 0:1593910d3520 | 260 | Thread::wait(10); |
JCON | 0:1593910d3520 | 261 | |
JCON | 0:1593910d3520 | 262 | } |
JCON | 0:1593910d3520 | 263 |